소스 코드
# 움직일 바퀴, 방향
def bfs(idx,dir):
temp = [[idx,dir]]
while len(temp) != 0:
i,d = temp.pop(0)
for q in range(2):
ni = i+x[q]
# 0 ~ 3 범위 초과하지 않고
if 0 <= ni < 4:
# 돌린적이 없는 경우
if visited[ni] == 0:
# 기준 바퀴의 왼쪽
if ni < i:
# 맞닿은 극이 다른 경우
if wheel[i][6] != wheel[ni][2]:
temp.append([ni,d*(-1)])
# 기준 바퀴의 오른쪽
else:
if wheel[i][2] != wheel[ni][6]:
temp.append([ni,d*(-1)])
# 방향이 시계방향(1)인 경우
# 오른쪽으로 한칸씩 민다
if d == 1:
wheel[i].insert(0,wheel[i].pop(-1))
# 반시계방향(-1)인 경우
# 왼쪽으로 한칸씩 민다
else:
wheel[i].insert(8,wheel[i].pop(0))
# 돌린 것 체크
visited[i] = 1
return
# 왼쪽 오른쪽
x = [-1,1]
# 톱니바퀴
wheel = [list(map(int,input())) for _ in range(4)]
# 회전 횟수
k = int(input())
# 회전 방법
k_detail = [list(map(int,input().split())) for _ in range(k)]
for K in k_detail:
# 돌린 바퀴 확인용, 매번 초기화
visited = [0]*4
# -1은 톱니바퀴의 index랑 같게 하기 위해
bfs(K[0]-1,K[1])
# 결과 값
res = 0
for w in range(4):
# 12시 방향이 S극인 경우
if wheel[w][0] == 1:
# 1, 2, 4, 8 순서대로 더하기
res += 1 * (2**w)
print(res)
해결 방법
1. 조건
1) 톱니바퀴 4개
2) 움직일 수 있는 방향 시계(1), 반시계(-1)
3) 맞닿은 극이 반대인 경우(바퀴의 [2]와 [6] 비교) 맞닿은 바퀴는 반대로 회전(현재 주어진 회전 방향 * -1)
2. 양 옆의 맞닿은 극을 모두 확인한 후 바퀴를 회전시켜야 함
느낀 점
ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.
오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.
혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.
'코딩 문제해결 > 문제 풀이.백준' 카테고리의 다른 글
[BOJ/백준 코딩] 인구 이동 - PYTHON #16234 (0) | 2021.02.27 |
---|---|
[BOJ/백준 코딩] 주사위 굴리기 - PYTHON #14499 (0) | 2021.02.27 |
[BOJ/백준 코딩] 연산자 끼워넣기 - PYTHON #14888 (0) | 2021.02.24 |
[BOJ/백준 코딩] 컨베이어 벨트 위의 로봇 - PYTHON #20055 (0) | 2021.02.23 |
[BOJ/백준 코딩] 주사위 게임 - PYTHON #5566 (0) | 2021.02.22 |