https://www.acmicpc.net/problem/14891
이 문제는 문제와 문제에 나와있는 예시를 잘 읽어야한다.
원래 머리에 생각하고 있는 대로 풀면 틀린다.
처음 풀 때 예시가 잘 이해 안되서 예시가 틀린건가..하고 안봤다가 잘못 이해하고 풀었다.
<해당 톱니를 움직이기 전에>
1. 옆 톱니를 움직인다. (움직인 톱니의 옆친구와 극이 다르면 옆친구도 움직인다.)
2. 해당 톱니를 움직인다.
옆톱니를 움직일 때도 이제는 자신이 해당 톱니가 되어서 옆 톱니를 먼저 확인한다-!!
옆톱니가 움직일 때만 자신이 움직일 기회가 생기는 것이다.
"3번 톱니를 반시계방향으로 회전했다면"
3번 톱니를 회전시키기전에 양옆 톱니인 2번과 4번 톱니를 본다.
현재 3번 톱니와 2번톱니는 극이 같으므로 변화 없고 3번 톱니와 4번 톱니가 극이 달라 4번 톱니는 시계방향으로 회전한다.
그 후에 (즉 , 4번이 회전한후에) 3번 톱니가 회전한다.
이렇게 !!
답을 보기 전에 생각한 것 :
덱을 배열로 만들어야한다는 생각을 했으나 어떻게 해야할지 안떠올랐다.
2번과 6번 인덱스의 값을 비교한다는 생각은 했다.
새롭게 알게된 것 :
덱의 배열 -> dict를 이용하면 된다-!!
deque에 rotate라는 메서드 이용.
왼쪽과 오른쪽, 2방향으로 나누어서 함수를 만들어야한다.
조건을 만족한 경우 재귀로 함수를 호출한 후 해당 num의 톱니바퀴를 회전한다.
코드 :
from collections import deque
def rotate_right(start,dirs) :
if start > 4 or gears[start-1][2] == gears[start][6] :
return
# 오른쪽 확인
if gears[start-1][2] != gears[start][6] :
rotate_right(start+1, -dirs) # 반대쪽으로
gears[start].rotate(dirs)
def rotate_left(start,dirs) :
if start < 1 or gears[start][2] == gears[start+1][6] :
return
# 왼쪽 확인
if gears[start][2] != gears[start+1][6] : # 왼쪽 입장에서 원래 톱니와 다르다
rotate_left(start-1, -dirs) # 왼쪽의 왼쪽을 확인
gears[start].rotate(dirs) # 왼쪽 톱니 회전
gears = {}
for i in range(1, 5):
gears[i] = deque((map(int, input())))
for _ in range(int(input())):
x, d = map(int, input().split())
rotate_right(x + 1, -d) # 오른쪽 톱니 확인
rotate_left(x - 1, -d) # 왼쪽 톱니 확인
gears[x].rotate(d) # 해당 톱니 # deque에 있는 메소드
ans = 0
for i in range(4): # 12시방향(0번째 인덱스)가 1이면 1,2,4,8
ans += gears[i + 1][0] * (2 ** i)
print(ans)
인접 톱니바퀴가 회전하지 않는다해도, 처음 주어진 톱니바퀴는 회전한다는 것을 알아야한다.
마지막 점수를 구할 때
ans = 0
for i in range(1,5) :
if dic[i][0] == 1 :
ans += 2**(i-1)
print(ans)
이렇게 해도 답이다.
이렇게 만들어도 답이다.
# 왼쪽 톱니 확인
def change_left(num,dir) :
# 돌릴 수 있다면
if num >= 1 and topni[num][2] != topni[num+1][6] :
# 왼쪽 톱니 확인
change_left(num-1,-dir)
# 톱니 돌리기
topni[num].rotate(dir)
else : return
def change_right(num,dir) :
# 돌릴 수 있다면
if num <= 4 and topni[num][6] != topni[num-1][2] :
# 오른쪽 톱니 확인
change_right(num+1,-dir)
# 톱니 돌리기
topni[num].rotate(dir)
else : return
if __name__=="__main__" :
topni = {}
for i in range(1,5) :
topni[i] = deque(map(int,input()))
n = int(input())
for i in range(n) :
num,dir = map(int,input().split())
# 왼쪽 톱니 확인
change_left(num-1,-dir)
# 오른쪽 톱니확인
change_right(num+1,-dir)
# 내 톱니 돌리기
topni[num].rotate(dir)
ans = 0
for i in range(1,5) :
ans += topni[i][0] * (2**(i-1))
print(ans)
코드 참고 :
복습 :
✅ 20220712
✅ 20220713
🐾 20220917
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[삼성SW역량][Python/BOJ] 백준 3190 뱀(시뮬레이션) (0) | 2022.07.12 |
---|---|
[삼성SW역량][Python/BOJ] 백준 15686 치킨 배달(DFS) (0) | 2022.07.11 |
[삼성SW역량][Python/BOJ] 백준 14889 스타트와 링크(DFS, 백트레킹) (0) | 2022.06.30 |
[삼성SW역량][Python/BOJ] 백준 14888 연산자 끼워넣기(DFS) (0) | 2022.06.30 |
[삼성SW역량][Python/BOJ] 백준 14503 로봇 청소기(구현) (0) | 2022.06.30 |