본문 바로가기

문돌이 존버/프로그래밍 스터디

(프로그래머스 연습 문제 풀이) 삼각 달팽이

반응형
문제 설명
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.

제한사항

n은 1 이상 1,000 이하입니다.

입출력 예
n                                        result
4                                 [1,2,9,3,10,8,4,5,6,7]
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]

입출력 예 설명
입출력 예 #1
문제 예시와 같습니다.

입출력 예 #2
문제 예시와 같습니다.

입출력 예 #3
문제 예시와 같습니다.
def solution(n):
    answer = []
    array = [[0] * n for _ in range(n)]
    x, y = -1, 0 # 처음엔 무조건 아래로 향하게 해야 하므로 x=-1로 초기화
    num = 1
    
    for i in range(n): # 방향 check
        for _ in range(i, n):
            if i % 3 == 0: # 아래
                x += 1
            elif i % 3 == 1: # 오른쪽
                y += 1
            elif i % 3 == 2: # 위쪽 대각선
                x -= 1
                y -= 1
            array[x][y] = num
            num += 1
    for i in array:
        for j in i:
            if j:
                answer.append(j)
    return answer

해당 문제는 수학적인 감각이 필요한 문제로 참고 코드를 봐도 한참을 이해하지 못했다. 일단, 문제 제목은 "삼각 달팽이"지만 삼각형에서 벗어나 사각형으로 생각해보자. n=4 일 때로 예를 들어본다.

위 사각형의 초기화 버전이 array 라는 변수다. 방향을 생각해보면 일단 1, 2, 3, 4 까지 1) 아래를 향한다. 그리고 4, 5, 6, 7 을 보듯이 2) 오른쪽을 향한다. 마지막으로 7, 8, 9 를 보면 3) 위쪽(엄밀히 말하면 위쪽 대각선)을 향한다. 방향은 크게 이렇게 3가지가 존재한다. 

이후 9, 10은 방향 1번이고, n=5, n=6 일 때 예시를 보면 이렇게 삼각형 모양을 이루는 방향 변화가 반복되는 것을 알 수 있다. 이 모양이 달팽이를 의미한다. 

문제에서 주어진 n번 동안 for 반복문을 돌리며 방향을 확인한다. 밑변의 길이와 높이가 n이기 때문에 반복문 안에 또 하나의 반복문을 추가한다. 숫자가 1씩 증가하면서 끝변까지 다다르면 방향 전환이 된다. range() 에서 n은 변하지 않지만 바깥쪽의 for 반복문에서 방향 전환이 될 때 i가 1씩 증가하기 때문에 각 상황에서의 "끝변"이 정해지게 된다.

이와 같은 문제는 실제 그림을 그려가며 코드를 이해하는 것이 좋다. 관건은 이런 문제가 출제되었을 때 어떻게 그려가며 풀 것인가인데... 수학적 감각을 요구하는 문제에는 힘을 못쓴다 ㅠ

728x90
반응형