[Python/백준] 14891_톱니바퀴Coding Test/Python2023. 12. 5. 00:57
Table of Contents
728x90
반응형
https://www.acmicpc.net/problem/14891
<문제 해설>
구현 시뮬레이션 문제이다.
톱니를 구현할 배열을 deque를 사용해 만든다.
톱니의 index 0은 12시방향,index 3는 3시 방향,index 6은 9시 방향이다.
톱니가 시계 방향 즉 1로 회전한다면 큐의 마지막을 빼서 왼쪽에 넣는다.
톱니가 반시계 방향 즉 -1로 회전한다면 큐의 왼쪽을 빼서 마지막에 넣는다.
- 어떤 톱니가 어느 방향으로 회전하는지 값을 받는다
기존 톱니의 6번index는 left에 2번index는 right에 저장한다.
톱니를 방향에 맞춰서 회전시킨다.
d에 반대 방향 회전을 알려준다.(d = -D) - 첫톱니의 오른쪽 톱니들을 돌려준다. 처음 받은 값이 N이라면 n+1부터 4까지 진행한다.
오른쪽 톱니를 돌리기전 오른쪽 톱니의 6번 index를 newright변수에 미리 저장해둔다.
이제 오른쪽 톱니의 6번인덱스와 right를 비교한다. 값이 다르면 d방향으로 회전시킨다.
다음 오른쪽 톱니들은 또 반대로 회전해야니 -d를해서 방향을 변경해준다.
이제 right를 newright값으로 바꿔주고 다음 톱니로 진행한다.
만약 값이 같다면 회전하지 않고 다른 오른쪽 바퀴들도 회전하지 않으니 반복문을 정지한다. - 왼쪽 톱니 또한 위의 방법과 비슷한 방법으로 진행한다. 이번엔 left와 2번 index를 비교해나가면 된다.
- 톱니의 12시 방향 값들을 통해서 점수를 계산후 출력한다.
<예시>
다음은 예시 3번의 결과이다.
왼쪽은 입력 값이고 오른쪽은 첫톱니,2번째톱니,...,4번째톱니이다.
입력값에 의해서 다음과 같이 값이 변화한다.
첫번째 값을 입력하자 첫 바퀴가 돌고 2,3번째도 돌지만 마지막은 돌지 않는다.
출력값은 6이 된다.
<코드>
def spin(N,D):
if D == 1:
gears[N].appendleft(gears[N].pop())
else:
gears[N].append(gears[N].popleft())
import sys
from collections import deque
gears = []
for _ in range(4):
gears.append(deque([int(i) for i in sys.stdin.readline().rstrip()]))
K = int(input())
for k in range(K):
N,D = map(int,sys.stdin.readline().split())
N -= 1
left = gears[N][6]
right = gears[N][2]
spin(N,D)
d = -D
for n in range(N+1,4):
rightleft = gears[n][6]
newright = gears[n][2]
if rightleft != right:
spin(n,d)
d = -d
right = newright
else:
break
d = -D
for n in range(N-1,-1,-1):
leftright = gears[n][2]
newleft = gears[n][6]
if leftright != left:
spin(n,d)
d = -d
left = newleft
else:
break
output = 0
score = [1,2,4,8]
for i in range(4):
if gears[i][0] == 1:
output += score[i]
print(output)
<코드 설명>
def spin(N,D): //톱니를 돌리는 함수
if D == 1: //시계방향 돌리기
gears[N].appendleft(gears[N].pop())
else: //반시계방향 돌리기
gears[N].append(gears[N].popleft())
import sys
from collections import deque
gears = [] //기어들을 관리할 함수
for _ in range(4): //기어의 값 받기
gears.append(deque([int(i) for i in sys.stdin.readline().rstrip()])) //deque로 저장하기
K = int(input()) //K값 받기
for k in range(K): //K만큼 반복
N,D = map(int,sys.stdin.readline().split()) //기어 번호, 회전 방향 받기
N -= 1 //index랑 1만큼 차이나니 빼주기
left = gears[N][6] //9시 방향 left에 저장하고
right = gears[N][2] //3시 방향 right에 저장하고
spin(N,D) //회전
d = -D //방향 바꿔주고
for n in range(N+1,4): //오른쪽에 있는 기어 값들 변환하기
rightleft = gears[n][6] //오른쪽에 있는 기어의 9시 방향 값 저장하기
newright = gears[n][2] //오른쪽에 있는 기어의 3시 방향 값 저장하기
if rightleft != right: //값이 다르다면
spin(n,d) //회전
d = -d //방향 전환
right = newright //이제 오른쪽 기어의 오른쪽 기어를 변환해야하니 오른쪽 기어의 3시값 저장
else:
break //아닐시 정지
d = -D //위 코드와 같은 동작
for n in range(N-1,-1,-1):
leftright = gears[n][2]
newleft = gears[n][6]
if leftright != left:
spin(n,d)
d = -d
left = newleft
else:
break
print(gears)
output = 0
score = [1,2,4,8]
for i in range(4): //기어의 첫값이 1이면 출력값에 더해준다.
if gears[i][0] == 1:
output += score[i]
print(output) //출력값 출력
if D == 1: //시계방향 돌리기
gears[N].appendleft(gears[N].pop())
else: //반시계방향 돌리기
gears[N].append(gears[N].popleft())
import sys
from collections import deque
gears = [] //기어들을 관리할 함수
for _ in range(4): //기어의 값 받기
gears.append(deque([int(i) for i in sys.stdin.readline().rstrip()])) //deque로 저장하기
K = int(input()) //K값 받기
for k in range(K): //K만큼 반복
N,D = map(int,sys.stdin.readline().split()) //기어 번호, 회전 방향 받기
N -= 1 //index랑 1만큼 차이나니 빼주기
left = gears[N][6] //9시 방향 left에 저장하고
right = gears[N][2] //3시 방향 right에 저장하고
spin(N,D) //회전
d = -D //방향 바꿔주고
for n in range(N+1,4): //오른쪽에 있는 기어 값들 변환하기
rightleft = gears[n][6] //오른쪽에 있는 기어의 9시 방향 값 저장하기
newright = gears[n][2] //오른쪽에 있는 기어의 3시 방향 값 저장하기
if rightleft != right: //값이 다르다면
spin(n,d) //회전
d = -d //방향 전환
right = newright //이제 오른쪽 기어의 오른쪽 기어를 변환해야하니 오른쪽 기어의 3시값 저장
else:
break //아닐시 정지
d = -D //위 코드와 같은 동작
for n in range(N-1,-1,-1):
leftright = gears[n][2]
newleft = gears[n][6]
if leftright != left:
spin(n,d)
d = -d
left = newleft
else:
break
print(gears)
output = 0
score = [1,2,4,8]
for i in range(4): //기어의 첫값이 1이면 출력값에 더해준다.
if gears[i][0] == 1:
output += score[i]
print(output) //출력값 출력
728x90
반응형
'Coding Test > Python' 카테고리의 다른 글
[Python/백준] 4179 불! (1) | 2023.12.06 |
---|---|
[Python/백준] 14499_주사위 굴리기 (1) | 2023.12.06 |
[Python/백준] 3190_뱀 (1) | 2023.12.03 |
[Python/백준] 14503 로봇 청소 (1) | 2023.12.02 |
[Python/백준] 20055 컨베이어 벨트 위의 로봇 (0) | 2023.11.27 |
@코딩하는 자연대생 :: 자연대생도 코딩을 하고 싶어
Coding, Software, Computer Science 내가 공부한 것들 잘 이해했는지, 설명할 수 있는지 적는 공간