문제

이 문제는 구현하는 알고리즘을 생각하는게 까다롭다기보다는 조건이 너무 많아서 구현하는게 까다로운 문제이다.
일단 반시계방향 시계방향으로 돌게 하는 함수부터 따로 만들어주는 것으로 시작하였다. 이때 검색해보니 deque를 활용해서 roatate함수를 활용하신 분이 많던데 나는 이 방법을 몰라서 직접 구현했다... 내장함수 쓰는게 훨씬 간편할듯,,,
그리고 처음에 헷갈린 부분이 한번 회전을 할 때 하나의 톱니바퀴가 움직이면 한번의 회전 내에서 톱니바퀴를 바로 움직여서 옆의 톱니바퀴는 회전된 톱니바퀴를 기준으로 하도록 했는데
문제를 보면 알겠지만 k번의 회전중 한 번의 회전을 하는 동안에는 내부의 톱니바퀴가 움직이지 않은 값을 기준으로 맞닿은 부분을 확인해주어야한다.
그렇기 때문에 한번 회전할 때 어떤 톱니바퀴가 어떤 방향으로 회전할지 체크해준 이후에 톱니바퀴를 회전한 값으로 업데이트 해주어야한다.
그리고 회전하는 톱니바퀴 기준 왼쪽 오른쪽을 나누어서 확인해 주었다.
전체코드
def sigye(toapn):
last= toapn[-1]
toapn[1:] = toapn[0:7]
toapn[0] = last
return toapn
def bansigye(toapn):
first= toapn[0]
toapn[0:7] = toapn[1:]
toapn[-1] = first
return toapn
toap = []
for i in range(4):
toap.append(list(input()))
k = int(input())
for _ in range(k):
n,s = map(int, input().split())
scheck =[0] *4
#회전한 톱니바퀴 인덱스에 맞추어 마이너스
n -= 1
scheck[n] = s
#n번째 톱 이전의 톱 돌리기
for i in range(n-1,-1,-1):
#맞닿은 극이 반대일 때
if toap[i+1][6] != toap[i][2]:
if scheck[i+1] == 1:
scheck[i] = -1
if scheck[i+1] == -1:
scheck[i] = 1
else:
#회전이 더이상 없으므로 브레이크
break
#n번째 톱 이후의 톱 돌리기
for i in range(n+1,4):
#맞닿은 극이 반대일 때
if toap[i][6] != toap[i-1][2]:
if scheck[i-1] == 1:
scheck[i] = -1
if scheck[i-1] == -1:
scheck[i] = 1
else:
#회전이 더이상 없으므로 브레이크
break
#이번 회전에서의 극의 값에 따른 회전여부 저장해서 한번에 회전
for i in range(4):
if scheck[i] == 1:
toap[i] = sigye(toap[i])
if scheck[i]== -1:
toap[i] = bansigye(toap[i])
ans = 0
for i in range(4):
if toap[i][0] == "1":
ans += pow(2,i)
#print(toap)
print(ans)
단순 구현 문제중에 문제가 너무 길고 조건이 많아서 까다로운 문제가 있는데 이 문제가 딱 그런 유형이였던 것 같다.
'코딩테스트 > 백준' 카테고리의 다른 글
| [백준]1068번 트리 - ptyhon파이썬 (2) | 2024.10.16 |
|---|---|
| [백준] 2565번 전깃줄 - python 파이썬 (1) | 2024.10.14 |
| [백준] 2294번 동전2 -python 파이썬 (1) | 2024.10.12 |
| [백준] 2493번 탑 - python 파이썬 (2) | 2024.10.06 |
| [백준] 1107 리모컨 - python 파이썬 (1) | 2024.07.22 |