출처: Programmers > 월간 코드 챌린지 시즌1 > 삼각 달팽이
문제 설명:
정수 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
- 문제 예시와 같습니다.
코드:
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 코드:
itertools
의chian
을 활용한 모습이다- 처음 보는 모듈이라 가져와봤다
모듈이름 실화인가;
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
을 만드는 역할로 사용되었고, 나머진 비슷한것 같다 - 나름..패턴 발견하고 신났는데 생각보다 별거 아니였나보다..ㅎ다들 이렇게 구현하셨구나..