소소한 개발이야기

[BOJ #1244번 JAVA] 스위치 켜고 끄기 본문

BOJ

[BOJ #1244번 JAVA] 스위치 켜고 끄기

plplim 2019. 3. 5. 18:23

[백준 온라인 저지] #1244번 (스위치 켜고 끄기) 문제풀이

 

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

 

스위치를 `boolean[]`로 관리를 하고, `남학생`일 경우의 연산과 `여학생`일 경우의 연산으로 나누어 풀면 쉽게 해결할 수 있다. `단순 시뮬레이션`이기 때문에 노트에 적어가며 차근차근 따라가다 보면 해결 가능하다.

 

전구를 나타내는 boolean 타입의 배열을 준비한다. 전구의 번호가 1번부터 시작하므로 관리하기 쉽게 `n + 1`만큼 할당해준다.

 

1
boolean[] right = new boolean[n + 1];
cs

 

첫 번째로 `남학생`의 경우 `부여받은 수`의 배수인 전구들만 `toggle`하면 되므로 어렵지 않게 접근할 수 있다.

 

1
2
3
for (int rightIndex = rightNum; rightIndex < right.length; rightIndex += rightNum) {
    right[rightIndex] = !right[rightIndex];
}
cs

 

 

두 번째로 `여학생`의 경우 `부여받은 수`의 좌우로 `대칭`인 경우에만 `toggle`해준다.  

기준에서 `왼쪽 index`와 `오른쪽 index`를 `XOR`로 확인해서 같을 경우만 `toggle`해주면 된다.  

여기서 `주의할 점`은 기준점에서 양쪽 `대칭인 구간`에 있는 모든 전구를 `toggle`해야 하므로 `기준인 전구`도 함께 `toggle`되어야 한다는 점이다.  

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int l = rightNum - 1;
int r = rightNum + 1;
while(true){
    if (l < 1 || r > right.length - 1) {
        break;
    }
    if ((right[l] ^ right[r])) {
        // XOR : 다를 경우 1 반환
        break;
    } else {
        right[l] = !right[l--];
        right[r] = !right[r++];
    }
}
// 기준인 전구 toggle
right[rightNum] = !right[rightNum];
cs

 

boolean 타입을 toggle 한다면, 굳이 if문을 사용하지 않아도 된다.

 

전체 소스코드는 Github에 올려져 있습니다.

 

Github

https://github.com/seungrokoh/Beakjoon_OnlineJudge

 

(도움이 되셨다면 Github Repository에 Star 한 번 눌러주는 센스!)

 

더 좋은 방법이나 문제가 있는 부분 말씀해주시면 적극 반영하겠습니다.

'BOJ' 카테고리의 다른 글

[BOJ #6359번 JAVA] 만취한 상범  (0) 2019.04.11
[BOJ #11052번 JAVA] 카드 구매하기  (0) 2019.04.11
[BOJ #2884번 JAVA] 알람 시계  (0) 2019.03.05
[BOJ #11718번 JAVA] 그대로 출력하기  (1) 2019.03.05
[BOJ #2490번 JAVA] 윷놀이  (0) 2019.03.05
Comments