코딩테스트/BOJ

[BOJ] 1244 스위치 켜고 끄기 - JAVA

5월._. 2022. 2. 13.
728x90

1. 문제

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

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

스위치가 꺼져있으면 0, 켜져있으면 1이다.

남자는 1, 여자는 2다.

학생들은 1이상 스위치 개수 이하의 자연수를 받는다.

남학생은 본인 번호의 배수 스위치를 바꾼다.

여학생은 본인 번호 기준으로 양 옆이 대칭이 아니게 될 때까지 넓혀가면서 바꾼다. 


2. 풀이

  1. 스위치 배열은 좀 더 편하게 코딩하기 위해 boolean으로 설정했다.
  2. 남학생=> 본인번호-1을 시작으로 배수마다 상태를 바꿔줬다.
  3. 여학생=> 본인번호-1을 먼저 바꿔준 뒤, idx = 1부터 스위치[본인번호-idx]!=스위치[본인번호+idx]일때까지 계속 바꿨다. 바꾸고 난 뒤에는 idx+1을 해 다음 비교를 할 수 있도록 했다.
import java.io.*;
import java.util.*;

public class BOJ_1244_스위치켜고끄기 {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int N = Integer.parseInt(in.readLine());
        st = new StringTokenizer(in.readLine());

        boolean[] switches = new boolean[N];
        for(int i=0;i<N;i++) switches[i] = st.nextToken().equals("1");

        int number = Integer.parseInt(in.readLine());

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

            switch(gender){

                case "1":
                    for(int j=num-1;j<N;j+=num) switches[j] = !switches[j];
                    break;
                case "2":
                    num -= 1;
                    switches[num] = !switches[num];
                    int idx = 1;
                    while(num-idx>=0 && num+idx<N && switches[num-idx]==switches[num+idx]){
                        switches[num-idx] = !switches[num-idx];
                        switches[num+idx] = !switches[num+idx];
                        ++idx;
                    }
                    break;
            }
        }

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

            if(i%20==19) sb.append("\n");
        }

        System.out.println(sb);
    }


}

3. 결과

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 2559 수열 - JAVA  (0) 2022.02.14
[BOJ] 2304 창고 다각형 - JAVA  (0) 2022.02.14
[BOJ] 2628 종이자르기 - JAVA  (0) 2022.02.13
[BOJ] 2635 수 이어가기 - JAVA  (0) 2022.02.12
[BOJ] 10157 자리배정 - JAVA  (0) 2022.02.12

댓글