https://programmers.co.kr/learn/courses/30/lessons/68645
코딩테스트 연습 - 삼각 달팽이
5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]
programmers.co.kr
오랜만에 알고리즘 문제이다.
수학적인 문제인데 나는 정말 어려웠다. 하하...
def solution(n):
answer = []
snail = [[0]*n for i in range(n)]
x,y = -1,0
num = 1
for i in range(n):
for j in range(i,n):
if i % 3 ==0:
x += 1
elif i % 3 == 1:
y +=1
else:
x -= 1
y -= 1
snail[x][y] = num
num+= 1
for i in range(len(snail)):
for j in range(len(snail[i])):
if snail[i][j] != 0:
answer.append(snail[i][j])
return answer
생각이 정말 안났는데 다른분 코드를 보고 참고해서 풀었다.
약간 경로? 찾는거와 비슷한 문제 같지만
우리가 이 문제를 풀때 생각해야 할 것은 인덱스의 이동 방향이다.
달팽이 껍질처럼 반시계 방향으로 들어갈 숫자를 채워 넣어주면 된다.
for i in range(n):
for j in range(i,n):
if i % 3 ==0:
x += 1
elif i % 3 == 1:
y +=1
else:
x -= 1
y -= 1
snail[x][y] = num
num+= 1
첫번째 for 문에서 n 까지 돌리는 이유는 인덱스의 방향을 결정한다 n = 4 인경우 0 1 2 3 까지 돌게 되는데 우리가 삼각형의 변이 꺾이는게 4번의 방향이 필요하다. 아래로 움직이고 오른쪽 위 아래 오른쪽 위 이런 방향으로 이동하게 된다.
두번째 for 문은 이러한 값이 돌게 되면서 변이 줄어들게 되는데 처음에는 4개의 값을 입력해야하지만 다음에는 3개 2개 1개 씩 입력을 하면 가능하기 때문이다.
그리고 x, y = -1 ,0 으로 시작하는데 -1인 이유는 x 가 0으로 시작해버리면 나중에 범위를 벗어나기 때문이다.
이걸로 설명 끝!
반응형