CodeClover

[JAVA] 백준 1244_스위치 켜고 끄기 본문

코딩테스트

[JAVA] 백준 1244_스위치 켜고 끄기

coding dew 2025. 4. 10. 16:23

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

📌 문제 탐색하기

구현문제 유형
입력받은 스위치 개수에 맞춰서 0,1으로 스위치 꺼짐/켜짐 상태가 주어지고 각각 입력받은 학생의 성별/스위치 번호에 따라서 
남학생은 입력받은 스위치 번호 + 스위치 번호 배수별로 스위치 상태 변경 가능.
여학생은 입력받은 스위치 번호 + 앞뒤 대칭이 맞는다면 대칭이 맞는 범위까지 스위치 상태 변경 가능하다.

최종적으로 학생들이 상태 변경 끝낸 뒤 스위치들의 상태를 출력하는 문제이다. 

📌 코드 설계하기

우선, N개의 스위치 개수 , N개의 스위치 상태 배열, 학생수, 학생 성별,스위치 번호 배열 입력 받기.
if 조건문으로 남학생인 경우 : 남학생이 부여받은 스위치 번호 + ( 스위치번호 ) ,,, 반복해서 스위치 번호의 배수번호들 상태 변경하기
여학생인 경우 : ( 여기가 조금 생각이 많이 들었음 ) 여학생이 부여받은 스위치 번호 + ( 스위치 번호의 +1 , -1의 상태가 동일한지 체크 - 동일하다면 어디까지 동일한지 체크 !!! )
최종적인 스위치 상태 배열 출력하기.

📌 정답 코드

import java.util.*;

public class Main {
    public int[] solution(int N,int[] switches ,int[][] students){
        for(int[] x : students){
            int gender = x[0];
            int switchNumber = x[1];

            if(gender == 1){ //남자
                for(int i = switchNumber; i<=N; i+=switchNumber){ //입력받은 스위치 번호 배수....
                    switches[i] = switches[i] == 0 ? 1 : 0 ;
                }
            }else{ //여자
                switches[switchNumber] = switches[switchNumber] == 0 ? 1 : 0;
                int check = 1;
                while(switchNumber - check >= 1 && switchNumber + check <= N){
                    if(switches[switchNumber - check] == switches[switchNumber + check]){
                        switches[switchNumber - check] = switches[switchNumber -check ] == 0 ? 1:0;
                        switches[switchNumber + check] = switches[switchNumber +check ] == 0 ? 1:0;
                        check ++;
                    }else break;
                }

            }
        }
        return switches;
    }

    public static void main(String[] args){
        Main T = new Main();

        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        // int[] switches = new int[N]; //실수01
        int[] switches = new int[N+1];

     // for(int i=0; i<=N; i++){ //실수01 
        for(int i=1; i<=N; i++){
            switches[i] = sc.nextInt();
        }

        int studentNum = sc.nextInt(); //학생수
        int[][] students = new int[studentNum][2];

        for(int i=0; i<studentNum;i++){
            students[i][0] = sc.nextInt(); //학생 성별 ( 남 : 1 , 여 : 2 )
            students[i][1] = sc.nextInt(); // 학생별 스위치 번호
        }

        int[] result = T.solution(N,switches,students);
        
        //실수02
        for(int i=1; i<=N; i++){
            System.out.print(result[i] + " ");
            if(i % 20 == 0){
                System.out.println();
            }
        }

        sc.close();

    }
}

 

📌 실수 01 ) 에러 

코드 실행하니까 오류 발생... ?! 
원래 0부터 N-1까지 인덱스를 가지는 배열을 생성하는데 문제를 보면 스위치 번호는 0이 아니라 1부터이고, 학생들에게 부여되는 번호도 1 ~ N까지이므로  i =1 부터 시작해야하고 , 배열의 크기를 N+1으로 만들어야한다.

지금 내가 잘못 작성한 부분의 코드에서는 0부터 N-1까지 인덱스를 가지는 배열을 생성하고 스위치는 1번 부터 값을 가지고 있기 때문에 switches[N]에 접근시 배열의 크기 0 - N-1까지 인덱스 유효값을 초과해서 접근하기때문에 오류가 발생하는거.!!

📌 실수 02 )  틀렸습니다. 

" 스위치의 상태를 1번 스위치에서 시작하여 마지막 스위치까지 한 줄에 20개씩 출력한다. 예를 들어 21번 스위치가 있다면 이 스위치의 상태는 둘째 줄 맨 앞에 출력한다. 켜진 스위치는 1, 꺼진 스위치는 0으로 표시하고, 스위치 상태 사이에 빈칸을 하나씩 둔다. "
문제에서 이 부분에 대한 조건을 빼먹었음...ㅠ 

📌 가능한 시간복잡도

남학생이 받은 번호의 배수의 위치하는 스위치들의 상태 변경하는 경우 시간 복잡도 O(N) 
여학생이 받은 번호 기준 좌우 대칭인 스위치들의 상태 변경하는 경우 시간 복잡도 O(N)
따라서, 입력받는 학생의 수 S만큼 진행되기때문에... 가능한 시간복잡도는 O(S*N)입니다.