본문으로 바로가기

[SWEA] 4013번 특이한 자석

category Algorithm/SWEA 문제풀이 2019. 3. 15. 15:31
4013_특이한 자석

4013번 특이한 자석

문제 링크


 

해결방법

주어진 조건을 구현하는 시뮬레이션 문제이다

삼성 기출문제인 톱니바퀴 문제와 동일하다

 

 

⭐️ 솔루션 ⭐️

저번에 풀었던 문제인데도 좌•우 회전이 헷갈렸다

leftValuerightValue 값을 갱신해가며 회전 여부를 파악하면 됐다

또한 점수를 매기는 방식이 헷갈렸는데 구글링을 통해 간단한 방법을 찾았다

 

문제 조건

  • 8개의 전극을 가지고 있는 자석이 총 4개
  • 서로 다른 극이 접해야 회전을 함

 

 

소스코드

문제 해결 시간 : 1h

메모리 : 12488 KB

시간 : 6 ms

#include <iostream>
#include <algorithm>
using namespace std;

int testcase;
int k,ind,dir,ans,sum;
int magnet[5][9];

void rotateMagnet(int i,int d){
    // 시계 방향 회전
    if(d == 1){
        int tmp = magnet[i][8];
        for(int j=8; j>=2; j--){
            magnet[i][j] = magnet[i][j-1];
        }
        magnet[i][1] = tmp;
    }
    // 반시계 방향 회전
    else{
        int tmp = magnet[i][1];
        for(int j=1; j<=7; j++){
            magnet[i][j] = magnet[i][j+1];
        }
        magnet[i][8] = tmp;
    }
}

void go(){
    // 현재 자석 정보
    int leftValue = magnet[ind][7];
    int rightValue = magnet[ind][3];
    
    // 해당 자석 회전
    rotateMagnet(ind, dir);
    
    // 왼쪽 회전
    int d = dir;
    for(int i=ind-1; i>=1; i--){
        if(leftValue != magnet[i][3]){
            d *= -1;
            leftValue = magnet[i][7];
            rotateMagnet(i,d);
        }else{
            break;
        }
    }
    
    // 오른쪽 회전
    d = dir;
    for(int i=ind+1; i<=4; i++){
        if(rightValue != magnet[i][7]){
            d *= -1;
            rightValue = magnet[i][3];
            rotateMagnet(i,d);
        }else{
            break;
        }
    }
}

int main(int argc, const char * argv[]) {
    // cin,cout 속도향상
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    cin >> testcase;
    for(int tc=1; tc<=testcase; tc++){
        cin >> k;
        
        for(int i=1; i<=4; i++){
            for(int j=1; j<=8; j++){
                cin >> magnet[i][j];
            }
        }
        for(int i=0; i<k; i++){
            cin >> ind >> dir;
            go();
        }
        
        ans = 0;
        sum = 1;
        for(int i=1; i<=4; i++){
            if(magnet[i][1] == 1){
                ans += sum;
            }
            sum *= 2;
        }
        
        cout << "#" << tc << " " << ans << "\n";
    }
    
    return 0;
}

'Algorithm > SWEA 문제풀이' 카테고리의 다른 글

[SWEA] 5644번 무선 충전  (0) 2019.03.15
[SWEA] 4014번 활주로 건설  (0) 2019.03.15
[SWEA] 4012번 요리사  (0) 2019.03.15
[SWEA] 4008번 숫자 만들기  (0) 2019.03.15
[SWEA] 2383번 점심 식사시간  (0) 2019.03.15