본문 바로가기
PS/BOJ

[자바] 백준 1244 - 스위치 켜고 끄기 (java)

by Nahwasa 2022. 8. 30.

 문제 : boj1244


 

필요 알고리즘 개념

  • 시뮬레이션 (구현)
    • 주어진 대로 구현만 가능하다면 풀 수 있는 문제이다.

※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.

 


 

풀이

  주어진대로 구현만 해주면 된다. 로직은 다음과 같다.

 

1. 스위치 개수 n을 입력받아 해당하는 크기의 배열을 만든다. 그리고 n개의 현재 상태를 입력받아 배열에 넣어둔다. 이 때 어차피 스위치가 켜져있는지 꺼져있는지만 알면 되므로, int 배열로 해도 되고 boolean 배열로 해도 되고 마음대로 해도 된다.

 

2. 학생수를 입력받고 각 학생의 정보를 입력받는다. 각각의 입력에 대해 2.1, 2.2를 수행한다.

2.1 남학생일 경우, 스위치 번호 x에 대해.x, 2x, 3x, 4x, .... (n 이하인 동안)를 켜져있다면 끄고, 꺼져있다면 켠다.

2.2 여학생일 경우, x를 변경하고, x+-1이 동일하다면 둘다 변경, x+-2가 동일하다면 둘다 변경, ... x+-y가 동일하지 않다면 거기서 멈춘다.

 

3. 20개씩 끊어서 출력해준다.

 


 

코드 : github

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

public class Main {
    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        boolean[] arr = new boolean[n+1];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 1; i <= n; i++) arr[i] = st.nextToken().charAt(0)=='0'?false:true;
        int k = Integer.parseInt(br.readLine());
        while (k-->0) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            switch (a) {
                case 1:
                    int tmp = b;
                    while (tmp <= n) {
                        arr[tmp] = !arr[tmp];
                        tmp += b;
                    }
                    break;
                case 2 :
                    arr[b] = !arr[b];
                    int len = Math.min(b-1, n-b);
                    for (int i = 1; i <= len; i++) {
                        if (arr[b-i] != arr[b+i]) break;
                        arr[b-i] = !arr[b-i];
                        arr[b+i] = !arr[b+i];
                    }
                    break;
            }
        }
        StringBuilder sb = new StringBuilder();
        int cnt = 0;
        for (int i = 1; i <= n; i++) {
            sb.append(arr[i]?1:0).append(' ');
            cnt++;
            if (cnt == 20) {
                cnt = 0;
                System.out.println(sb);
                sb = new StringBuilder();
            }
        }
        System.out.println(sb);
    }

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

댓글