본문 바로가기
코딩테스트 준비/백준

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

by mwzz6 2025. 2. 13.

https://www.acmicpc.net/problem/1244

 

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


1.  아이디어

 

구현 문제로 남학생은 for문, 여학생은 while문을 활용해서 스위치의 상태 변경을 처리했다.


2. 문제풀이

 

스위치는 boolean 타입 배열로 처리했다.

남학생은 받은 번호와 그 배수를 전부 바꾸므로 for문에서 인덱스를 번호만큼 더하도록 갱신해서 배수 번호 처리를 했다.

여학생은 좌우로 같은 칸에 대해 탐색하므로 k를 while문 외부에서 인덱스로 설정해서 범위 안이면서 같으면 변경을 해줬다. 이때 받은 번호도 변경을 해줘야하는데 k=0으로 변경을 시도하면 받은 번호는 두 번 스위치가 바뀌어서 원상태가 됨에 주의해야 한다.


3. 코드

 

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

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

        boolean[] lightArr = new boolean[1 + N];
        st = new StringTokenizer(br.readLine());
        for (int i = 1; i <= N; i++) {
            lightArr[i] = Integer.parseInt(st.nextToken()) == 1;
        }

        int M = Integer.parseInt(br.readLine());
        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int gender = Integer.parseInt(st.nextToken());
            int num = Integer.parseInt(st.nextToken());

            if (gender == 1) {
                for (int j = num; j <= N; j += num) {
                    lightArr[j] = !lightArr[j];
                }
            } else {
                lightArr[num] = !lightArr[num];

                int k = 1;
                while ((num - k >= 1) && (num + k <= N) && (lightArr[num - k] == lightArr[num + k])) {
                    lightArr[num - k] = !lightArr[num - k];
                    lightArr[num + k] = !lightArr[num + k];
                    k++;
                }
            }
        }

        for (int i = 1; i <= N; i++) {
            sb.append(lightArr[i] ? 1 : 0).append(" ");
            if (i % 20 == 0) sb.append("\n");
        }

        bw.write(sb.toString());
        bw.flush();
    }
}

4. 후기