유형 : 그리디? 구현?
풀이 시간 : 25-30분, 스스로 해결
1. 기본 구현
def solution(n, m, section):
answer = 0
for i in range(1, n+1):
if i in section:
answer += 1
for j in range(i, i+m):
if j in section and j < n+1:
del section(section.index(j))
return answer
일단 위 풀이에서는 시간 초과가 났다. (50/100)
시간 초과를 해결하기 위해서.. 코드를 수정해 보자.
2. dictionary를 사용해봤는데 이 문제는 이렇게 푸는 게 아닌 것 같다.
def solution(n, m, section):
answer = 0
section_dict = dict([[section[i], i] for i in range(len(section))])
for i in range(1, n+1):
if i in section:
answer += 1
for j in range(i, i+m):
if j in section and j < n+1:
idx = section_dict[j]
del section[idx]
section_dict = dict([[section[i], i] for i in range(len(section))])
return answer
이중 루프가 역시 문제인걸까.. 다시 해보자.
3. for문에서 건너뛰기를 사용해보았다.
def solution(n, m, section):
answer = 0
next = 1
for i in range(1, n+1, next):
if i in section:
answer += 1
next = 1
for j in range(i, i+m):
next += 1
if j in section and j < n+1:
del section[section.index(j)]
return answer
마찬가지로 50/100...
4. 이중 루프가 문제인 것 같아, n이나 m에 루프를 걸지 말고 section을 제거하는 것을 중심으로 하는 코드를 짰다.
def solution(n, m, section):
answer = 0
next = 1
while section:
answer += 1
start = section.pop(0)
limit = start + m
while start < limit and section:
if section[0] >= limit:
break
start = section.pop(0)
return answer
1. section이 존재한다면 : 일단 칠을 한 번 하므로 answer += 1
1) 먼저 pop() 을 통해 첫 번째 원소를 지정
2) limit 설정 (한 번 칠하는 범위)
3) section의 원소를 순회, 종료 조건은 1) 범위를 벗어나거나 2) section이 비거나 (= 끝)
- 이 때, section[0] 즉 이번에 pop 될 첫 번째 원소가 limit과 같거나 크다면, break로 종료하고 pop을 하지 않음.
2. 반복한다.
이중 루프는 시간 제한에 걸릴 확률이 높으므로 사용에 유의해야 할 것 같다.
그래도 이번 문제는 스스로 해결해서 굳
'프로그래머스 > Lv. 1' 카테고리의 다른 글
19. 문자열 내 p와 y의 개수 (1) | 2024.07.12 |
---|---|
18. 두 정수 사이의 합 (0) | 2024.07.12 |
16. 문자열 나누기 (0) | 2024.07.12 |
15. 하노이 탑 ★ (0) | 2024.07.12 |
14. 바탕화면 정리 (0) | 2024.07.12 |