본문 바로가기

Python

프로그래머스 - 삼각 달팽이

문제

https://school.programmers.co.kr/learn/courses/30/lessons/68645

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

해설

 

삼각형이라는 구조를 생각해보고 그림을 유심히 보면, n=5 일 때, 1번에서 아래 방향으로 순차적으로 [1,2,3,4,5]까지 채우고 방향을 오른쪽으로 바꿔서 [6,7,8,9] 채우고 방향을 바꿔서 [10,11,12] 채우고 다시 방향 바꿔서 [13,14] 채우고 방향 바꿔서 [15]채운다.

 

즉, n = 5일 때 [1,2,3,4,5], [6,7,8,9], [10,11,12], [13,14], [15] 이렇게 요소의 갯수를 (n - 회차)로 정하고 방향을 바꿔가며 배열에 넣어주고 있다.

주어진 수 n 만큼 회차를 진행할 것이고 각 회차별 요소의 갯수는 n-회차로 나타낼 수 있다.

삼각형이므로 방향은 하, 우, 좌 총 3가지이다. 이는 회차를 3으로 나눈 나머지값으로 체크할 수 있다.

 

그리고 마지막으로 각 배열을 하나의 배열로 합쳐주기 위해 sum(중첩된 배열, []) 메서드를 사용한다.

def solution(n):
    answer = [[0 for _ in range(i+1)] for i in range(n)]
    
    x, y = -1, 0
    num = 1
    
    for i in range(n): # 현재 회차의 방향 설정
      for _ in range(i, n): # 좌표 구하기
        if i % 3 == 0: # 하
          x += 1
        elif i % 3 == 1: # 우
          y += 1
        else:
          x -= 1
          y -= 1
        answer[x][y] = num
        num += 1
        
    return sum(answer,[])

 

우선 각 행과 행이 포함할 수 있는 요소의 갯수에 맞게 배열을 설정해준다.

 

  • 처음 방향은 아래로 향해야하므로, 초기 x 좌표를 -1로 설정해준다.
  • i는 현재회차를 의미한다. i가 0일 때, 현재 회차의 반복횟수는 n - i이므로 중첩반복문의 횟수를 for _ in range(i, n)으로 설정한다.
  • 현재회차의 방향을 설정해주기 위해 3으로 나눈 나머지가 0인 경우 가장 첫번째로 시작할 방향인 '아래' 방향, 나머지가 1인 경우 두번째로 진행할 방향인 '우', 위 경우에 해당하지 않는 경우는 '상'의 방향으로 설정한다.
  • 이 때, '상' 방향으로 진행할 때는 x, y 좌표 모두 1씩 이동해야하는 것을 주의하자.