반응형
쉬운 문제인데 집중력이 약해서 그런지 딴짓하느라 못풀었다.
어려운건 각 조건이 만족할때 방향을 바꿔야 하는데 그부분이 어려웠다.
처음에 떠올린건
- 더이상 아래방향으로 못내려갈때까지 내려간다. 그 후 왼쪽으로
- 더이상 왼쪽방향으로 못갈때까지 움직인다. 그후 대각선 위로
- 대각선 위로 움직인다. 움직일 방향에 숫자가 있다면 아래로
- 1-2-3을 반복한다. 아래, 왼쪽, 대각선 위가 숫자로 차있다면 멈춘다.
문제는 4번 과정에서 아래, 왼쪽, 대각선을 검사할때 index error(out of bound)가 발생했다는 점이다.
그래서 row+1, column+1 이 n을 넘지 않을때로 제한하는 로직을 추가했다.
n ≥3 일때 잘 돌아갔지만 n ≤ 2 일때 돌아가지 않는 문제가 발생했다.
4번 로직을 지우고 새로운 로직을 만들었는데
- 마지막 숫자면 그만둔다.
마지막 숫자는 어떻게 구할것인가. 문제 그림을 정사각형의 행렬에 써보면 알 수 있다.
위 로직에서 1-2-3을 반복하면서 채워지는 숫자가 마지막 숫자라면 멈추면 되는 것이다!
유레카~
코드는
def solution(n):
answer = []
# 빈 행렬 만들기
num_matrix = []
num = 0
for i in range(n):
num_list = []
for j in range(n):
num_list.append(0)
num_matrix.append(num_list)
# 규칙에 따라 숫자 채우기
max_num = n*n - sum([i for i in range(n)])
num = 1
row, column = 0,0
direction = "down"
while True:
if row < n and column < n:
num_matrix[row][column] = num
if num == max_num:
break
num+=1
if direction == "down":
row += 1
if row == n or num_matrix[row][column] != 0:
direction = "left"
row-=1
column += 1
elif direction == "left":
column += 1
if column == n or num_matrix[row][column] != 0:
direction = "diagonal"
column-=2
row-=1
elif direction == "diagonal":
row += -1
column += -1
if num_matrix[row][column] != 0:
direction = "down"
row += 2
column += 1
else:
break
for i in range(n):
for j in range(n):
if num_matrix[i][j] != 0:
answer.append(num_matrix[i][j])
return answer
문제링크는
https://programmers.co.kr/learn/courses/30/lessons/68645
반응형
'algorithm > programmers' 카테고리의 다른 글
주식 가격 [프로그래머스] (0) | 2021.11.17 |
---|---|
문자열 압축 [프로그래머스] (0) | 2021.11.14 |
n^2 배열 자르기 [프로그래머스] (0) | 2021.10.30 |
전력망을 둘로 나누기 [프로그래머스] (0) | 2021.10.09 |
예상 대진표 [프로그래머스] (0) | 2021.09.23 |
댓글