프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.
문제
https://school.programmers.co.kr/learn/courses/30/lessons/87390
[나의 풀이]
⌛ 시간초과 (55/100 점)
def solution(n, left, right):
from collections import deque
arr = deque([])
can_stop = False
for i in range(1,n+1):
for j in range(i,n+1):
if i==j:
for k in range(1,i+1):
arr.append(j)
else:
arr.append(j)
if len(arr)>=right+1:
can_stop=True
break
if can_stop:
break
answer = list(arr)[left:right+1]
return answer
규칙을 가진 2차원 배열에서 특정값들을 추출하는 문제입니다. 수의 패턴을 파악하는 것이 핵심인 문제였습니다. 2차원 배열을 구현하기 위해 위와 같이 2중 for문을 사용한 뒤 right갯수만큼 카운트 되었을 때 종료하여 값을 추출하는 방식으로 구현에는 성공하였지만 절반 정도의 케이스에서 시간 초과가 나 다른 풀이를 참고하였습니다.🐆🐆🐆
[다른사람의 풀이1]
def solution(n, left, right):
answer = []
for i in range(left, right + 1):
answer.append(max(i // n, i % n) + 1)
return answer
예상과 다르게 하나의 for문으로 해결한 풀이였습니다. 문제에서 입력되는 n만큼 2차원 배열이 생성되고 이에 따라 조건에 맞는(left,right) 특정값들이 결정되므로 n과 left,right 간의 수식을 구하여 해결할 수 있는 문제였습니다.
left ~ right 사이값들에서 n으로 나눴을 때의 몫과 나머지 중 큰 값이 답을 구해내는 수식이였습니다.🐺🐺🐺
[다른사람의 풀이2]
def solution(n, left, right):
return [max(divmod(i,n))+1 for i in range(left,right+1)]
같은 원리로 구현한 풀이이되 몫과 나머지를 구하기 위해 간단히 divmod()를 적용한 방식이였습니다.
감사합니다.