programmers/level2

[프로그래머스] 삼각 달팽이 (Python)

riley_dev 2021. 1. 5. 18:57

프로그래머스 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