코딩테스트/기타

바람개비 구현

수타. 2023. 9. 19. 23:48

문제요약: 다음과 같이 n 과 clockwise가 주어졌을 때, 바람개비 모양의 배열을 반환하라

코드:

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

    #중간에 할당하는부분 때문에 회전시키고 리스트로 변환 
    def turn(arr):
            arr= list(zip(*arr))[::-1]
            for i in range(n):
                arr[i] = list(arr[i])
            return arr
        
    #네번해야함
    for _ in range(4):
        #가끔 회전하다가 딱맞게 회전하면 같은자리에 네번씀
        if arr[0][0]:
            arr = turn(arr) 
        piv=1
        k =0
        #piv는 적을 숫자,k는 꺾일 때마다 증가
        for i in range(n-1,-1,-2):
            for j in range(i):
                arr[n-i-1-k][j+k] = piv
                piv+=1
            k+=1
            arr = turn(arr) 
            
    #홀수면 가운데 하나 채워넣기
    if n%2:
        arr[n//2][n//2]=piv

    #바람개비가 반대라면
    if not clockwise:
        arr= arr[::-1]
        
    for y in arr:
        for x in y:
            print(x,end= ' ')
        print()

모 코테에서 나온 문제를 복기해서 풀어보았습니다. 다음과 같이 배열을 만들기 위해 처음에는 오른쪽으로 갔다가 아래로 왼쪽으로갔다가... 이런식으로 풀려고 하니 한도끝도없이 어려워져서 한것 이후에 회전을 시키자 라는 생각을 하였고, 나중에 바람개비 방향이 반대라도 좌우반전만 해주면 되기 때문에, 모든 경우를 왼쪽 위에서 시작하는 경우로 생각했습니다. 그리고 평소에 90도 회전으로 자주쓰는 list(zip(*arr))[::-1]도 zip의 반환 형태가 tuple이기 때문에 접근하는것 뿐아니라 원소 하나에 접근하려면 list로 바꿔주어야합니다.