99클럽 코테 스터디 TIL - 백준 스위치 켜고 끄기

혀니·2024년 4월 11일

코딩 TIL

목록 보기
14/28



백준 1244 실버4 스위치 켜고 끄기

문제 자체는 굉장히 쉬웠다 :D
그래서 그냥 구현문제 느낌으로 생각나는대로 구현하였다.
코드가 더러워보이긴 하지만 금방 성공 :D

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    private static int N;
    private static int arr[]; // 각 스위치의 상태

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

        N = Integer.parseInt(br.readLine()); //스위치 개수
        arr = new int[N+1];

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

        int M = Integer.parseInt(br.readLine()); // 학생의 수
        int student[][] = new int[M][2];
        String str;
        for(int i=0;i<M;i++){
            str = br.readLine();
            student[i][0] = Integer.parseInt(str.split(" ")[0]); //성별 남1 여2
            student[i][1] = Integer.parseInt(str.split(" ")[1]); //받은 수

            if(student[i][0] == 1){
                //남학생
                for(int j=N;j>=student[i][1];j--){
                    if(j % student[i][1] == 0){
                        //배수면
                        trans(j);
                    }
                }
            } else{
                //여학생
                int start = student[i][1];
                int end = student[i][1];
                trans(student[i][1]);

                while(start >= 2 && end <= N-1){
                    if(arr[start - 1] == arr[end + 1]){
                        trans(start - 1);
                        trans(end + 1);
                        start--;
                        end++;
                    } else{
                        break;
                    }
                }
            }
        }

        StringBuilder stringBuilder = new StringBuilder();
        for(int i=1;i<=N;i++){
            stringBuilder.append(arr[i]).append(" ");
            if(i!=1 && i % 20 == 0){
                stringBuilder.append("\n");
            }
        }

        System.out.println(stringBuilder);

    }

    private static void trans(int num){ //스위치 상태 변환
        if(arr[num] == 0){
            arr[num] = 1;
        } else{
            arr[num] = 0;
        }
    }

}

하지만 코드가 너무 길어서 자바로 더 짧게 할 수 있나 궁금해졌다.
그래서 다른 사람 숏코딩 어떻게 했나 봤는데 비트연산...!!

^ XOR 비트연산을 사용해서 스위치 값이 1이면 0, 0이면 1로 결과가 나온다.

숏코딩은 대부분 비트연산을 사용하는 것 같다 :(

0개의 댓글