Uknow's Lab.
article thumbnail
 

코딩테스트 연습 - 삼각 달팽이

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

 

 

설명

코딩을 막 배울때 한번쯤 접해봤을 달팽이 찍기의 삼각형 버전 입니다.

 

소스코드

def solution(n):
    arr = [[0] * n for i in range(n)]

    maxnum = 0
    for i in range(1,n+1):
        maxnum = maxnum + i

    x = y = 0
    num = 1
    switch = 0

    while(num <= maxnum):
        arr[x][y] = num
        if switch == 0:
            x = x + 1
            if x > n-1 or arr[x][y] != 0:
                switch = 1
                x = x - 1
                y = y + 1
        elif switch == 1:
            y = y + 1
            if y > n-1 or arr[x][y] != 0:
                switch = 2
                y = y - 1
                num = num - 1
        elif switch == 2:
            x = x - 1
            y = y - 1
            if x == 0 or arr[x][y] != 0:
                switch = 0
                x = x + 1
                y = y + 1
                num = num - 1
        num = num + 1

    arr2 = []
    for i in range(len(arr)):
        for j in range(len(arr)):
            if arr[i][j] != 0:
                arr2.append(arr[i][j])
    return arr2

 

 

 

* 아래 예시는 6층 (n = 6)인 상황을 가정으로 설명합니다.

arr = [[0] * n for i in range(n)]

 

6 * 6의 리스트(배열)을 생성하고, 모두 0으로 가득 채웁니다.

 

 

maxnum = 0
    for i in range(1,n+1):
        maxnum = maxnum + i

피라미드의 칸의 갯수가 몇개인지 카운트합니다 (maxnum)

 

 

일반적인 달팽이 숫자를 풀이할 때엔 총 2개의 switch(경우) 를 사용하여 풀이하곤 합니다.

저는 이를 응용하여 이 문제에선 3개의 switch(경우)로 나누어 문제를 풀이했습니다.

 

 

i) switch == 0 (아래쪽으로 증가)

   if switch == 0:
            x = x + 1
            if x > n-1 or arr[x][y] != 0:
                switch = 1
                x = x - 1
                y = y + 1

 

 

x,y값중 x값을 1씩 증가시켜

아래로 내려가는 경우이며, 배열의 최대값을 벗어나거나 다음 값이 0이 아닐때 switch를 2로 전환합니다.

ii) switch == 2 (오른쪽으로 증가)

 

        elif switch == 1:
            y = y + 1
            if y > n-1 or arr[x][y] != 0:
                switch = 2
                y = y - 1
                num = num - 1

 

오른쪽으로 증가하는 경우입니다.

x값을 증가시켰던 switch = 1과는 달리 y값이 증가합니다

마찬가지로 배열의 최대값을 넘어가거나 다음값이 0이 아닐 경우 switch를 2로 전환합니다.

iii) switch = 3 (대각선으로 증가)

 

        elif switch == 2:
            x = x - 1
            y = y - 1
            if x == 0 or arr[x][y] != 0:
                switch = 0
                x = x + 1
                y = y + 1
                num = num - 1

왼쪽 위 방향(대각선) 방향으로 증가하는 경우입니다.

계속 증가하다가 다음 값이 0이 아닐 때 (위 사진에서는 1) switch를 0으로 전환합니다.

이 3개의 switch가 있는 if ~ elif문을 통째로

while(num <= maxnum):

 

반복분으로 감싸주고

num = num + 1을 반복하며

num이 위에서 구한 maxnum이 커지기 전까지 반복함으로써

 

위와 같은 리스트(배열)을 얻을 수 있읍니다.

여기서 0을 제거한 후 값을 return 하면 완성됩니다.

 

 

후기

네이버 블로그를 사용할때 포스팅 했던 글입니다.

 

블로그를 네이버 -> 벨로그 -> 티스토리로 이전하면서,

기존 블로그의 글들을 티스토리로 옮겼는데

누락되어 옮기지 않은 글이 하나 있어 이번에 옮겼습니다.

 

작년 초 쯤에 파이썬을 배우면서 풀어봤던 문제같은데,

오랜만에 파이썬을 보니 반갑네요.

지금은 코틀린을 주 언어로 사용하고 있긴 하지만,

파이썬은 확실히 매력적인 언어인 것 같습니다.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.