
https://www.acmicpc.net/problem/1244
1244번: 스위치 켜고 끄기
첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩
www.acmicpc.net
문제
1부터 연속적으로 번호가 붙어있는 스위치들이 있다. 스위치는 켜져 있거나 꺼져 있는 상태이다. 켜져 있을 때는 1, 꺼져 있을 때는 0이다. 스위치의 개수는 100 이하인 양의 정수이다.
학생들은 임의의 숫자를 부여받고 성별에 맞춰서 스위치의 상태를 변경한다.(스위치의 상태를 변경한다는 것은 1을 0으로 0을 1로 변경하는 것을 말한다.)
남학생의 경우 임의의 숫자의 배수인 스위치의 상태를 변경한다. 예를 들어 숫자가 3일 경우 3, 6, 9,... 의 스위치를 변경한다.
여학생의 경우 임의의 숫자를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서, 그 구간에 속한 스위치의 상태를 변경한다.
예를 들어 <그림 1>에서 여학생이 3을 받았다면, 3번 스위치를 중심으로 2번, 4번 스위치의 상태가 같고 1번, 5번 스위치의 상태가 같으므로, <그림 2>과 같이 1번부터 5번까지 스위치의 상태를 모두 바꾼다. 만약 <그림 1>에서 여학생이 4를 받았다면, 3번, 5번 스위치의 상태가 서로 다르므로 4번 스위치의 상태만 바꾼다.
풀이
남학생의 경우와 여학생의 경우에 각각 스위치의 상태를 어떻게 변경하지 생각해야 한다.
남학생의 경우는 단순하게 임의의 숫자부터 배수에 해당하는 숫자를 변경하면 된다.
문제는 여학생의 경우이다. 여학생의 경우는 2가지 방법을 생각할 수 있다.
첫 번째 방법은 스위치를 변경해야 하는 구간을 구하는 것이다. start, end 변수를 만들어서 스위치를 변경해야 하는 구간을 찾고, 그 구간에 포함된 스위치의 상태를 변경한다.
두 번째 방법은 반복문을 돌면서 받은 숫자에서 양쪽으로 확인하면서 스위치의 상태가 같은 경우 변경하고 다를 경우에는 반복문을 탈출하는 방법이다. 단, 이 방법을 사용하면 받은 숫자도 스위치 상태를 변경해야 하는 것을 잊지 말아야 한다.
출력에서 주의할 점은 스위치가 20개가 넘어간다면 21번째 스위치는 새로운 줄에 출력해야 한다는 것이다. 그렇기에 출력에 관련된 코드를 작성할 때 스위치가 20개를 출력했으면 줄 바꿈 문자를 출력하는 것을 잊지 말아야 한다.
코드
C++
# include <iostream>
using namespace std;
// 스위치 배열 선언
bool arr[101];
int main() {
// 스위치 개수 변수 선언
int switch_num;
cin >> switch_num;
// 스위치 상태에 맞게 입력
for (int i = 1; i <= switch_num; ++i) {
cin >> arr[i];
}
// 학생 수 변수 선언
int student_num;
cin >> student_num;
// 학생의 선택에 맞게 스위치 변경
for (int i = 0; i < student_num; i++) {
// 학생 성별, 선택할 스위치 위치 변수 선언
int gender, location;
cin >> gender >> location;
// 성별이 남성일 경우
if (gender == 1) {
// location의 배수의 스위치 변경
for (int j = location; j <= switch_num; j += location)
arr[j] = !arr[j];
}
// 성별이 여성일 경우
else if (gender == 2) {
// 스위치를 변경할 범위를 정하기 위해서 start, end 변수 선언
int start = location, end = location;
// 스위치를 변경할 범위를 start, end에 저장
while (start >= 1 && end <= switch_num) {
start--, end++;
if (arr[start] != arr[end])
break;
}
// start + 1 부터 end -1 까지 스위치 변경
for (int j = start + 1; j <= end - 1; ++j)
arr[j] = !arr[j];
}
}
// 스위치 출력
for (int i = 1; i <= switch_num ; i++) {
cout << arr[i] << " ";
// 20번째 스위치 이후 한 번 줄 변경
if (i % 20 == 0)
cout << "\n";
}
}
C++ 코드에서는 여학생의 경우 첫 번째 방법을 사용하여 스위치를 변경해야 하는 구간을 구한 뒤 그 구간에 속한 스위치의 상태를 변경하였다. 또한 스위치를 표현한 배열은 bool 자료형으로 선언하였다. 스위치의 상태는 0, 1이기 때문에 bool 자료형이 가장 적합하다고 생각된다. 또한 bool 자료형을 사용하면 ! 연산자를 사용해서 스위치의 상태를 변경하기 수월하다.
'백준' 카테고리의 다른 글
[백준 2563] 색종이 (0) | 2023.03.26 |
---|---|
[백준 16947] 서울 지하철 2호선 (python) (0) | 2022.05.25 |