728x90
얼핏 봤을때 삼성 문제 답게 그래프인가? 싶었는데 그냥 쌩구현이었다.
난 백준을 풀 때 웬만하면 100줄을 넘는 코드는 좋지않은 코드라고 생각하는데 무려 200줄이다. 허허,,, 반복을 잘 하면 줄일 수 있을 것 같은데 일단 내 최선이다.
아마 이 문제를 틀린 사람들의 이유는 다음과 같을 것이다.
"톱니바퀴가 움직인 후" 옆의 톱니바퀴와 비교하는 것이 아니라
"톱니바퀴가 움직이기 전" 옆의 톱니바퀴와 비교하여 움직일지 말지 정하는 문제이다.
이 문제는 톱니바퀴가 고작 4개여서 노가다로 풀 수 있었지만 톱니바퀴가 5개만 되어도 힘들것이다. 뭔가 일반화된 식이 있을까 고민된다.
1. 시계방향이동 함수 구현
2. 반시계방향이동 함수 구현
3. 톱니들의 규칙에 맞는 함수 구현
#include <iostream>
using namespace std;
char w1[8];
char w2[8];
char w3[8];
char w4[8];
void clockmove(char *w) {
char tmp;
tmp = w[0];
w[0] = w[7];
w[7] = w[6];
w[6] = w[5];
w[5] = w[4];
w[4] = w[3];
w[3] = w[2];
w[2] = w[1];
w[1] = tmp;
}
void reversclockmove(char* w) {
char tmp;
tmp = w[0];
w[0] = w[1];
w[1] = w[2];
w[2] = w[3];
w[3] = w[4];
w[4] = w[5];
w[5] = w[6];
w[6] = w[7];
w[7] = tmp;
}
int main() {
string tmp;
cin >> tmp;
for (int j = 0; j < 8; j++)
w1[j] = tmp[j];
cin >> tmp;
for (int j = 0; j < 8; j++)
w2[j] = tmp[j];
cin >> tmp;
for (int j = 0; j < 8; j++)
w3[j] = tmp[j];
cin >> tmp;
for (int j = 0; j < 8; j++)
w4[j] = tmp[j];
int n, number, dir;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> number >> dir;
if (dir == 1) {
if (number == 1) {
if (w1[2] != w2[6]) {
if (w2[2] != w3[6]) {
if (w3[2] != w4[6]) {
clockmove(w1);
reversclockmove(w2);
clockmove(w3);
reversclockmove(w4);
}
else {
clockmove(w1);
reversclockmove(w2);
clockmove(w3);
}
}
else {
clockmove(w1);
reversclockmove(w2);
}
}
else
clockmove(w1);
}
else if (number == 2) {
if (w2[6] != w1[2]) {
reversclockmove(w1);
}
if (w2[2] != w3[6]) {
if (w3[2] != w4[6]) {
clockmove(w2);
reversclockmove(w3);
clockmove(w4);
}
else {
clockmove(w2);
reversclockmove(w3);
}
}
else
clockmove(w2);
}
else if (number == 3) {
if (w3[2] != w4[6]) {
reversclockmove(w4);
}
if (w3[6] != w2[2]) {
if (w2[6] != w1[2]) {
clockmove(w3);
reversclockmove(w2);
clockmove(w1);
}
else {
clockmove(w3);
reversclockmove(w2);
}
}
else
clockmove(w3);
}
else if (number == 4) {
if (w4[6] != w3[2]) {
if (w3[6] != w2[2]) {
if (w2[6] != w1[2]) {
clockmove(w4);
reversclockmove(w3);
clockmove(w2);
reversclockmove(w1);
}
else {
clockmove(w4);
reversclockmove(w3);
clockmove(w2);
}
}
else {
clockmove(w4);
reversclockmove(w3);
}
}
else {
clockmove(w4);
}
}
}
else {
if (number == 1) {
if (w1[2] != w2[6]) {
if (w2[2] != w3[6]) {
if (w3[2] != w4[6]) {
reversclockmove(w1);
clockmove(w2);
reversclockmove(w3);
clockmove(w4);
}
else {
reversclockmove(w1);
clockmove(w2);
reversclockmove(w3);
}
}
else {
reversclockmove(w1);
clockmove(w2);
}
}
else
reversclockmove(w1);
}
else if (number == 2) {
if (w2[6] != w1[2]) {
clockmove(w1);
}
if (w2[2] != w3[6]) {
if (w3[2] != w4[6]) {
reversclockmove(w2);
clockmove(w3);
reversclockmove(w4);
}
else {
reversclockmove(w2);
clockmove(w3);
}
}
else
reversclockmove(w2);
}
else if (number == 3) {
if (w3[2] != w4[6]) {
clockmove(w4);
}
if (w3[6] != w2[2]) {
if (w2[6] != w1[2]) {
reversclockmove(w3);
clockmove(w2);
reversclockmove(w1);
}
else {
reversclockmove(w3);
clockmove(w2);
}
}
else
reversclockmove(w3);
}
else if (number == 4) {
if (w4[6] != w3[2]) {
if (w3[6] != w2[2]) {
if (w2[6] != w1[2]) {
reversclockmove(w4);
clockmove(w3);
reversclockmove(w2);
clockmove(w1);
}
else {
reversclockmove(w4);
clockmove(w3);
reversclockmove(w2);
}
}
else {
reversclockmove(w4);
clockmove(w3);
}
}
else {
reversclockmove(w4);
}
}
}
}
int answer = 0;
if (w1[0] == '1')
answer += 1;
if (w2[0] == '1')
answer += 2;
if (w3[0] == '1')
answer += 4;
if (w4[0] == '1')
answer += 8;
cout << answer << '\n';
}
'백준 문제 풀이' 카테고리의 다른 글
백준 16236번 아기 상어 (C++) (0) | 2023.01.18 |
---|---|
백준 12865번 평범한 배낭 (C++) (0) | 2023.01.14 |
백준 2293번 동전 1 (C++) (0) | 2023.01.05 |
백준 14499번 주사위 굴리기 (C++) (0) | 2023.01.02 |
백준 11054 가장 긴 바이토닉 부분 수열 (C++) (0) | 2022.12.29 |