코테 노트/SWEA

SWEA 4013 [모의 SW 역량테스트] 특이한 자석 C++

화요밍 2021. 10. 15. 20:14
728x90
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeV9sKkcoDFAVH&categoryId=AWIeV9sKkcoDFAVH&categoryType=CODE&problemTitle=모의&orderBy=PASS_RATE&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 

 

최종 코드

 

GitHub - hwayeon351/SWEA-Algorithms: SWEA 알고리즘 소스 코드 모음

SWEA 알고리즘 소스 코드 모음. Contribute to hwayeon351/SWEA-Algorithms development by creating an account on GitHub.

github.com

//
//  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
반응형