CodeClover
[JAVA] 백준 1244_스위치 켜고 끄기 본문
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)입니다.
'코딩테스트' 카테고리의 다른 글
| [JAVA] 백준 10816_숫자카드2 (0) | 2025.04.13 |
|---|---|
| [JAVA] 백준 4158_CD (1) | 2025.04.11 |
| [JAVA] 백준 1251_단어 나누기 (2) | 2025.04.09 |
| [JAVA] 백준 4592_중복을 없애자 (0) | 2025.04.07 |
| [JAVA] 백준 18352_특정 거리의 도시 찾기 (0) | 2025.02.16 |