반응형

 

오예 40분컷

 

 


 

문제

 

 


 

코드

 

# 0이 lst에 포함되어 있는지 여부
# 포함되어 있으면 True
# 포함되어 있지 않으면 False return
def zero_tf(lst):
    result = False
    for one_lst in lst:
        if 0 in one_lst :
            # print("있음")
            return True
        else:
            # print("없음")
            pass
    return result



def solution(n):

    if n == 1:
        return [1]
    # elif n == 2:
    #     return [1, 3, 2]

    lst = [[0]*k for k in range(1, n+1)]
    # print(lst)

    num = 1
    x, y = 0, 0
    direction = [(1,0), (0,1), (-1,-1)]
    direction_order = 0

    while True:
        if lst[x][y] == 0:
            lst[x][y] = num
            num+=1

            # 만약 x와 y가 n을 초과하거나 0보다 작아질 경우
            if (x+direction[direction_order][0] >= n) | (x+direction[direction_order][0] < 0) | (y+direction[direction_order][1] >= n) | (y+direction[direction_order][1] < 0):
                direction_order = (direction_order + 1) % 3

            x += direction[direction_order][0]
            y += direction[direction_order][1]

            #break
        else:
            # lst에 zero가 없으면 반복문을 멈춰라 
            if not zero_tf(lst):
                break

            # 채우려고 하는 곳이 0이 아닐 경우
            # 원상복구 후 
            x -= direction[direction_order][0]
            y -= direction[direction_order][1]
            # print("원상복구된 x, y: ", x, y)

            # 방향을 바꿔라
            direction_order = (direction_order + 1) % 3
            x += direction[direction_order][0]
            y += direction[direction_order][1]



    # print(lst, "================== lst ")
    answer = []
    for one_lst in lst:
        answer = answer + one_lst
    
    return answer

 

 


 

설명

처음에는 감이 안잡혀서 하나씩 다 적어봤다

그랬더니 반복되는 것이 보였다

** (1,0) => (0, 1) => (-1, -1) 씩 증가하는 것이 반복된다

리스트보다 큰 인덱스를 찾으려고 하거나, 0보다 작은 인덱스가 나오면 방향을 바꿔주었다.

혹은 값이 채워져있는 공간일 경우 방향을 바꿨다.

 

방향은 direction= [(1,0), (0, 1), (-1, -1)]

이렇게 변수에 담아놓고 direction_order를 바꿔주면서 사용했다

총 3개라서 3으로 나눈 나머지를 구해서 0, 1, 2 만 나오게끔 하였다

 

 

list가 전부 0이 아닌지 체크하는 zero_tf 함수도 만들어서 확인해주었다.

 

 

하나씩 적어봐서

인덱스가 (1,0) => (0, 1) => (-1, -1) 씩 반복적으로 증가하는 것을 확인함

(더보기 클릭시 하나씩 적은 과정 확인가능)

 

더보기

lst[0][0] = 1
lst[1][0] = 2
lst[2][0] = 3
lst[3][0] = 4
=> x가 1씩 증가
=> x가 초과하면
=> (+1, 0)

lst[3][1] = 5
lst[3][2] = 6
lst[3][3] = 7
=> y가 1씩 증가
=> y가 초과하면
=> (0, +1)

lst[2][2] = 8
lst[1][1] = 9
=> x, y 둘다 -1씩
=> (-1, -1)


lst[2][1] = 10
=> (+1, 0)

=> (0, +1)

=> (-1, -1)

 


 

 

 

 

반응형
복사했습니다!