링크: https://school.programmers.co.kr/learn/courses/30/lessons/87390
정수 n
, left
, right
가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
n
행 n
열 크기의 비어있는 2차원 배열을 만듭니다.i = 1, 2, 3, ..., n
에 대해서, 다음 과정을 반복합니다.i
행 i
열까지의 영역 내의 모든 빈 칸을 숫자 i
로 채웁니다.n
행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.arr
이라 할 때, arr[left]
, arr[left+1]
, ..., arr[right]
만 남기고 나머지는 지웁니다.정수 n
, left
, right
가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.
n
≤ 10 7left
≤ right
< n 2right
- left
< 10 5n | left | right | result |
---|---|---|---|
3 | 2 | 5 | [3,2,2,3] |
4 | 7 | 14 | [4,3,3,3,4,4,4,4] |
입출력 예 #1
입출력 예 #2
문제 이해하기:
목표: 정수 n
, left
, right
가 매개변수로 주어질 때 주어진 과정대로 만들어진 1차원 배열을 return
내 풀이:
n 이 3일때랑 4일때 각 행별로 어떤 리스트가 만들어지는지 확인해봤다.
n = 3
:
n = 4
:
규칙을 보면 각 행의 첫 번째 숫자가 각 행만큼 반복되고 나머지 숫자들은 순서대로 자리해 있는것을 확인할 수 있었다.
첫 번째 풀이 코드:
def solution(n, left, right):
answer = []
for i in range(1, n+1): # 각 행의 번호를 결정
for j in range(i, n+1): # 각 행의 숫자가 반복되는 부분을 결정
if j == i: # 첫 번째 숫자에 대해 해당 숫자만큼 반복하여 answer에 추가하기
for k in range(j):
answer.append(i)
if j != i: # 나머지 숫자들은 그대로 answer에 추가
answer.append(j)
return answer[left:right+1] # left부터 right까지 return
두 번째 풀이:
그러면 이번에는 리스트를 모두 만들지 말고, 필요한 구간의 값만 계산해보자.
n = 3, left = 2, right = 5:
n = 4, left = 7, right = 14:
규칙을 보면 arr[i][j] 에서 left 와 right 각각 n 으로 나눈 몫과 나머지가 i, j 가 되고 있었다.
그럼 이제 필요한 구간의 인덱스는 알아내어, 1차원 배열의 특정 인덱스에 해당하는 2차원 배열의 값을 구할 수 있게 됐다. 그러면 이제 구간에 대해 반복문을 돌면서 값을 리스트에 집어넣어야 하는데, 그 값은 어떻게 구할 수 있을까? 이 또한 예시를 통해 알아보자.
n = 3, left = 2, right = 5:
잘 살펴보면 i 와 j 에 각각 1씩 더 해서 둘 중 더 큰 수가 해당 인덱스의 값이 되는 규칙성을 갖는것을 알 수 있다.
def solution(n, left, right):
answer = []
# left ~ right까지 반복문을 돌면서
for i in range(left, right+1):
row, col = divmod(i, n) # i 를 n 으로 나눈 몫과 나머지를 각각 행과 열 변수에 저장하고
answer.append(max(row+1, col+1)) # 행과 열에 1 씩 더한 값중 더 큰 수를 answer에 저장
return answer