https://www.acmicpc.net/problem/1244
문제 설명
문제 설명 곧이곧대로 구현한 것 같다.
남학생은 전구 배열을 돌면서 받은 전구 번호로 배열 인덱스가 0으로 딱 나눠떨어지면 해당 인덱스의 스위치를 누른다.
여학생은 받은 전구 번호의 스위치를 먼저 바꾸고 양 옆 (Left, Right)를 한 칸 씩 서로 같은지 비교하면서 같다면 양 옆을 1칸 씩 더 이동하면서 계속 비교하다가 범위를 벗어나거나 서로 다르게 되면 탐색을 중단한다.
마지막에 출력은 20줄 마다 줄바꿈해주기
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
// 전구
int bulb = Integer.parseInt(br.readLine());
int[] swit = new int[bulb+1];
// 전구 초기 상태
st = new StringTokenizer(br.readLine());
for(int i=1; i<swit.length; i++) swit[i] = Integer.parseInt(st.nextToken());
// 학생 수
int studentNum = Integer.parseInt(br.readLine());
int[][] student = new int[studentNum][2];
// 학생 성별, 번호 선언
for(int i=0; i<student.length; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<2; j++) {
student[i][j] = Integer.parseInt(st.nextToken());
}
}
// 스위치 바꾸기
for(int i=0; i<student.length; i++) {
// 남학생
if(student[i][0] == 1) {
for(int j=1; j<swit.length; j++) {
if(j % student[i][1] == 0) {
if(swit[j] == 0) swit[j] = 1;
else swit[j] = 0;
}
}
}
// 여학생
else if(student[i][0] == 2) {
int gsbulbNum = student[i][1];
boolean check = true;
if(swit[gsbulbNum] == 0) swit[gsbulbNum] = 1;
else swit[gsbulbNum] = 0;
int gsbLeft = gsbulbNum -1;
int gsbRight = gsbulbNum +1;
while(check) {
if(gsbLeft > 0 && gsbRight < swit.length && swit[gsbLeft] == swit[gsbRight] ) {
if(swit[gsbLeft] == 0) {
swit[gsbLeft] = 1;
swit[gsbRight] = 1;
}
else {
swit[gsbLeft] = 0;
swit[gsbRight] = 0;
}
}
else break;
gsbLeft--;
gsbRight++;
}
}
}
for(int i=1; i<swit.length;i++) {
System.out.print(swit[i]+ " ");
if(i % 20 == 0 ) System.out.println();
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 / 1946 신입 사원 / JAVA] (0) | 2023.07.30 |
---|---|
[백준 / 2468 안전 영역 / JAVA / DFS] (0) | 2023.07.29 |
[백준 / 14501 퇴사 / Java / DP] (0) | 2023.07.29 |
[백준 / 14425 문자열 집합 / JAVA] (0) | 2023.07.29 |
[백준 2503 / 숫자 야구 / JAVA / 구현] (0) | 2023.07.27 |
댓글