[프로그래머스] 삼각 달팽이 (Python)
문제 출처: 프로그래머스
문제 설명
🔎정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
달팽이가 삼각형을 그리면서 한칸씩 이동할 때 발자취를 남기는 문제다.
해당 문제는 어떤 특별한 자료구조를 사용하기 보다 어떻게 구현할 것이냐가 중요한 문제였다.
처음에는 새로운 삼각형 시작의 상관성을 찾아서 문제를 쉽게 해볼려고 노력했었다. (ex. n=4일 때, 다음 삼각형은 10에서 시작, n=5일 때는 13일 때 시작..)
하지만 늘 그렇듯 이렇게 생각하는게 오히려 더 복잡하게 돌아가는 방법이었고, 그냥 단순무식하게 코딩을 하는게 더 빠르게 답을 도출할 것 같다 생각이 들었고, 실제로 그랬다.
<정답 코드>
def solution(n):
answer = [[0]*i for i in range(1, n+1)]
dx = 0
x, y = 0, 0
cur = 1
while n:
if dx == 0:
for i in range(n):
answer[x][y] = cur
cur += 1
x += 1
x, y = x-1, y+1
dx = 1
elif dx == 1:
for i in range(n):
answer[x][y] = cur
cur += 1
y += 1
y -= 1
dx = 2
else:
for i in range(n):
x, y = x-1, y-1
answer[x][y] = cur
cur += 1
x += 1
dx = 0
n -= 1
ans = []
for i in answer:
ans.extend(i)
return ans
결과적으로 코드가 아주 너저분하게 됐지만, 통과는 하였다.
접근 방법은 아래와 같다.
1. 피라미드 형식의 2차원 리스트를 생성한다.
2. 달팽이의 진행 방향을 결정하는 dx와 칸을 이동할 때 마다 증가하는 cur 변수를 통해 기록을 진행한다.
3. 달팽이가 한 방향으로 진행할 때 마다 전진 횟수가 줄어드는데 이는 n을 통해 기록한다.
4. 달팽이를 진행시키면서 기록한다.
5. 결과로 나온 2차원 리스트를 1차원 형식으로 변경한다.
달팽이는 사진처럼 이동한다.
dx = 0일 때 좌하향, dx = 1일 때 우향, dx = 2일 때 좌상향한다.
한 방향으로 진행이 끝나면 다음 방향으로 진행 횟수가 1 감소한다. (최초 진행횟수는 피라미드의 높이인 n과 같다.)
for문을 통해 해당 사항을 구현하면 최후의 좌표가 도착해야할 좌표보다 1 커지기 때문에 해당 진행 방향으로 1 감소시켜주는게 중요하다.
코딩 테스트는 참 컨디션에 영향을 많이 받는 것 같다. 어떤 날은 복잡한 문제가 더 잘 풀리고, 어떤 날은 간단한 문제가 잘 풀리고.. 기복이 없이 조절하는 것이 앞으로의 과제인 것 같다.