[문제]
https://school.programmers.co.kr/learn/courses/30/lessons/87390
[풀이] 정확성문제]
https://school.programmers.co.kr/learn/courses/30/lessons/87390
[풀이] 정확성
1. 1부터 n 까지 i 를 뽑아 행을 하나씩 만들어가는데 i 행의 경우 i 로 i 번까지 채우고 그 다음부터 1씩 늘려서 채워야함
2. while 문과 for 문으로 이를 구현하고 만들어진 배열에 left와 right로 인덱싱해서 반환한다
3. 시간복잡도 n^2 으로 오답처리된다.
def solution(n, left, right):
answer = []
for i in range(1, n+1):
k = i
while k > 0:
k -= 1
answer.append(i)
for j in range(i+1, n+1):
answer.append(j)
return answer[left:right+1]
[풀이] 효율성
n = 5일 때, 배열을 1차원으로 펼쳐보자.
[1, 2, 3, 4, 5, 2, 2, 3, 4, 5, 3, 3, 3, 4, 5, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5]
이를 5개씩 끊고 인덱스와 함께 살펴보자
1, 2, 3, 4, 5 / 2, 2, 3, 4, 5 / 3, 3, 3, 4, 5
0, 1, 2, 3, 4 / 5, 6, 7, 8, 9 / 10, 11, 12, 13, 14
그러면 어떤 규칙을 찾을 수 있는데 각 파트마다 몫으로 구분되고 그 안의 요소는 나머지로 구분된다는 것이다.
즉, 인덱스로 해당 배열에 접근할 때 인덱스를 n으로 나눈 몫과 나머지로 해당 배열의 요소가 결정된다는 것이다.
기본적으로 요소는 (나머지 + 1)로 결정되고, 몫에 따라 요소의 최소값이 결정된다
left와 right를 사이를 돌면서 각 인덱스별로 요소를 계산해 리턴한다.
def solution(n, left, right):
answer = []
for position in range(left, right+1):
x, y = divmod(position, n)
answer.append(max((y + 1), (x + 1)))
return answer
'코딩 테스트 > Python' 카테고리의 다른 글
86. H-Index (0) | 2025.01.11 |
---|---|
85. 연속 부분 수열 합의 개수 (1) | 2025.01.08 |
83. 귤고르기 (0) | 2025.01.06 |
82. 멀리 뛰기 (1) | 2025.01.05 |
신고 결과 받기 (0) | 2025.01.02 |