본문 바로가기
Algorithm

[백준 Silver 4] 1244 스위치 켜고 끄기 - Java

by Ray 2022. 1. 12.

문제링크 : https://www.acmicpc.net/problem/1244

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

 

접근 과정 : 

  • 문제 그대로 접근했다.
  • 스위치의 상태를 표현할 수 있는 배열을 선언하고.
  • 학생의 성별과 숫자에 따라서 스위치의 상태를 변경했다.

 

소스 코드 및 결과 :

package BOJ;

/* 
    스위치 켜고 끄기
*/


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

public class BOJ1244 {

    public static void main(String[] args) throws NumberFormatException, IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        boolean[] isOn = new boolean[N + 1];

        StringTokenizer st = new StringTokenizer(br.readLine());

        for (int i = 1; i <= N; i++) {
            if (st.nextToken().equals("1")) {
                isOn[i] = true;
            }
        }

        int M = Integer.parseInt(br.readLine());

        while (M-- > 0) {
            st = new StringTokenizer(br.readLine());

            String student = st.nextToken();
            int num = Integer.parseInt(st.nextToken());

            if (student.equals("1")) {

                for (int i = 1; i * num <= N; i++) {
                    reverseSwitch(isOn, num * i);
                }

            } else {

                reverseSwitch(isOn, num);

                int index = 1;
                while (num - index >= 1 && num + index <= N) {

                    if (isOn[num - index] != isOn[num + index]) {
                        break;
                    }
                    reverseSwitch(isOn, num - index);
                    reverseSwitch(isOn, num + index);

                    index++;
                }

            }
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= N; i++) {
            if (isOn[i]) {
                sb.append("1");
            } else {
                sb.append("0");
            }

            if (i >= 20 && i % 20 == 0) {
                sb.append("\n");
            } else {
                sb.append(" ");
            }
        }

        System.out.println(sb.toString().trim());

    }

    private static void reverseSwitch(boolean[] isOn, int num) {

        if (isOn[num]) {
            isOn[num] = false;
        } else {
            isOn[num] = true;
        }

    }
}

 

P.S 

단순히 문제의 지문을 그대로 코드로 바꾸는 문제라고 생각한다.