반응형
1244번: 스위치 켜고 끄기 (acmicpc.net)
풀이
딱히 풀이라고 할 게 없는 문제다.
그냥 문제에서 시키는대로 해주면 된다.
번호가 주어졌을 때 남학생일 경우 번호의 배수에 해당하는 스위치 상태를 변경해주면 된다.
예를 들어 3이 주어졌다면 3, 6, 9, ··· 를 변경해준다.
여학생일 경우 번호의 양 옆 스위치 상태를 확인하고 서로 다를 때까지 비교해준다.
두 개의 스위치 값이 같다면 변경해주고, 다르면 탐색을 중단한다.
예를 들어 3이 주어졌다면 [2, 4], [1, 5], ··· 를 순서대로 비교 후에 변경, 다른 값이 나왔다면 그대로 중단시키면 된다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine()); // 스위치 개수
int[] bulb = new int[N+1];
st = new StringTokenizer(br.readLine());
for (int i=1; i<=N; i++) {
bulb[i] = Integer.parseInt(st.nextToken());
}
int studentCnt = Integer.parseInt(br.readLine()); // 학생 수
for (int i=1; i<=studentCnt; i++) {
st = new StringTokenizer(br.readLine());
int gender = Integer.parseInt(st.nextToken()); // 1: 남학생 2: 여학생
int number = Integer.parseInt(st.nextToken()); // 주어진 번호
if (gender == 1) {
for (int j=1; j<=N; j++) {
if (j%number == 0) {
bulb[j] = bulb[j] == 0 ? 1 : 0;
}
}
} else {
// 주어진 번호는 무조건 변경
bulb[number] = bulb[number] == 0 ? 1 : 0;
for (int j=1; j<=N/2; j++) {
int left = number - j;
int right = number + j;
// 범위를 벗어났다면 그대로 종료
if (right > N || left < 1) break;
// 값이 같을 경우 변경, 다를 경우 종료
if (bulb[left] == bulb[right]) {
bulb[left] = bulb[left] == 0 ? 1 : 0;
bulb[right] = bulb[right] == 0 ? 1 : 0;
} else {
break;
}
}
}
}
// 20번째마다 다음 줄에 출력
for (int i=1; i<=N; i++) {
System.out.print(bulb[i] + " ");
if (i % 20 == 0) System.out.println();
}
}
}
반응형
'알고리즘 > 구현 & 그리디 & 브루트포스' 카테고리의 다른 글
[백준]JAVA - 1966번: 프린터 큐 (0) | 2023.03.28 |
---|---|
[백준]JAVA - 10431번: 줄세우기 (0) | 2023.03.22 |
[백준]JAVA - 11067번: 모노톤길 (0) | 2023.02.24 |
[백준]JAVA - 14503번: 로봇 청소기 (0) | 2023.02.16 |
[백준]JAVA - 7568번: 덩치 (0) | 2023.02.07 |