[BOJ Java] 1244 스위치 켜고 끄기

[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] +" ");
			}
		}
	}

}

© 2021. All rights reserved.