백준 1244. 스위치 켜고 끄기
26 Feb 2021문제 바로가기
문제 요약
1부터 연속적으로 번호가 붙어있는 스위치들이 있다. 이 스위치는 켜져 있거나((1) 꺼져 있는(0) 의 상태이다. 그리고, 학생 몇 명을 뽑아 몇개의 스위치를 켜고 끌 기회를 준다.
남학생은 자기가 받은 수와 그 배수의 스위치들의 상태를 모두 바꾼다. 그 예시는 아래와 같다.
위 그림과 같이 남학생이 3번을 받았다면 3번, 6번 스위치의 상태를 바꾼다.
여학생은 자기가 받은 번호를 기준으로 양옆으로 뻗어나가면서 대칭이 되는지 확인하여 대칭인 스위치만 모두 바꾼다. 이때, 대칭이 되지 않는 스위치가 나타나면 그 이전까지의 스위치만 상태를 바꾼다.
위 그림과 같이 여학생이 3번 스위치를 받았다면 3번을 기준으로 2번과 4번, 1번과 5번을 모두 비교하고 상태가 같기 때문에 각 스위치의 상태를 바꾼다. 1번 왼쪽에는 스위치가 없기 때문에 더이상 가지 않는다.
이때, 입력값에 따른 스위치의 마지막 상태를 출력하여라.
문제 풀이 포인트
굉장히 간단한 구현문제로 처음 스위치의 상태를 배열에 저장한 후 남학생과 여학생에 따라 스위치의 상태를 조정하면 되는 문제이다.
신경써야할 문제의 포인트는
- 남학생의 경우, 스위치 숫자의 배수로 진행하여야 하기 때문에 반복문을 통해 상태를 변화시켜주어야 한다.
- 여학생의 경우, 대칭을 계속 확인해주어야 하는 문제가 있다. 또한, 배열의 인덱스 바깥으로 나가지 않게 신경써야 하며 대칭을 확인할 때, 대칭이 성립하지 않은 스위치는 상태를 바꾸지 말아야 한다.
- 출력할때, 한 줄에 20개씩 출력을 하여야 하므로, 20으로 나눈 나머지가 0일 때 줄바꿈 기호를 추가한다.
문제 코드[JAVA]
코드 펼치기
import java.io.FileInputStream;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System. in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
int stu = sc.nextInt();
for (int i = 0; i < stu; i++) {
int sex = sc.nextInt();
int number = sc.nextInt();
if (sex == 1) {
int k = 1;
int idx = number - 1; // 스위치 배열을 건드리기 위해
while (idx < n) { // number의 배수만큼 반복시키기 위해
arr[idx] = (arr[idx] == 1)? 0 : 1;
idx = (number * ++k) - 1;
}
} else if (sex == 2) {
number = number - 1; // 스위치의 배열 index와 맞추기 위하여
int k = number - 1; // 선택한 스위치 앞
int p = number + 1; // 선택한 스위치 뒤
while (k >= 0 && p < n) {
if (arr[k] != arr[p]) // 대칭
break;
k--;
p++;
}
for (int j = k + 1; j < p; j++) {
arr[j] = (arr[j] == 1)? 0: 1;
}
}
}
for (int i = 0; i < n; i++) {
System.out.print(arr[i] + " ");
if (i != 0 && (i + 1) % 20 == 0)
System.out.println();
}
sc.close();
}
}