Home [lvl2]삼각 달팽이
Post
Cancel

[lvl2]삼각 달팽이

출처: Programmers > 월간 코드 챌린지 시즌1 > 삼각 달팽이

문제 설명:

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

examples.png


제한사항

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

입출력 예

nresult
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

  • 문제 예시와 같습니다.

코드:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def solution(n):
    graph = []
    for i in range(1, n+1):
        graph.append([0]*i)
    
    dir = [(1, 0), (0, 1), (-1, -1)]
    x, y, num = -1, 0, 1
    for i in range(n):
        for j in range(i, n):
            dir_x, dir_y = dir[i%3]
            x += dir_x
            y += dir_y
            graph[x][y] = num
            num+=1
    answer = [x for y in graph for x in y]
    return answer

코드 설명:

  • 처음엔 num = n(n+1)/2 로 잡고 포문과 if문을 사용해 시도해보았으나, 코드가 복잡해지는 것을 보고 다른 방식을 찾아보았다
  • 문제를 더 들여다 본 결과 삼각형의 각 변이 왼쪽변: n개, 밑변: n-1개, 오른쪽변: n-2 … 패턴을 발견하였고, 이를 사용하면 코드를 훨씬 간결하게 할 수 있겠다는 생각을 했다
  • dir 의 아이디어는 예전에 들었던 프로그래머스 강의에서 달팽이의 움직임을 방향의 패턴을 미리 정의해 둔 뒤 사용하는 방식이 생각나 구현해 보았다
    • dir의 각 튜플의 의미는 아래 대각선 방향, 오른쪽 방향, 왼쪽 위 대각선 방향 세가지로 구성했고 각각 상황에 따라 구현하고자 하니 리스트에 모든 방향을 넣고, i%3을 하면 원하는 방향을 뽑아서 쓸 수 있었다
    • x, y, num은 내 코드에 맞게 -1, 0, 1으로 초기화해줬다

우수답변자 코드:

  • 나와 비슷한 방식으로 풀었으나, while문으로 구현되어있다
  • 나도 처음엔 while문을 생각했으나 for문이 더 익숙해 for문으로 작성했다
  • 나는 list comprehension으로 answer으로 병합했지만 이 우수답변자는 sum(b, [])을 사용했다. 솔직히 이런 방법이 있는줄 몰랐다
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    def solution(n):
      dx=[0,1,-1];dy=[1,0,-1]
      b=[[0]*i for i in range(1,n+1)]
      x,y=0,0;num=1;d=0
      while num<=(n+1)*n//2:
          b[y][x]=num
          ny=y+dy[d];nx=x+dx[d];num+=1
          if 0<=ny<n and 0<=nx<=ny and b[ny][nx]==0:y,x=ny,nx
          else:d=(d+1)%3;y+=dy[d];x+=dx[d]
      return sum(b,[])
    

우수답변자2 코드:

  • itertoolschian을 활용한 모습이다
    • 처음 보는 모듈이라 가져와봤다

모듈이름 실화인가;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from itertools import chain as SEX
def solution(n):
    [row, col, cnt] = [-1, 0, 1]
    board = [[None] * i for i in range(1, n+1)]
    for i in range(n):
        for _ in range(n-i):
            if i % 3 == 0:
                row += 1
            elif i % 3 == 1:
                col += 1
            else:
                row -= 1
                col -= 1
            board[row][col] = cnt
            cnt += 1
    return list(SEX(*board))

피드백:

  • 내가 쓴 list comprehension, 우수답변자1의 sum 그리고 여기서 사용된itertools.chain 모두 answer을 만드는 역할로 사용되었고, 나머진 비슷한것 같다
  • 나름..패턴 발견하고 신났는데 생각보다 별거 아니였나보다..ㅎ다들 이렇게 구현하셨구나..
This post is licensed under CC BY 4.0 by the author.

회의록 작성 어플 프로젝트

SeSAC 3주년 프로젝트