본문 바로가기
algorithm/programmers

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

by hoonzii 2021. 11. 5.
반응형

쉬운 문제인데 집중력이 약해서 그런지 딴짓하느라 못풀었다.

어려운건 각 조건이 만족할때 방향을 바꿔야 하는데 그부분이 어려웠다.

처음에 떠올린건

  1. 더이상 아래방향으로 못내려갈때까지 내려간다. 그 후 왼쪽으로
  2. 더이상 왼쪽방향으로 못갈때까지 움직인다. 그후 대각선 위로
  3. 대각선 위로 움직인다. 움직일 방향에 숫자가 있다면 아래로
  4. 1-2-3을 반복한다. 아래, 왼쪽, 대각선 위가 숫자로 차있다면 멈춘다.

문제는 4번 과정에서 아래, 왼쪽, 대각선을 검사할때 index error(out of bound)가 발생했다는 점이다.

그래서 row+1, column+1 이 n을 넘지 않을때로 제한하는 로직을 추가했다.

n ≥3 일때 잘 돌아갔지만 n ≤ 2 일때 돌아가지 않는 문제가 발생했다.

4번 로직을 지우고 새로운 로직을 만들었는데

  1. 마지막 숫자면 그만둔다.

마지막 숫자는 어떻게 구할것인가. 문제 그림을 정사각형의 행렬에 써보면 알 수 있다.

위 로직에서 1-2-3을 반복하면서 채워지는 숫자가 마지막 숫자라면 멈추면 되는 것이다!

유레카~

 

코드는

def solution(n):
    answer = []
    
    # 빈 행렬 만들기
    num_matrix = []
    num = 0
    for i in range(n):
        num_list = []
        for j in range(n):
            num_list.append(0)
        num_matrix.append(num_list)

    # 규칙에 따라 숫자 채우기 
    max_num = n*n - sum([i for i in range(n)])
    num = 1
    row, column = 0,0
    direction = "down"
    while True:
        if row < n and column < n:
            num_matrix[row][column] = num
            if num == max_num:
                break
            num+=1

            if direction == "down":
                row += 1
                if row == n or num_matrix[row][column] != 0:
                    direction = "left"
                    row-=1
                    column += 1
            elif direction == "left":
                column += 1
                if column == n or num_matrix[row][column] != 0:
                    direction = "diagonal"
                    column-=2
                    row-=1
            elif direction == "diagonal":
                row += -1
                column += -1
                if num_matrix[row][column] != 0:
                    direction = "down"
                    row += 2
                    column += 1
            
        else:
            break
    
    for i in range(n):
        for j in range(n):
            if num_matrix[i][j] != 0:
                answer.append(num_matrix[i][j])
        
    return answer

 

문제링크는

https://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

 

반응형

댓글