반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
05-19 00:03
관리 메뉴

ImJay

[BOJ/Java] 1244. 스위치 켜고 끄기 본문

알고리즘/구현

[BOJ/Java] 1244. 스위치 켜고 끄기

ImJay 2024. 1. 29. 23:22
반응형

[BOJ/Java] 1244. 스위치 켜고 끄기

 

1244번: 스위치 켜고 끄기

첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩

www.acmicpc.net


해설

풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // 스위치 개수 입력 받기
        int sw = Integer.parseInt(br.readLine());

        // 스위치 상태 입력 받기
        String input = br.readLine();
        StringTokenizer st = new StringTokenizer(input);
        int[] arr = new int[sw];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        // 학생 수 입력 받기
        int n = Integer.parseInt(br.readLine());
        for (int i = 0; i < n; i++) {
            input = br.readLine();
            st = new StringTokenizer(input);

            int s = Integer.parseInt(st.nextToken()); // 학생의 성별
            int c = Integer.parseInt(st.nextToken()); // 학생이 받은 수

            // 남학생일 경우
            if (s == 1) {
                int count = 1;
                int oriC = c;
                // 받은 수의 배수에 해당하는 스위치 상태 변경
                do {
                    arr[c - 1] = arr[c - 1] == 1 ? 0 : 1;
                    count++;
                    c = oriC * count;
                } while (c - 1 < sw);
            }
            // 여학생일 경우
            else if (s == 2) {
                int newX1 = c - 1;
                int newX2 = c - 1;
                arr[c - 1] = arr[c - 1] == 1 ? 0 : 1;
                // 가장 많은 스위치를 포함하는 구간을 찾아 스위치 상태 변경
                do {
                    newX1--;
                    newX2++;
                    if (0 <= newX1 && newX2 < sw) {
                        if (arr[newX1] == arr[newX2]) {
                            arr[newX1] = arr[newX1] == 1 ? 0 : 1;
                            arr[newX2] = arr[newX1];
                        } else {
                            break;
                        }
                    } else {
                        break;
                    }
                } while (true);
            }
        }
        // 출력
        for (int i = 0; i < arr.length; i++) {
            sb.append(arr[i]);
            if ((i + 1) % 20 == 0) {
                sb.append("\n");
            } else {
                sb.append(" ");
            }
        }
        System.out.print(sb);
    }
}

 

반응형
Comments