Hope Everyone Is Happy

[실버4] 1244. 스위치 켜고 끄기(Java) 본문

※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)

[실버4] 1244. 스위치 켜고 끄기(Java)

J 크 2023. 8. 21. 15:53
728x90
반응형

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

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

화이팅 ★


※  문제를 요약하면 아래와 같습니다.

▶ 스위치 1~N까지 N개가 존재

N개의 스위치가 존재 할 때, 스위치를 컨트롤하는 학생 수 S명이 주어짐

학생에게는 스위치의 번호가 주어지며 남자/여자에 따라 스위치 컨트롤이 다름

▶ 남자는 주어진 스위치의 번호의 배수 스위치를 반대로 변경

▶ 여자는 주어진 스위치의 번호를 기준으로 양 옆의 스위치 상태가 다를 때 까지 스위치들을 반대로 변경

Input : 첫째줄에 스위치 개수

                둘째줄에 스위치들의 상태

                셋째줄에 학생 수

                각 줄별로 학생의 성별 (남자:1/여자:2) 과 스위치번호가 주어짐

 Output : 변경 후 스위치 상태를 각 줄별로 최대 20개씩 출력


◈ Input

8
0 1 0 1 0 0 0 1
2
1 3
2 3

◈ Output

1 0 0 0 1 1 0 1

 ◎  코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

▶ 스위치들의 상태는 boolean 배열로 선언

 남자일 경우, 주어진 스위치의 번호의 배수번호만 스위치의 상태를 반대로 변경

여자일 경우, 스위치 넘버에 해당하는 스위치 값 변경우 LeftPoint, RightPoint의 스위치 일치 여부 비교 탐색

LeftPoint와 RightPoint의 스위치 값이 일치할 경우 변경, 아닐 경우 탐색 종료


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int nSwitchSize = Integer.parseInt(bReader.readLine());
		
		boolean[] barrSwitch = new boolean[nSwitchSize];
		StringTokenizer st = new StringTokenizer(bReader.readLine());
		for(int i = 0 ; i < barrSwitch.length; i++)
			barrSwitch[i] = Integer.parseInt(st.nextToken()) == 1;
		
		int nStudent = Integer.parseInt(bReader.readLine());

		for(int i = 0 ; i < nStudent; i++) {
			st = new StringTokenizer(bReader.readLine());
			int nGender = Integer.parseInt(st.nextToken());
			int nSwitchNum = Integer.parseInt(st.nextToken());
			
			int nMan = 1;
			int nWoman = 2;
			
			if(nGender == nMan) {
				for(int j = 0; j < barrSwitch.length; j++) {
					if((j+1) % nSwitchNum == 0)
						barrSwitch[j] = !barrSwitch[j];
				}
			} else if(nGender == nWoman) {
				nSwitchNum--;
				barrSwitch[nSwitchNum] = !barrSwitch[nSwitchNum]; 
				int nLeftPoint = nSwitchNum-1;
				int nRightPoint = nSwitchNum+1;
				while(nLeftPoint >= 0 && nRightPoint < nSwitchSize) {
					if(barrSwitch[nLeftPoint] != barrSwitch[nRightPoint])
						break;
					
					barrSwitch[nLeftPoint] = !barrSwitch[nLeftPoint]; 
					barrSwitch[nRightPoint] = !barrSwitch[nRightPoint];
					nLeftPoint--;
					nRightPoint++;
				}
			}
		}
		
		for(int i = 0 ; i < nSwitchSize; i++) {
			if(barrSwitch[i])
				bWriter.write("1 ");
			else
				bWriter.write("0 ");
			
			if(i != 0 && (i+1) % 20 == 0)
				bWriter.write("\n");
		}
		
		bWriter.flush();
		bWriter.close();
	}
}

읽어주셔서 감사합니다!

Good Luck! (피드백 감사합니다!)