[BOJ Java] 1244 스위치 켜고 끄기
자바로 BOJ 문제를 처음 풀어봤다. 이 문제는 남자, 여자가 스위치를 켜고 끄는 동작을 달리하는데, 남자 파트는 배수 부분만 꺼주면 되기 때문에 쉽게 작성할 수 있었다.
문제는 여자파트인데,더 좋은 로직이 있을 것 같은데 inc라는 변수를 두고 하나씩 늘려가면서 1씩 줄어든 왼쪽 index와 1씩 늘어나는 우측 index를 두었다.
이렇게 풀이했는데, 한 동안 계속 fail. 고려하지 못했던 것은 아닌데 구현하다가 까먹은 부분이 있었다.
여자파트에서 핵심이 대칭이 아니면 비교를 멈추고 break
되어야하는데, 그 부분을 빼놓고 작성해서 케이스 여러 개를 만들어 대입해보다가 겨우 깨달아 완성시켰다.
구현 문제에서 이렇게 힘을 뺄 줄이야.. 한국정보올림피아드 초등부 2번 문제라는데 초등학생들보다 잘 할 수 있게 열심히 해야지.
나의 풀이
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int switchNum = sc.nextInt(); // 100이하 양의 정수
int[] states = new int[switchNum];
for (int i = 0; i < switchNum; i++) {
states[i] = sc.nextInt();
}
// 학생수
int stdNum = sc.nextInt();
int[][] coms = new int[stdNum][2];
for (int i = 0; i < stdNum; i++) {
coms[i][0] = sc.nextInt();
coms[i][1] = sc.nextInt();
int s = coms[i][0];
int t = coms[i][1]-1;
// 남자
if (s == 1) {
for (int j = 0; j < states.length; j++) {
if((j+1) % (t+1) == 0) {
if (states[j] == 0) {
states[j] = 1;
}else {
states[j] = 0;
}
}
}
}else {
// 여자
// 받은 번호 toggle
if (states[t] == 0) {
states[t] = 1;
}else {
states[t] = 0;
}
int inc = 1;
if (t > 0 && t < states.length && states.length>2){
for (int j = t-1; j >= 0; j--) {
if (t+inc >= states.length) {
break;
}
if (states[j] == states[t+inc]) {
if (states[j] == 0) {
states[j] = 1;
states[t+inc] = 1;
}else {
states[j] = 0;
states[t+inc] = 0;
}
}else {
break;
}
inc += 1;
}
}
}
}
for (int i = 1; i < states.length+1; i++) {
if (i % 20 == 0) {
System.out.println(states[i-1]);
}else {
System.out.print(states[i-1] +" ");
}
}
}
}