ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SWEA 4013 : [모의 SW 역량테스트] 특이한 자석
    백준 문제풀이/etc 2020. 6. 6. 16:29

    문제


     

    문제 풀어보기

     

     

    풀이


     

    먼저 4개의 톱니바퀴를 어떤방향으로 돌릴것인지

    배열에 결정해준다.

     

    배열을 돌면서 톱니바퀴를 돌려준다.

     

    한비트 쉬프트하며 정답에 더해준다.

     

     

     

     

    코드


    #include <iostream>
    #include <vector>
    #include <queue>
    #include <algorithm>
    #include <tuple>
    
    
    
    using namespace std;
    //#define safe(x,y) x>=n || x<0 || y<0 || y>=n
    
    //int dx[] = { -1 , 1, 0,0};
    //int dy[] = { 0,0, -1, 1 };
    ////위 오른쪽 아래 왼쪽
    
    //int dx[] = { -1, 1, 1, -1 };
    //int dy[] = { 1, 1, -1 , -1 };
    // 대각선
    
    vector< vector<int>> v(4, vector<int>(8, 0));
    // 회전방향 결정
    void go(vector<int>& dir, int index) {
    
    	int tmp = index;
    	// 왼쪽 톱니바퀴
    	while (tmp--) {
    
    		if (v[tmp][2] != v[tmp + 1][6]) {
    			dir[tmp] = -dir[tmp + 1];
    		}
    		else break;
    
    	}
    
    	tmp = index;
    	// 오른쪽 톱니바퀴
    	while (tmp++ < 3) {
    		if (v[tmp][6] != v[tmp - 1][2]) {
    			dir[tmp] = -dir[tmp - 1];
    		}
    		else break;
    	}
    
    }
    
    // 회전
    void spin(int index, int d) {
    	int tmp;
    	if (d == 1) {
    		tmp = v[index][7];
    		for (int i = 7; i > 0; i--) {
    			v[index][i] = v[index][i - 1];
    		}
    		v[index][0] = tmp;
    	}
    	else if( d==-1) {
    		tmp = v[index][0];
    		for (int i = 0; i < 7; i++) {
    			v[index][i] = v[index][i + 1];
    		}
    		v[index][7] = tmp;
    	}
    }
    
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(NULL);
    
    
    	int T;
    	cin >> T;
    
    	for (int test = 1; test <= T; test++) {
    
    		int n;
    		cin >> n;
    		for (int i = 0; i < 4; i++) {
    			for (int j = 0; j < 8; j++) {
    				cin >> v[i][j];
    			}
    		}
    
    		for (int e = 0, index, d; e < n; e++) {
    			cin >> index >> d;
    			index -= 1;
    			vector<int> dir(4,0);
    			dir[index] = d;
    			go(dir, index);
    
    			for (int j = 0; j < 4; j++) {
    				spin(j, dir[j]);
    			}
    
    		}
    		int ans = 0;
    		for (int i = 0; i < 4; i++) {
    			if (v[i][0] == 1) {
    				ans += (1 << i);
    			}
    		}
    
    
    		cout << "#" << test << ' ';
    		cout << ans << endl;
    
    
    	}
    
    
    
    	return 0;
    }

     

    '백준 문제풀이 > etc' 카테고리의 다른 글

    BOJ 10828 : 스택  (0) 2020.07.09
    BOJ 1406 : 에디터  (0) 2020.06.05
    BOJ 9663 : N-Queen  (0) 2020.05.19
    BOJ 17140 : 이차원 배열과 연산  (0) 2020.05.10
    BOJ 17143 : 낚시왕  (0) 2020.05.04

    댓글

Designed by Tistory.