NullNull

[백준 P1244] 스위치 켜고 끄기 자바 Java 본문

알고리즘

[백준 P1244] 스위치 켜고 끄기 자바 Java

KYBee 2022. 8. 2. 10:16

P1244

문제

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

1부터 연속적으로 번호가 붙어있는 스위치들이 있다. 스위치는 켜져 있거나 꺼져있는 상태이다. ‘1’은 스위치가 켜져 있음을, ‘0’은 꺼져 있음을 나타낸다. 그리고 학생 몇 명을 뽑아서, 학생들에게 1 이상이고 스위치 개수 이하인 자연수를 하나씩 나누어주었다. 학생들은 자신의 성별과 받은 수에 따라 아래와 같은 방식으로 스위치를 조작하게 된다.

남학생은 스위치 번호가 자기가 받은 수의 배수이면, 그 스위치의 상태를 바꾼다. 즉, 스위치가 켜져 있으면 끄고, 꺼져 있으면 켠다.

여학생은 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서, 그 구간에 속한 스위치의 상태를 모두 바꾼다. 이때 구간에 속한 스위치 개수는 항상 홀수가 된다.

입력으로 스위치들의 처음 상태가 주어지고, 각 학생의 성별과 받은 수가 주어진다. 학생들은 입력되는 순서대로 자기의 성별과 받은 수에 따라 스위치의 상태를 바꾸었을 때, 스위치들의 마지막 상태를 출력하는 프로그램을 작성하시오.

입력값

첫째 줄 : 스위치의 개수 (0 ≤ 스위치의 개수 ≤ 100)

둘째 줄 : 스위치의 상태

셋째 줄 : 학생 수 (0 ≤ 학생 수 ≤ 100)

넷째 줄 이후 : 학생의 성별, 학생이 받은 수 (남학생 : 1, 여학생 : 2, 0≤ 학생이 받은 수 ≤ 스위치의 개수)

8
0 1 0 1 0 0 0 1
2
1 3
2 3
4
0 0 0 0
3
1 1
2 2
2 3

출력값

스위치의 상태를 1번 스위치에서 시작하여 마지막 스위치까지 한 줄에 20개씩 출력한다. 예를 들어 21번 스위치가 있다면 이 스위치의 상태는 둘째 줄 맨 앞에 출력한다. 켜진 스위치는 1, 꺼진 스위치는 0으로 표시하고, 스위치 상태 사이에 빈칸을 하나씩 둔다.

1 0 0 0 1 1 0 1
0 0 1 1

알고리즘

문제에서 설명한 대로 코드를 작성하면 풀리는 문제였다. 단 주의할 점은 출력 형식이 정해져 있어서 이를 정확하게 읽고 문제를 풀어야 한다.

남학생과 여학생이 버튼을 누르는 방식이 다르기 때문에 분기 처리 해야 한다. 따라서 입력 값을 받은 뒤 성별에 따라 다른 동작을 하도록 구현했다.

남학생은 받은 번호를 경계가 넘지 않는 범위까지 더하면서 스위치 상태를 변경했고, 여학생은 우선 받은 번호의 스위치 상태를 변경한 이후에 좌우를 확인하여 대칭이 아니거나 경계 값이 넘을 때 까지 스위치를 확인하도록 했다.

스위치의 개수가 100개 밖에 안되긴 하지만 int 배열보다는 boolean 배열을 사용하여 메모리를 미세하게 덜 사용하려 했다.

코드

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

public class Main {

    // 0과 1만 저장, 그리고 ! 연산 사용을 위해 boolean 배열로 선언
    private static boolean[] switches;
    private static int N, M;
    private static int student, number;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        N = Integer.parseInt(br.readLine());
        switches = new boolean[N + 1];

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

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

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

            if (student == 1) {
                int idx = number;
                while (idx <= N) {
                    switches[idx] = !switches[idx];
                    idx += number;
                }
            } else {
                int left = number - 1;
                int right = number + 1;
                switches[number] = !switches[number];
                while (1 <= left && right <= N) {
                    if (switches[left] == switches[right]) {
                        switches[left] = !switches[left--];
                        switches[right] = !switches[right++];
                    } else {
                        break;
                    }
                }
            }
        }

        for (int i = 1; i <= N; i++) {
            if (switches[i]) System.out.print("1 ");
            else System.out.print("0 ");

            if (i % 20 == 0) System.out.println();
        }
        System.out.println();
    }
}
Comments