우매함의 봉우리를 넘어서며 개발하면서 기록하기

백준 1244. 스위치 켜고 끄기


문제 바로가기

스위치 켜고 끄기


문제 요약

1부터 연속적으로 번호가 붙어있는 스위치들이 있다. 이 스위치는 켜져 있거나((1) 꺼져 있는(0) 의 상태이다. 그리고, 학생 몇 명을 뽑아 몇개의 스위치를 켜고 끌 기회를 준다.

남학생은 자기가 받은 수와 그 배수의 스위치들의 상태를 모두 바꾼다. 그 예시는 아래와 같다.


BJ_1244(1)


위 그림과 같이 남학생이 3번을 받았다면 3번, 6번 스위치의 상태를 바꾼다.

여학생은 자기가 받은 번호를 기준으로 양옆으로 뻗어나가면서 대칭이 되는지 확인하여 대칭인 스위치만 모두 바꾼다. 이때, 대칭이 되지 않는 스위치가 나타나면 그 이전까지의 스위치만 상태를 바꾼다.


BJ_1244(2)


위 그림과 같이 여학생이 3번 스위치를 받았다면 3번을 기준으로 2번과 4번, 1번과 5번을 모두 비교하고 상태가 같기 때문에 각 스위치의 상태를 바꾼다. 1번 왼쪽에는 스위치가 없기 때문에 더이상 가지 않는다.

이때, 입력값에 따른 스위치의 마지막 상태를 출력하여라.


문제 풀이 포인트


굉장히 간단한 구현문제로 처음 스위치의 상태를 배열에 저장한 후 남학생과 여학생에 따라 스위치의 상태를 조정하면 되는 문제이다.

신경써야할 문제의 포인트는

  1. 남학생의 경우, 스위치 숫자의 배수로 진행하여야 하기 때문에 반복문을 통해 상태를 변화시켜주어야 한다.
  2. 여학생의 경우, 대칭을 계속 확인해주어야 하는 문제가 있다. 또한, 배열의 인덱스 바깥으로 나가지 않게 신경써야 하며 대칭을 확인할 때, 대칭이 성립하지 않은 스위치는 상태를 바꾸지 말아야 한다.
  3. 출력할때, 한 줄에 20개씩 출력을 하여야 하므로, 20으로 나눈 나머지가 0일 때 줄바꿈 기호를 추가한다.

문제 코드[JAVA]

코드 펼치기


import java.io.FileInputStream;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
      Scanner sc = new Scanner(System. in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        int stu = sc.nextInt();
        for (int i = 0; i < stu; i++) {
            int sex = sc.nextInt();
            int number = sc.nextInt();
            if (sex == 1) {
                int k = 1;
                int idx = number - 1; // 스위치 배열을 건드리기 위해
                while (idx < n) { // number의 배수만큼 반복시키기 위해
                    arr[idx] = (arr[idx] == 1)? 0 : 1;
                    idx = (number * ++k) - 1;
                }
            } else if (sex == 2) {
                number = number - 1; // 스위치의 배열 index와 맞추기 위하여
                int k = number - 1; // 선택한 스위치 앞
                int p = number + 1; // 선택한 스위치 뒤
                while (k >= 0 && p < n) {
                    if (arr[k] != arr[p]) // 대칭
                        break;
                    k--;
                    p++;
                }
                for (int j = k + 1; j < p; j++) {
                    arr[j] = (arr[j] == 1)? 0: 1;
                }
            }
        }
        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
            if (i != 0 && (i + 1) % 20 == 0) 
                System.out.println();
            }
        sc.close();
    }
}