[실버4] 1244. 스위치 켜고 끄기(Java)
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! (피드백 감사합니다!)