https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeV9sKkcoDFAVH

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

www.swexpertacademy.com

자석들이 회전할 방향을 미리 저장해놓고 풀면 쉽게 풀 수 있는 문제이다.

회전시킬 자석의 왼편과 오른편 자석들을 모두 회전할지 안 할지 검사한다.

회전을 하게 된다면 옆에 있는 자석의 반대방향으로 회전한다.

 

오른편의 자석들을 검사할 때는 순차적으로 왼쪽 자석의 2번 날과 오른쪽 자석의 6번 날을 비교하여

다를 경우에 오른쪽 자석의 회전 방향을 왼쪽 자석의 회전방향의 반대방향으로 저장한다.

마찬가지로 왼편 자석들을 검사할떄도 왼쪽 자석의 2번 날과 오른쪽 자석의 6번 날을 비교하여

회전 방향을 저장한다. 

날의 자성이 같아서 회전하지 않을 경우에는 그 앞의 자석들도 회전하지 않으므로 검사를 중단한다.

 

회전 방향을 모두 저장해줬다면 이제 모든 자석들을 회전시킨다.

1이면 시계방향 -1이면 반시계방향으로 회전시켜준다.

0인 경우(회전하지 않는 경우)도 있으므로 조건 처리를 정확히 해주어야 한다.

 

회전까지 모두 마쳤다면 점수를 계산해준다.

문제에서의 화살표 방향은 각 자석의 0번째 날이므로 자석들의 0번째 날이 S극인지(1 인지) 확인하여 계산해주면 된다.

점수는 각각 1, 2, 4, 8로 2의 제곱수로 더해지므로 << 연산으로 쉽게 더해줄 수 있다.

( 1<< 0 은 1이므로 1점 /  1<<1 은 10(2진수)으로 2점 / 1<<2는 100(2진수)으로 4점 / 1<< 3 은 1000(2진수)으로 8점)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
using namespace std;
 
int magnet[4][8];
 
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int T;
    cin >> T;
    for (int tc = 1; tc <= T; tc++) {
 
        int k;
        cin >> k;
 
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 8; j++) {
                cin >> magnet[i][j];
            }
        }
 
        while (k-- > 0) {
            int num;
            int dir;
            cin >> num >> dir;
            num -= 1;
 
 
            int dirArr[4= {0,};
            dirArr[num] = dir;
 
 
            //오른쪽 자석 검사
            for (int i = num; i < 3; i++) {
                if (magnet[i][2!= magnet[i+ 1][6]) {
                    dirArr[i + 1= dirArr[i] * -1;
                }
                else {
                    break;
                }
            }
 
 
            //왼쪽 자석 검사
            for (int i = num; i > 0; i--) {
                if (magnet[i][6!= magnet[i - 1][2]) {
                    dirArr[i - 1= dirArr[i] * -1;
                }
                else {
                    break;
                }
            }
 
 
            //회전
            for (int i = 0; i < 4; i++) {
 
                //시계방향 회전
                if (dirArr[i] == 1) {
                    int tmp = magnet[i][7];
                    for (int j = 7; j > 0; j--) {
                        magnet[i][j] = magnet[i][j - 1];
                    }
                    magnet[i][0= tmp;
                }//반시계방향 회전
                else if (dirArr[i] == -1) {
                    int tmp = magnet[i][0];
                    for (int j = 0; j < 7; j++) {
                        magnet[i][j] = magnet[i][j + 1];
                    }
                    magnet[i][7= tmp;
                }
            }
 
        }
 
 
        //점수 계산
        int ans = 0;
        for (int i = 0; i < 4; i++) {
            if (magnet[i][0== 1) {
                ans += (1 << i);
            }
        }
 
        cout << '#' << tc << ' ' << ans << '\n';
 
    }
 
    return 0;
}
Colored by Color Scripter
 

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeV9sKkcoDFAVH

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

www.swexpertacademy.com

풀이

  1. 먼저 각 자석의 자성 정보를 배열에 저장한다.
  2. 입력받은 K번만큼 실행
    1. 회전시킬 자석 번호와 방향을 입력받는다.
    2. 처음 상태에 따라서 회전할지 안 할지가 결정되므로 미리 회전방향을 배열에 저장해놓는다.
    3. 회전시킬 자석의 오른쪽과 왼쪽의 자석들을을 각각 순차적으로 검사한다.
    4. 앞의 자석의 2번째 날과 뒤의 자석의 6번째 날을 비교한다.
    5. 같으면 그쪽 방향의 자석들은 회전하지 않을 것이므로 break
    6. 다르면 현재 회전하는 자석의 반대 방향으로 회전 방향을 저장한다.
    7. 각 자석을 위에서 저장한 회전 정보를 이용하여 회전시켜준다.
      1. 0인 경우는 회전하지 않는 자석
      2. 1인 경우는 시계방향 회전
      3. -1인 경우는 반시계 방향 회전
  3. K번만큼의 회전이 끝난 후에 총점을 계산해준다.
  4. 1,2,4,8 순으로 점수가 늘어나므로 left shift (<<) 연산을 사용해서 sum 변수에 더해줬다.

 

import java.io.*;
import java.util.StringTokenizer;

public class Solution {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		StringTokenizer st;
		for(int tc=1; tc<=T; tc++) {
			int K = Integer.parseInt(br.readLine());
			int[][] info = new int[4][8];
			for(int i=0; i<4; i++) {
				st = new StringTokenizer(br.readLine());
				for(int j=0; j<8; j++) {
					info[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			
            //명령을 K번 실행
			for(int i=0; i<K; i++) {
				st = new StringTokenizer(br.readLine());
				int num = Integer.parseInt(st.nextToken())-1;
				int dir = Integer.parseInt(st.nextToken());
                
				int[] rotation = new int[4]; //회전할 방향을 저장
				rotation[num] = dir;
				
                
                //오른쪽 자석들을 검사
				for(int j=num+1; j<4; j++) {
					if(info[j-1][2] == info[j][6]) //자성이 같으면 회전하지 않는다.
						break;
					else
						rotation[j] = -rotation[j-1];
				}
				
                
                //왼쪽 자석들을 검사
				for(int j=num-1; j>=0; j--) {
					if(info[j][2] == info[j+1][6]) //자성이 같으면 회전하지 않는다.
						break;
					else
						rotation[j] = -rotation[j+1];
				}
				
				
                //각 자석을 회전시킨다.
				for(int j=0; j<4; j++) {
					if(rotation[j] == 0) continue; //회전하지 않는 경우
					else if(rotation[j] == 1) { // 시계방향 회전
						int tmp = info[j][7];
						for(int k=7; k>0; k--) {
							info[j][k] = info[j][k-1];
						}
						info[j][0] = tmp;
					} else if(rotation[j] == -1) { // 반시계방향 회전
						int tmp = info[j][0];
						for(int k=0; k<7; k++) {
							info[j][k] = info[j][k+1];
						}
						info[j][7] = tmp;
					}
				}
				
			}
			
            
            //모든 실행이 끝난 후 총합을 계산
			int sum = 0;
			for(int i=0; i<4; i++) {
				if(info[i][0] == 1) {
					sum += 1<<i;
				}
			}
			
			System.out.println("#"+tc+" "+sum);
		}	
	}

}

+ Recent posts