-
[java] 백준 1244 스위치 켜고 끄기알고리즘 2023. 5. 3. 22:50
문제
https://www.acmicpc.net/problem/1244
1244번: 스위치 켜고 끄기
첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩
www.acmicpc.net
풀이
잘못된 코드
런타임 에러 (ArrayIndexOutOfBounds)
발생원인은 a가 1이 될 수 있어 조건문을 세워 1보다 크고 N보다 작은 배열값만 확인하게 바꿔야된 다는 것이었다.
arraylist배열 방식과 if문으로 1,0을 확인하는게 효율적이지 못해서 바꿨다
package main; import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); //스위치의 개수 int[] arr = new int[N+1]; for(int i=1; i<=N; i++) { arr[i] = sc.nextInt(); //스위치 상태 } int M = sc.nextInt(); //학생 수 ArrayList<Integer>[] info = new ArrayList[M+1]; for(int i=0; i<M; i++) { info[i]= new ArrayList<Integer>(); int a = sc.nextInt(); int b = sc.nextInt(); info[i].add(a); info[i].add(b); } for(int i=0; i<M; i++) { if(info[i].get(0)==1) { for(int j=1; j<=N; j++) { if(j%(info[i].get(1))==0) { if(arr[j]%2==1) {arr[j]=0;} else {arr[j]=1;} } }}else { int a = info[i].get(1); if(arr[a]%2==1) { arr[a]=0;} else {arr[a]=1;} for(int j=1; j<a; j++) { if(arr[a-j]==arr[a+j]) { if(arr[a-j]%2==1) {arr[a-j]=0; arr[a+j]=0;} else {arr[a-j]=1; arr[a+j]=1;} } } } } System.out.print(arr[1]+" "); for(int j=2; j<=N; j++) { if(j%10==1) { System.out.println(arr[j]+" "); }else { System.out.print(arr[j]+" "); } } }}
시간초과가 중간에 난 원인은 while문 안에 if문 조건이 맞지 않을경우 break을 걸어주면 시간을 줄여 해결되었다
완성코드
package main; import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); // 스위치의 개수 int[] arr = new int[N + 1]; for (int i = 1; i <= N; i++) { arr[i] = sc.nextInt(); // 스위치 상태 } int M = sc.nextInt(); // 학생 수 for (int i = 0; i < M; i++) { int a = sc.nextInt(); int b = sc.nextInt(); if (a == 1) { for (int j = 1; j <= N; j++) { if (j % b == 0) { arr[j] = arr[j] == 1 ? 0 : 1; } } } else { arr[b] = arr[b] == 1 ? 0 : 1; int j = 1; while (b - j >= 1 && b + j <= N) { if (arr[b - j] == arr[b + j]) { arr[b - j] = arr[b - j] == 1 ? 0 : 1; arr[b + j] = arr[b + j] == 1 ? 0 : 1; } else break; j++; } } } for (int i = 1; i <= N; i++) { System.out.print(arr[i] + " "); if (i % 20 == 0) System.out.println(); } } }
'알고리즘' 카테고리의 다른 글
[java] 백준 1920 : 수 찾기 (0) 2023.05.16 [java] 백준 1463 : 1로 만들기 (0) 2023.05.04 [java] 백준 2644 : 촌수계산 (0) 2023.05.02 [java] 백준 2606 : 바이러스 (0) 2023.04.30 [java] 백준 1260 : DFS와 BFS (0) 2023.04.27