티스토리 뷰
반응형
백준 14891번 톱니바퀴 C++ 풀이 정리
문제 설명
백준 14891번 톱니바퀴 문제는 4개의 톱니바퀴가 주어지고, 각각 8개의 톱니(극: N=0, S=1)로 구성되어 있을 때, 주어진 회전 명령에 따라 톱니들이 어떻게 움직이는지를 시뮬레이션한 뒤 최종 점수를 계산하는 문제입니다.
핵심 규칙
- 회전 명령을 받은 톱니는 무조건 회전합니다.
- 인접한 톱니는 서로 맞닿은 극이 다르면 반대 방향으로 회전합니다.
- 맞닿은 극이 같으면 그쪽 전파는 멈춥니다.
- 최종 점수는 다음과 같이 계산됩니다.
- 1번 톱니의 12시 방향이 S극 → +1점
- 2번 톱니의 12시 방향이 S극 → +2점
- 3번 톱니의 12시 방향이 S극 → +4점
- 4번 톱니의 12시 방향이 S극 → +8점
접근 방법
- 각 톱니 상태를
char[8]
배열로 저장합니다. ClockWise
,CounterWise
함수를 따로 만들어서 배열을 한 칸씩 회전시킵니다.- 인접 톱니 비교는 1-2, 2-3, 3-4 세 구간만 확인하면 됩니다.
- 왼쪽 톱니의
2
번 인덱스 - 오른쪽 톱니의
6
번 인덱스
- 왼쪽 톱니의
- 회전 전, 비교할 맞닿은 톱니 상태를 모두 저장해 두고(
arr[0]~arr[5]
), 전파 여부를check[4]
배열로 관리합니다. check[i] = 1
→ 시계 방향,check[i] = -1
→ 반시계 방향,check[i] = 0
→ 회전 없음.
사용 코드
#include <iostream>
#include <cmath>
using namespace std;
void ClockWise(char* arr) {
char prev = arr[0], next;
for (int i = 1; i < 8; i++) {
next = arr[i];
arr[i] = prev;
prev = next;
}
arr[0] = prev;
}
void CounterWise(char* arr) {
char prev = arr[7], next;
for (int i = 6; i >= 0; i--) {
next = arr[i];
arr[i] = prev;
prev = next;
}
arr[7] = prev;
}
int main(void) {
char arr1[9], arr2[9], arr3[9], arr4[9], arr[6];
int K, top, clock, sum = 0;
cin >> arr1;
cin >> arr2;
cin >> arr3;
cin >> arr4;
cin >> K;
for (int i = 0; i < K; i++) {
cin >> top >> clock;
arr[0] = arr1[2]; arr[1] = arr2[6];
arr[2] = arr2[2]; arr[3] = arr3[6];
arr[4] = arr3[2]; arr[5] = arr4[6]; // 여기서 3-4 비교는 arr4[6]
int check[4] = { 0 };
if (top == 1) {
if (clock == 1) {
check[0] = 1;
if (arr[0] != arr[1]) {
check[1] = -1;
if (arr[2] != arr[3]) {
check[2] = 1;
if (arr[4] != arr[5])
check[3] = -1;
}
}
} else {
check[0] = -1;
if (arr[0] != arr[1]) {
check[1] = 1;
if (arr[2] != arr[3]) {
check[2] = -1;
if (arr[4] != arr[5])
check[3] = 1;
}
}
}
}
else if (top == 2) {
if (clock == 1) {
check[1] = 1;
if (arr[0] != arr[1]) {
check[0] = -1;
}
if (arr[2] != arr[3]) {
check[2] = -1;
if (arr[4] != arr[5])
check[3] = 1;
}
} else {
check[1] = -1;
if (arr[0] != arr[1]) {
check[0] = 1;
}
if (arr[2] != arr[3]) {
check[2] = 1;
if (arr[4] != arr[5])
check[3] = -1;
}
}
}
else if (top == 3) {
if (clock == 1) {
check[2] = 1;
if (arr[2] != arr[3]) {
check[1] = -1;
if (arr[0] != arr[1]) {
check[0] = 1;
}
}
if (arr[4] != arr[5]) {
check[3] = -1;
}
} else {
check[2] = -1;
if (arr[2] != arr[3]) {
check[1] = 1;
if (arr[0] != arr[1]) {
check[0] = -1;
}
}
if (arr[4] != arr[5]) {
check[3] = 1;
}
}
}
if (top == 4) {
if (clock == 1) {
check[3] = 1;
if (arr[4] != arr[5]) {
check[2] = -1;
if (arr[2] != arr[3]) {
check[1] = 1;
if (arr[0] != arr[1])
check[0] = -1;
}
}
} else {
check[3] = -1;
if (arr[4] != arr[5]) {
check[2] = 1;
if (arr[2] != arr[3]) {
check[1] = -1;
if (arr[0] != arr[1])
check[0] = 1;
}
}
}
}
if (check[0] == 1) ClockWise(arr1);
else if (check[0] == -1) CounterWise(arr1);
if (check[1] == 1) ClockWise(arr2);
else if (check[1] == -1) CounterWise(arr2);
if (check[2] == 1) ClockWise(arr3);
else if (check[2] == -1) CounterWise(arr3);
if (check[3] == 1) ClockWise(arr4);
else if (check[3] == -1) CounterWise(arr4);
}
sum += (arr1[0] - '0' + 2 * (arr2[0] - '0') + 4 * (arr3[0] - '0') + 8 * (arr4[0] - '0'));
cout << sum << endl;
return 0;
}
반응형
'백준 스터디' 카테고리의 다른 글
백준 1911번 흙길 보수하기 C++ (0) | 2025.08.30 |
---|---|
백준 14891번: 톱니바퀴 (파이썬) (1) | 2025.08.30 |
백준 등수 구하기 1205 python (2) | 2025.08.28 |
백준 등수 구하기 (1205번) C++ (2) | 2025.08.27 |
백준 17266번: 어두운 굴다리 (python 풀이) (3) | 2025.08.26 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준
- 알고리즘 문제풀이
- 그래프 탐색
- 문자열처리
- 그리디
- C++
- DP
- 동적 계획법
- 파이썬
- 그리디알고리즘
- 브루트포스
- 프로그래밍
- 객체지향
- 코딩
- 코딩테스트
- 인접 행렬
- c언어
- 알고리즘기초
- 알고리즘
- python 알고리즘
- 파이썬코딩
- C++ 알고리즘
- 알고리즘문제풀이
- dfs
- Python
- 문제풀이
- 동적계획법
- 코딩 테스트
- 문제 풀이
- c++알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
반응형