출처: 프로그래머스 코딩 테스트 연습, [프로그래머스] n^2 배열 자르기
list.append() # 뒤에 원소를 추가
list.extend() # 뒤에 리스트를 이어붙임
n의 범위가 1 ≤ n ≤ 10^7
와 같이 엄청 크기 때문에 2차원 배열에 담아내는 것이 불가능해보여 각 행의 규칙을 찾아 한 행을 구하여 이어붙였다. 행의 규칙은 n번째 행에는 n이 n번 등장하고 이후는 n+1, n+2 ... m 과 같이 초기화 된다.
1. 시작 행과 끝 행을 구한다.
2. n번째 행의 1차원 배열을 규칙에 따라 만든다.
3. 시작 행과 끝 행이 같은 경우는 처리해준다.
4. 시작 행도 아니고 끝 행도 아닌 경우는 모든 행의 원소를 answer
에 추가해준다.
def solution(n, left, right):
left, right = int(left), int(right) # int()로 감싸주지 않으면 런타임 에러가 발생한다!!
startX, startY = left % n, left // n
endX, endY = right % n, right // n
answer = []
for i in range(startY + 1, endY + 2):
line = [k + 1 for k in range(n)]
for j in range(i):
line[j] = i
if startY == endY:
answer.extend(line[startX:endX+1])
elif i == startY + 1:
answer.extend(line[startX:])
elif i == endY + 1:
answer.extend(line[:endX+1])
else:
answer.extend(line)
return answer
나는 각 행의 규칙을 찾았지만 다른 사람들은 각 원소의 규칙을 찾아 보다 쉽고 빠르게 풀었다. 종이에 문제의 규칙을 적어보면서 규칙을 찾는 것이 그냥 메모장에 끄적이며 푸는 것보다 빠를 것 같다. 적으면서 문제 푸는 것을 귀찮아 하지 말자