https://school.programmers.co.kr/learn/courses/30/lessons/68645
1. 해결방법
이 문제에 대한 아이디어가 40% 정도밖에 떠오르지 않아 결국 포기한 문제이다.
수학적으로 접근해서 아이디어를 생각해내 해결해야 하는 구현 문제이다.
n = 4일 경우에는 [1, 2, 3, 4], [5, 6, 7], [8, 9], [10] 순서대로 배열에 값이 들어가는 것을 확인할 수 있다.
각 순서의 배열은 0 ~ 3 번째로 두고, 0번째의 배열에는 4개, 1번째는 3개... 이러한 부분으로 보면 "n - 회차"의 개수가 각 순서의 배열에 값이 들어간다는 것을 확인할 수 있다.
삼각형에서 위에서 아래로, 왼쪽에서 오른쪽으로, 아래에서 위로 총 세 가지의 이동 방법이 있다.
그렇기 때문에 한 가지 더 생각해 볼 수 있는 방법이 생기는데,
회차 % 3 == 0 이면 위에서 아래로,
회차 % 3 == 1 이면 왼쪽에서 오른쪽으로,
회차 % 3 == 2 이면 아래에서 위로,
로 유추할 수 있다.
하지만 알고리즘을 해결하는데 있어서 삼각형의 이차원 배열을 처리하기엔 복잡하다. 그래서 우리는 정사각형으로 먼저 만들고 위의 수학적인 로직을 보면서 해결하면 된다.
당연히 2차원 배열을 만들기 전에 모든 값을 '0'으로 초기화를 하고, 위 수학적 논리 과정을 통해서 2차원 배열의 인덱스 값을 갱신하면 된다.
2. 정답코드
def solution(n):
answer = []
maps = [[0] * (n) for _ in range(n)]
y, x = -1, 0
num = 1
# 방향 체크
for i in range(n):
for _ in range(i, n):
# 위에서 아래로
if i % 3 == 0:
y += 1
# 왼쪽에서 오른쪽으로
elif i % 3 == 1:
x += 1
# 아래에서 위로
else:
y -= 1
x -= 1
# maps에 값 갱신
maps[y][x] = num
num += 1
for arr in maps:
for num in arr:
if num != 0:
answer.append(num)
return answer
[참고]
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.2 줄 서는 방법 (1) | 2022.10.11 |
---|---|
[프로그래머스] Lv.2 배달 (0) | 2022.10.11 |
[프로그래머스] Lv.2 쿼드압축 후 개수 세기 (0) | 2022.10.08 |
[프로그래머스] Lv.2 소수 찾기 (1) | 2022.10.03 |
[프로그래머스] Lv.2 2개 이하로 다른 비트 (0) | 2022.09.30 |