코딩테스트 연습 - 행렬 테두리 회전하기 | 프로그래머스 (programmers.co.kr)

문제는 위 링크에서 확인하면된다.

총 두가지의 연산을 진행해야하는데, 
1. 실제 회전
2. 회전하는동안 스치는 숫자들의 최솟값

최대한 단순하게 풀기위해 시계방향으로 돌린다고 생각하고 풀었다.

 

#2021 Dev-matching웹백 행렬테두리 회전하기
# rows,columns,queries	result
# rows,columns,queries=6,6,[[2,2,5,4],[3,3,6,6],[5,1,6,3]]#	[8, 10, 25]
rows,columns,queries=3,3,[[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]]#	[1, 1, 5, 3]
# rows,columns,queries=100,97,[[1,1,100,97]]#	[1]
def mprint(mat):
    for m in mat:
        print(m)

def solution(rows,columns,queries):
    mat=[[1+j+(columns*i) for j in range(columns)] for i in range(rows)]
    # mprint(mat);print()
    answer=[]
    for query in queries:
        mat,miner=rot(mat,query)
        answer.append(miner)
        mprint(mat)
        print(miner)
    return answer

def rot(mat,q):
    x1,y1=q[0]-1,q[1]-1
    x2,y2=q[2]-1,q[3]-1
    print(x1,y1,x2,y2)
    tmp=mat[x1][y1]
    rt=0
    dx=[1,0,-1,0]
    dy=[0,1,0,-1]
    x,y=x1,y1
    miner=mat[x1][y1]
    while True:
        nx,ny=x+dx[rt], y+dy[rt]
        if rt==0 and nx==x2 and ny<y2:
            rt=1
        elif rt==1 and nx==x2 and ny==y2:
            rt=2
        elif rt==2 and nx==x1:
            rt=3
        elif rt==3 and ny==y1:
            mat[x][y] = tmp
            break
        miner = min(miner,mat[nx][ny])
        mat[x][y]=mat[nx][ny]
        x=nx
        y=ny
    return mat, miner
solution(rows,columns,queries)

dx,dy를 통해 4방향의 회전을 구했으며, 각각 반시계방향 앞녀석의 것을 가져온다. 
rt를 통해 회전의 방향을 확인하며, 각 회전방향 중 tern이 필요한 순간을 if의 조건을 통해 나눠줬다.

'CODING TEST' 카테고리의 다른 글

최단경로  (0) 2021.06.24
이코테 - 1로만들기, 개미전사  (0) 2021.06.21
이코테 _ 떡볶이떡  (0) 2021.06.18
파이썬 Python KAKAO_2019 인턴- 불량사용자  (0) 2021.06.18
파이썬 Python KAKAO_2018 캐시  (0) 2021.06.16

+ Recent posts