코딩테스트 연습 - 행렬 테두리 회전하기 | 프로그래머스 (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 |