소소한 개발이야기
[BOJ #1244번 JAVA] 스위치 켜고 끄기 본문
[백준 온라인 저지] #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 |