Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 자바 ORM 표준 JPA 프로그래밍 7장
- 코틸린인액션
- 고급매핑
- 20055
- 싱글톤 컨테이너
- KotlinInAction
- 스프링 핵심 원리 이해
- Kotlin
- 7장 고급매핑
- 13460 구슬탈출 2
- 20055 컨베이어 벨트 위의 로봇
- 백준
- 코틀린
- Kotlin in action 5장
- Kotlin in action 3장
- 스프링 컨테이너와 스프링 빈
- Kotlin In Action
- 백준 20055 컨베이어 벨트 위의 로봇
- 기능개발 python
- 스프링 핵심 원리 - 기본편
- Python
- Kotlin in action 6장
- kotlin in action 정리
- spring
- Kotlin in action 10장
- 백준 13460 Python
- 스프링 핵심 원리
- 객체 지향 설계와 스프링
- 코틀린인액션
- 컨베이어 벨트 위의 로봇 Python
Archives
- Today
- Total
기록하는 습관
[삼성SW기출문제] 14891번 톱니바퀴 본문
1. 문제 링크
https://www.acmicpc.net/problem/14891
2. 코드
- 문제 소요 시간: 1시간 30분
import math
from collections import deque
state = [deque(list(map(int, input()))) for _ in range(4)]
n = int(input())
rotate = [list(map(int, input().split())) for _ in range(n)]
q = deque()
def bfs(Num, Dir, Q):
q.append((Num, Dir))
while q:
num, dir = q.popleft()
if num < 3 and not visit[num + 1]:
visit[num + 1] = True
if state[num][2] != state[num + 1][6]: # 오른쪽 톱니바퀴 체크
q.append((num + 1, -dir))
Q.append((num + 1, -dir))
if num > 0 and not visit[num - 1]:
visit[num - 1] = True
if state[num][6] != state[num - 1][2]: # 왼쪽 톱니바퀴 체크
q.append((num - 1, -dir))
Q.append((num - 1, -dir))
for num, dir in rotate:
visit = [False for _ in range(4)]
Q = deque()
Q.append((num - 1, dir))
visit[num - 1] = True
bfs(num - 1, dir, Q)
while Q:
num, dir = Q.popleft()
state[num].rotate(dir) # 톱니바퀴 회전
answer = 0
for i in range(4):
if state[i][0] == 0:
continue
answer += math.pow(state[i][0] * 2, i)
print(int(answer))
3. 문제 풀이
- 적용 알고리즘: 구현 + BFS
- 포인트
- 회전을 어떻게 할 것인가?
- 처음에 문제를 읽고, 양방향으로 회전한다고 해서 바로 deque를 사용하고 rotate() 메서드를 사용해야 겠다고 생각함.
- 마침, 주어진 방향도 rotate에 적용되는 것과 같아서 더 편했음.
- 참고) rotate(-1) : 반시계 방향
- 회전을 언제 할 것인가?
- 이 것 때문에 시간을 많이 잡아먹었다. 처음에는 dfs로 구현하면서 톱니바퀴 한 개씩 회전을 시켜줬다. 그러다 보니 톱니바퀴 회전은 한 번에 일어나야 되는데 한 개씩 일어나다 보니 상태 변화가 생겨 꼬이는 현상이 발생했다.
- 그래서 두 번째 생각한 방법은 bfs로 구현하고, 회전 시켜야할 톱니바퀴와 방향을 저장해두고 한 번에 회전시키고자 했다.
'알고리즘 > [문제풀이] 삼성 SW 기출문제, 모의고사' 카테고리의 다른 글
[삼성SW기출문제] 16234번 인구 이동 (0) | 2022.09.14 |
---|---|
[삼성SW기출문제] 14503번 로봇 청소기 (0) | 2022.09.14 |
[삼성SW기출문제] 14888번 연산자 끼워넣기 (0) | 2022.09.14 |
Comments