소스 코드
def dfs(idx,dir):
# 방문 확인
check[idx] = 1
# 시계방향으로 움직이면
if dir == 1:
# 톱니 바퀴 이동
wheel[idx].insert(0,wheel[idx].pop(-1))
# 0~3번 톱니이고, 방문한 적 없으면
if 0 <= idx + 1 < 4 and check[idx+1] == 0:
# 현재 톱니의 3번(이동 전 2번)과 오른쪽 톱니의 6번 확인
if wheel[idx][3] != wheel[idx+1][6]:
dfs(idx+1, -1)
if 0 <= idx - 1 < 4 and check[idx-1] == 0:
# 현재 톱니의 7번(이동 전 6번)과 왼쪽 톱니의 2번 확인
if wheel[idx][7] != wheel[idx-1][2]:
dfs(idx-1, -1)
else:
wheel[idx].append(wheel[idx].pop(0))
if 0 <= idx + 1 < 4 and check[idx + 1] == 0:
if wheel[idx][1] != wheel[idx + 1][6]:
dfs(idx + 1, 1)
if 0 <= idx - 1 < 4 and check[idx-1] == 0:
if wheel[idx][5] != wheel[idx - 1][2]:
dfs(idx - 1, 1)
return
T = int(input())
for tc in range(1,1+T):
# 회전 수
k = int(input())
# 톱니
wheel = [list(map(int,input().split())) for _ in range(4)]
# 번호, 방향
arr = [list(map(int,input().split())) for _ in range(k)]
for q in arr:
# 방문 확인용
check = [0 for _ in range(4)]
# 번호(1~4번인데 wheel의 index는 0~3이라 -1함), 방향
dfs(q[0]-1,q[1])
# 결과
res = 0
# 화살표가 가리키는 곳을 계산에 따라 계산
for w in range(4):
res += wheel[w][0] * (2**w)
print('#{} {}'.format(tc,res))
해결 방법
- 화살표가 가리키는 톱니의 위치는 0번
- 톱니의 2번과 6번이 맞닿아 있다(다른 번호 확인할 필요 없음)
해당 문제에서 해결해야할 내용은
1. 톱니의 이동의 시작 위치가 정해지지 않았다(1번부터 시작하면 오른쪽만 쭉 확인하면 되고, 3번에서 시작하면 2번과 4번 모두 확인해야 함)
2. 톱니는 동시에 값이 변한다(n번째 톱니가 움직이고 난 후에 인접한 톱니와의 관계를 확인하면 안 된다)
위의 2 가지라 생각했다
1번의 경우, 어디에서 시작하든 왼쪽과 오른쪽을 모두 확인하는 방법을 사용
2번의 경우,
1) wheel과 temp_wheel을 만들어서 하나의 루틴 안에서 temp_wheel은 값을 변화시키고, 루틴이 끝난 후 wheel의 값을 변경시키는 방법
2) wheel의 값을 직접 변화시키고, 이 전값(시계방향으로 움직이면 2 대신 3, 6 대신 7, 시계 반대방향으로 움직이면 2 대신 1, 6 대신 5)을 기준으로 인접한 값과 비교하는 방법
두 가지를 떠올렸고 2)번의 방법을 사용하여 문제 해결
느낀 점
ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.
오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.
혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.
'코딩 문제해결 > 문제 풀이.SWEA' 카테고리의 다른 글
[SWEA 코딩] 문자열 동화 - PYTHON #10202 (0) | 2021.06.09 |
---|---|
[SWEA 코딩] 가랏! RC카! - PYTHON #1940 (0) | 2021.06.09 |
[SWEA 코딩] S/W 문제해결 응용 달란트2 - PYTHON #1265 (0) | 2021.06.07 |
[SWEA 코딩] S/W 문제해결 응용 공통조상 - PYTHON #1248 (0) | 2021.06.06 |
[SWEA 코딩] S/W 문제해결 응용 금속막대 - PYTHON #1259 (0) | 2021.06.05 |