본문 바로가기
알고리즘/백준

[백준 / 1244 스위치 켜고 끄기 / JAVA]

by KDW999 2023. 8. 1.

https://www.acmicpc.net/problem/1244

 

1244번: 스위치 켜고 끄기

첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩

www.acmicpc.net

 

문제 설명

문제 설명 곧이곧대로 구현한 것 같다.

 

남학생은 전구 배열을 돌면서 받은 전구 번호로 배열 인덱스가 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();
 		}
	}
}

댓글