https://programmers.co.kr/learn/courses/30/lessons/68645
첫 시도에 풀지 못했다.
구글링한 후 이해했다고 판단이 들었을 때, 스스로 코드를 짜보았더니 다행히 혼자 풀 수 있었다.
직관적으로 생각해보면 처음 긋는 직선(좌하향 대각선)에선 n개의 원소(1,2,...,n)를 적는다. 그 다음 우측 직선은 n-1개의 원소를 적는다. 그 다음 좌상향 대각선을 그을 땐 n-2개의 원소를 적는다. 한 번 직선을 그을 때마다 적어야할 원소의 갯수가 1개씩 줄어든다. drawing_cnt
가 1개일 때까지만 반복한다.
삼각 달팽이다. 원소를 적어가는 방향이 3개다. 3을 나눈 나머지가 0,1,2으로 3개니까 이것을 활용하면 된다.
좌하향 직선, 우측 직선, 좌상향 직선이다.
문제 푸는 사람의 정의에 따라 조금 차이가 있을 수 있다.
나는 처음 그릴 때(좌하향 직선)를 나머지 0, 우측 직선일 때 나머지 1, 좌상향 직선일 때 나머지 2라고 정의했다.
정삼각형 이미지를 아래처럼 직각삼각형(좌측 정렬)으로 생각해도 문제가 없다. 그러면 좌표가 좀더 쉽게 이해될 것이다.
원소를 담을 2차원 리스트를 처음에 정의했다.
좌측 아래로 내려갈 땐 x+=1
을 해줘야한다. 2차원 리스트 내에서 다음 리스트로 넘어가야 하기 때문이다.
오른쪽으로 갈 땐 y+=1
이다. list in list 내에서 다음 원소로 이동해야 한다.
좌측 위로 올라갈 땐 x-=1, y-=1
이다. 앞의 리스트로, 앞의 원소로 이동해야 하기 때문이다.
def calc_axis(drawing_line, x, y):
# 아래로 내려가는 경우 (x+=1)
if drawing_line % 3== 0:
x+=1
# 오른쪽으로 한 칸씩 가는 경우(y+=1)
elif drawing_line % 3== 1:
y+=1
# 위로 가는 경우(x-=1, y-=1)
else:
x-=1; y-=1
return x,y
def solution(n):
answer = [[0]*(i+1) for i in range(n)]
adding_num = 0
# 한줄 쫙 긋는 경우 n개로 시작
# 그 다음 n-1개, 그 다음 n-2개 .... 1개까지
drawing_cnt = n
# 줄 그은 갯수 drawing_line
# 나머지 0: 내려간다
# 나머지 1: 오르쪽으로 간다
# 나머지 2: 위로 올라간다.
drawing_line = 0
x,y = -1, 0
while drawing_cnt >=1:
for i in range(drawing_cnt):
adding_num +=1
x, y = calc_axis(drawing_line, x, y)
answer[x][y] = adding_num
drawing_line +=1
drawing_cnt -=1
result = []
for a in answer:
result+=a
return result