남자인 경우와 여자인 경우 비트를 처리하는 로직이 다르다. 남자인 경우는 주어진 번호의 배수마다 모두 비트를 반전시킨다. 여자인 경우 주어진 번호 기준 좌우대칭 값이 같을때 최대한 넓은 영역의 비트를 반전시킨다. 이때 여자의 번호는 무조건 반전된다.
처음 제출했을때 틀렸는데 그 이유는 스위치의 상태를 한줄에 20개까지 출력한다음 개행을 놓쳤었다. 그 다음으로 제출했을때도 틀렸는데 while문의 조건에서 left와 right의 범위를 left >= 0 && right < n 으로 설정하여 틀렸다. 스위치 번호값이 1부터 시작하기 때문에 처음에 배열 크기를 +1 늘려주고 index를 1부터 시작하도록 했는데 while문 내부의 범위 조건에서 이를 놓쳤다.
오늘의 배움 = '배열의 범위를 잘 체크하자!!'
package com.baekjoon.algo;
import java.util.Scanner;
public class Switch {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] switchs = new int[n+1];
for (int i = 1; i <= n; i++) {
switchs[i] = sc.nextInt();
}
int person = sc.nextInt();
for (int i = 0; i < person; i++) {
int gender = sc.nextInt();
int value = sc.nextInt();
if(gender == 1) {
//남자는 자기번호 배수 모두다 바꿈
for (int j = value; j <= n; j += value) {
switchs[j] = switchs[j] == 0 ? 1 : 0;
}
}
if(gender==2) {
//여자는 자기 번호 기준 좌우대칭 가장 넓은 영역 모두 바꾼다.
int left = value-1;
int right = value+1;
switchs[value] = switchs[value] == 0 ? 1 : 0;
//left 랑 right 범위 실수
while(left > 0 && right <= n && switchs[left] == switchs[right]) {
switchs[left] = switchs[left] == 0 ? 1 : 0;
switchs[right] = switchs[right] == 0 ? 1 : 0;
left--;
right++;
}
}
}
for (int i = 1; i <= n; i++) {
System.out.print(switchs[i] + " ");
if(i%20 == 0) {
System.out.println();
}
}
}
}
'Algorithm' 카테고리의 다른 글
[SWEA] JAVA - 1208.Flatten (0) | 2021.02.02 |
---|---|
[정렬 알고리즘] - Merge Sort (0) | 2021.02.02 |
[백준] JAVA - 1535.안녕 (0) | 2021.01.30 |
[Programmers] 더 맵게 (0) | 2021.01.29 |
[Programmers] 등굣길 (0) | 2021.01.29 |