삽질메모장

백준 1244번: 스위치 켜고 끄기(java) 본문

Knowledge/알고리즘

백준 1244번: 스위치 켜고 끄기(java)

shovel 2023. 12. 6. 15:47

 

문제

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

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

 

접근법

binary 한 데이터 배열들을 입력 받으면 boolean 으로 변환하는 것을 고려해봐야한다.

이 경우에도 1, 0의 데이터를 직접 입력 할 필요없이 boolean으로 상태값에 not 연산을 하여 변경해주는것이 깔끔하게 쓰기 좋다.

(1) 1, 0 을 각각 true false 로 배열을 선언하여 입력 받는다.

(2) 성별, 숫자 값을 배열로 받아 첫번째 인덱스 "성별"에 따라 조건 분기 

(3) 남자의 경우 배수 연산

(4) 여자의 경우 입력값 -1, 입력값 +1 의 값이 같은지 비교하며 반복, 같지 않다면은 break 한다.

(5) 20라인 마다 줄바꿈을 요청했기에 i%20 = 0 일때마다 줄바꿈 문자를 추가한다.

 

풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class BOJ1244 {
    public static void main(String[] args)throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int switchNum = Integer.parseInt(bf.readLine());
        StringTokenizer st = new StringTokenizer(bf.readLine());
        boolean[] switchStatus = new boolean[switchNum];


        for(int i =0; i< switchNum; i++){
            String str =st.nextToken();
            if(str.equals("1")){
                switchStatus[i] = true;
            }else{
                switchStatus[i] = false;
            }
        }
        int studentNum = Integer.parseInt(bf.readLine());

        for(int i=0; i<studentNum; i++){
            String[] MWindex = bf.readLine().split(" ");
            int pos = Integer.parseInt(MWindex[1])-1;
            if(MWindex[0].equals("1")){
                for(int m =pos; m<switchNum; m+=(pos+1)){
                    switchStatus[m] = !switchStatus[m];
                }
            }else{
                switchStatus[pos] = !switchStatus[pos];
                for(int w = 1; w<switchNum; w++){
                    if((pos-w) < 0 || (pos+w) >= switchNum){
                        break;
                    }
                    if(switchStatus[pos-w] == switchStatus[pos+w] ) {
                        switchStatus[pos-w] = !switchStatus[pos-w];
                        switchStatus[pos+w] = !switchStatus[pos+w];
                    }else{
                        break;
                    }
                }
            }
        }
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<switchNum; i++){
            if(i%20 ==0 && i !=0){ // i = 0 일떄 0%20 = 0 이므로 조건 추가
                sb.append("\n");
            }
            sb.append(((switchStatus[i]) ? 1 : 0 )+" "); 

        }
        System.out.println(sb);
    }
}