728x90
반응형
최종 코드
//
// main.cpp
// SWEA4013
//
// Created by Hwayeon on 2021/10/15.
//
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
int magnet[5][8] = {0, };
int K;
vector<pair<int, int>> cmds;
int answer = 0;
int dir, num;
void rotate_magnet(int n, int d){
int temp = -1;
switch(d){
case 1:
temp = magnet[n][7];
for(int i=7; i>=1; i--){
magnet[n][i] = magnet[n][i-1];
}
magnet[n][0] = temp;
break;
case -1:
temp = magnet[n][0];
for(int i=0; i<=6; i++){
magnet[n][i] = magnet[n][i+1];
}
magnet[n][7] = temp;
break;
}
}
void play_cmds(){
for(int i=0; i<K; i++){
num = cmds[i].first;
dir = cmds[i].second;
switch(num){
case 1:
if(magnet[1][2] != magnet[2][6]){
if(magnet[2][2] != magnet[3][6]){
if(magnet[3][2] != magnet[4][6]){
rotate_magnet(4, -dir);
}
rotate_magnet(3, dir);
}
rotate_magnet(2, -dir);
}
rotate_magnet(1, dir);
break;
case 2:
if(magnet[2][6] != magnet[1][2]){
rotate_magnet(1, -dir);
}
if(magnet[3][6] != magnet[2][2]){
if(magnet[4][6] != magnet[3][2]){
rotate_magnet(4, dir);
}
rotate_magnet(3, -dir);
}
rotate_magnet(2, dir);
break;
case 3:
if(magnet[3][2] != magnet[4][6]){
rotate_magnet(4, -dir);
}
if(magnet[3][6] != magnet[2][2]){
if(magnet[1][2] != magnet[2][6]){
rotate_magnet(1, dir);
}
rotate_magnet(2, -dir);
}
rotate_magnet(3, dir);
break;
case 4:
if(magnet[4][6] != magnet[3][2]){
if(magnet[3][6] != magnet[2][2]){
if(magnet[2][6] != magnet[1][2]){
rotate_magnet(1, -dir);
}
rotate_magnet(2, dir);
}
rotate_magnet(3, -dir);
}
rotate_magnet(4, dir);
break;
}
}
}
int main(int argc, const char * argv[]) {
int test_case;
int T, num, dir;
cin >> T;
for(test_case=1; test_case<=T; ++test_case){
cmds.clear();
answer = 0;
cin >> K;
for(int i=1; i<5; i++){
for(int j=0; j<8; j++){
cin >> magnet[i][j];
}
}
for(int i=0; i<K; i++){
cin >> num >> dir;
cmds.push_back({num, dir});
}
play_cmds();
for(int i=1; i<5; i++){
if(magnet[i][0]) answer += pow(2, i-1);
}
cout << "#" << test_case << " " << answer << endl;
}
return 0;
}
풀이 과정
풀이 시간 36분
백준 14891 톱니바퀴 문제와 똑같다.
이전에 톱니바퀴 문제를 2번 풀어봤었기 때문에 쉽게 풀 수 있었다.
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
int magnet[5][8] = {0, };
int K;
vector<pair<int, int>> cmds;
int answer = 0;
int dir, num;
void rotate_magnet(int n, int d){
int temp = -1;
switch(d){
//n번 자석 시계방향으로 1칸 회전
case 1:
temp = magnet[n][7];
for(int i=7; i>=1; i--){
magnet[n][i] = magnet[n][i-1];
}
magnet[n][0] = temp;
break;
//n번 자석 반시계방향으로 1칸 회전
case -1:
temp = magnet[n][0];
for(int i=0; i<=6; i++){
magnet[n][i] = magnet[n][i+1];
}
magnet[n][7] = temp;
break;
}
}
void play_cmds(){
for(int i=0; i<K; i++){
num = cmds[i].first;
dir = cmds[i].second;
switch(num){
//1번 자석
case 1:
//2번 자석도 회전이 일어나는 경우,
if(magnet[1][2] != magnet[2][6]){
//3번 자석도 회전이 일어나는 경우,
if(magnet[2][2] != magnet[3][6]){
//4번 자석도 회전이 일어나는 경우,
if(magnet[3][2] != magnet[4][6]){
rotate_magnet(4, -dir);
}
rotate_magnet(3, dir);
}
rotate_magnet(2, -dir);
}
//1번 자석 회전
rotate_magnet(1, dir);
break;
//2번 자석
case 2:
//1번 자석도 회전이 일어나는 경우,
if(magnet[2][6] != magnet[1][2]){
rotate_magnet(1, -dir);
}
//3번 자석도 회전이 일어나는 경우,
if(magnet[3][6] != magnet[2][2]){
//4번 자석도 회전이 일어나는 경우,
if(magnet[4][6] != magnet[3][2]){
rotate_magnet(4, dir);
}
rotate_magnet(3, -dir);
}
//2번 자석 회전
rotate_magnet(2, dir);
break;
//3번 자석
case 3:
//4번 자석도 회전이 일어나는 경우,
if(magnet[3][2] != magnet[4][6]){
rotate_magnet(4, -dir);
}
//2번 자석도 회전이 일어나는 경우,
if(magnet[3][6] != magnet[2][2]){
//1번 자석도 회전이 일어나는 경우,
if(magnet[1][2] != magnet[2][6]){
rotate_magnet(1, dir);
}
rotate_magnet(2, -dir);
}
//3번 자석 회전
rotate_magnet(3, dir);
break;
//4번 자석
case 4:
//3번 자석도 회전이 일어나는 경우,
if(magnet[4][6] != magnet[3][2]){
//2번 자석도 회전이 일어나는 경우,
if(magnet[3][6] != magnet[2][2]){
//1번 자석도 회전이 일어나는 경우,
if(magnet[2][6] != magnet[1][2]){
rotate_magnet(1, -dir);
}
rotate_magnet(2, dir);
}
rotate_magnet(3, -dir);
}
//4번 자석 회전
rotate_magnet(4, dir);
break;
}
}
}
int main(int argc, const char * argv[]) {
int test_case;
int T, num, dir;
cin >> T;
for(test_case=1; test_case<=T; ++test_case){
//cmds, answer 초기화
cmds.clear();
answer = 0;
cin >> K;
for(int i=1; i<5; i++){
for(int j=0; j<8; j++){
cin >> magnet[i][j];
}
}
for(int i=0; i<K; i++){
cin >> num >> dir;
cmds.push_back({num, dir});
}
play_cmds();
//점수 구하기
for(int i=1; i<5; i++){
if(magnet[i][0]) answer += pow(2, i-1);
}
cout << "#" << test_case << " " << answer << endl;
}
return 0;
}
//시간복잡도 = T(T*K) -> O(n), 공간복잡도 = O(1)
728x90
반응형
'코테 노트 > SWEA' 카테고리의 다른 글
SWEA4014 [모의 SW 역량테스트] 활주로 건설 C++ (0) | 2021.10.16 |
---|---|
SWEA2382 [모의 SW 역량테스트] 미생물 격리 C++ (0) | 2021.10.16 |
SWEA 4012 [모의 SW 역량테스트] 요리사 C++ (0) | 2021.10.15 |
SWEA 5658 [모의 SW 역량테스트] 보물상자 비밀번호 C++ (0) | 2021.02.03 |
SWEA 5653 [모의 SW 역량테스트] 줄기세포배양 C++ (0) | 2021.01.30 |