본문 바로가기
Study☆/Computer Science

프로그래머스 - 삼각달팽이(Level 2)

by JJORIO 2020. 11. 2.
728x90
반응형

프로그래머스 - 삼각달팽이(Level 2)

 

문제 설명

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


제한사항

  • 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

  • 문제 예시와 같습니다.

 


 

 

문제풀이

어려워보일 수 있지만 그냥 직관적으로 달팽이 모양으로 배열을 그려가면 해결 할 수 있는 문제이다.

가장 먼저 달팽이를 그려줄 2차원 배열을 생성한 다음 0으로 초기화를 해주고 0인 칸들만 순서대로 채워나가면 될 것이다.

 

 

def solution(n): 
    answer = [] 
     
    map = [[0 for col in range(n)] for row in range(n)]  // 값을 저장할 배열 생성
    map[0][0] = 1 
    num_sum = 0 
     
    for x in range(1, n + 1): 
        num_sum = num_sum + x  
     
    x_cursor = 0 
    y_cursor = 0 
    num = 2 
     
    while True:  // 바깥쪽 삼각형부터 그려나감
        while True:  // 왼쪽변에 대한 반복문
            if y_cursor + 1 >= n or map[y_cursor + 1][x_cursor] != 0: 
                break;     
            map[y_cursor + 1][x_cursor] = num 
            y_cursor = y_cursor + 1 
            num = num + 1 
            if num_sum + 1 == num: 
                break 
             
        if num_sum + 1 == num: 
            break 
         
        while True: // 아랫변에 대한 반복문
            if x_cursor + 1 >= n or map[y_cursor][x_cursor + 1] != 0: 
                break; 
            map[y_cursor][x_cursor + 1] = num 
            x_cursor = x_cursor + 1 
            num = num + 1 
            if num_sum + 1 == num: 
                 break 
                     
        if num_sum + 1 == num: 
            break 
         
        while True:  // 오른쪽 변에 대한 반복문
            if map[y_cursor -1][x_cursor -1] != 0: 
                break; 
            map[y_cursor -1][x_cursor -1] = num 
            num = num + 1 
            x_cursor = x_cursor - 1 
            y_cursor = y_cursor - 1 
            if num_sum + 1 == num: 
                break 

        if num_sum + 1 == num: 
            break 
     
     
    for x in range(0, n):   // 저장한 값에서 0이 아닌 값들을 answer 에 넘겨줌
        for y in range(0, n): 
            if map[x][y] == 0: 
                break

            answer.append(map[x][y])



    return answer

 

 

이중 반복문을 사용하여 직각삼각형 모양으로 삼각형을 그렸는데 n = 6 으로 예시를 들면

이런식으로 두개의 삼각형이 나오게 되는데 이는 n이 증가하더라도 비슷한 패턴으로 나오게 될 것이다.

 

 

 

 

문제에 대한 생각

문제를 해결하는데는 어렵지 않았지만 조건문을 섬세하게 설정하지 않으면 버그가 발생하기 쉬운 문제라고 생각한다. 처음 작성할 때 각 조건에 대해 정확하게 생각하고 작성하지 않으면 문제를 푸는데 오래 걸릴 것이다...

나도 실수해서 좀 오래걸렸다 ㅠㅠ

 

Written by Sheart

728x90
반응형