프로그래머스 level2
[월간 코드 챌린지 시즌1] 삼각 달팽이
문제 🔗
programmers.co.kr/learn/courses/30/lessons/68645
코딩테스트 연습 - 삼각 달팽이
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]
programmers.co.kr
이번문제는 문제를 처음 읽었을때 좀 막막했다.... 바로 검색해볼까 싶었지만, (친구의 응원을 받고) 조금 고민해보니 규칙이 보였다.
처음에 찾은 규칙으로 코드를 짜고 통과를 했지만, 코드가 너무 길어서 다른사람들의 풀이를 찾아보기로 했다.
다른사람들의 풀이를 참고해서 풀이를 두세번 더 수정하니 코드가 훨씬 깔끔해지고 가독성도 좋아졌다.
알고리즘 (처음 풀이)
1. (n=4 일 경우) temp가 10이 될 때 까지 while을 실행한다.
2. i가 n보다 작고 tri[i][j]가 0인 동안 while을 실행하며 tri[i][j]에 temp를 넣는다. (아래로)
3. 옆으로, 위로 가는 방향 모두 while을 돌면서 temp를 넣는다.
Python code (처음 풀이, 코드가 너무 직관적이고 가독성 떨어짐)
def solution(n):
answer = []
tri=[]
for i in range(1,n+1):
tri.append([0]*i)
i,j=-1,0
temp=1
while temp<=sum(range(1,n+1)):
i+=1
while i<len(tri) and tri[i][j]==0:
tri[i][j]=temp
i+=1
temp+=1
i-=1
j+=1
while j<len(tri[i]) and tri[i][j]==0:
tri[i][j]=temp
j+=1
temp+=1
i-=1
j-=2
while tri[i][j]==0:
tri[i][j]=temp
i-=1
j-=1
temp+=1
i+=1
j+=1
for t in tri:
for ans in t:
answer.append(ans)
return answer
구글 검색 풀이
1. i는 0부터 n까지, j는 i부터 n까지 이중 반복문을 돌린다.
2. i%3이 0인 경우는 아래로 내려가는 구간이므로 x에 1을 더한다
3. i%3이 1인 경우는 오른쪽으로 가는 구간이므로 y에 1을 더한다
4. i%3이 2인 경우는 위로 올라가는 구간이므로 x와 y모두 1씩 뺀다
Python code
def solution(n):
answer=[]
tri=[[0]*i for i in range(1,n+1)]
x,y=-1,0
num=1
for i in range(n):
for j in range(i,n):
if i%3==0: #down
x+=1
if i%3==1: #right
y+=1
if i%3==2: #up
x-=1
y-=1
tri[x][y]=num
num+=1
for tr in tri:
for t in tr:
answer.append(t)
return answer
마지막으로 같이 스터디하는 친구의 코드를 보고 가독성이 더 좋은 방법으로 코드를 수정하였다.
down, right, up일 때 x와 y의 변동값을 dictionary에 넣고 i%3의 결과에 따라 down, right, up만 변경하여 x,y값이 변경되도록 하였다.
출처 : (링크 추가 예정)
Python code
def solution(n):
answer=[]
tri=[[0]*i for i in range(1,n+1)]
direction={"down":[1,0], "right":[0,1], "up":[-1,-1]}
x,y=-1,0
num=1
for i in range(n):
for j in range(i,n):
if i%3==0:
dire="down"
if i%3==1:
dire="right"
if i%3==2:
dire="up"
x+=direction[dire][0]
y+=direction[dire][1]
tri[x][y]=num
num+=1
for tr in tri:
for t in tr:
answer.append(t)
return answer
'programmers > level2' 카테고리의 다른 글
[프로그래머스] 이진 변환 반복하기 (Python) (0) | 2021.01.07 |
---|---|
[프로그래머스] 쿼드압축 후 개수 세기 (Python) (0) | 2021.01.06 |
[프로그래머스] 타겟 넘버 (Python) (0) | 2021.01.04 |
[프로그래머스] 더 맵게 (Python) (0) | 2020.12.31 |
[프로그래머스] 위장 (Python) (0) | 2020.12.30 |