문제
https://www.acmicpc.net/problem/1244
문제 요약
1부터 연속적으로 번호가 붙어 있는 스위치들이 있다.
'1'은 스위치가 켜져 있음을, '0'은 꺼져 있음을 나타낸다.
학생 몇 명을 뽑아 자연수를 하나씩 나누어 준다.
학생들은 자신의 성별과 받은 수에 따라 스위치들을 조작한다.
남학생은 스위치 번호가 자기가 받은 수의 배수이면, 해당 스위치 상태를 바꾼다.
여학생은 자기가 받은 수와 같은 번호의 스위치를 중심으로 좌우가 대칭이면서,
가장 많은 스위치를 포함하는 구간을 찾아 그 구간에 속한 스위치 상태를 모두 바꾼다.
코드
#include <iostream>
#include <algorithm>
using namespace std;
// 스위치 개수
int switch_cnt;
// 스위치 상태
int switch_state[110];
// 학생 수
int student_cnt;
void change_state(int sex, int num) {
int idx = num;
int cnt = 1;
// 남자라면,
if (sex == 1) {
while (idx * cnt <= switch_cnt) {
switch_state[idx * cnt] = (switch_state[idx * cnt] == 0) ? 1 : 0;
cnt++;
}
}
// 여자라면,
else {
switch_state[idx] = switch_state[idx] = (switch_state[idx] == 0) ? 1 : 0;
while ((idx - cnt) >= 1 && (idx + cnt) <= switch_cnt) {
if (switch_state[idx - cnt] == switch_state[idx + cnt]) {
switch_state[idx - cnt] = switch_state[idx - cnt] = (switch_state[idx - cnt] == 0) ? 1 : 0;
switch_state[idx + cnt] = switch_state[idx + cnt] = (switch_state[idx + cnt] == 0) ? 1 : 0;
cnt++;
}
else {
break;
}
}
}
}
void print_state() {
for (int i = 1; i <= switch_cnt; i++) {
cout << switch_state[i] << " ";
if (i % 20 == 0) cout << "\n";
}
}
int main() {
// 스위치 개수 입력
cin >> switch_cnt;
// 스위치 상태 입력
for (int i = 1; i <= switch_cnt; i++) {
cin >> switch_state[i];
}
// 학생 수 입력
cin >> student_cnt;
for (int i = 0; i < student_cnt; i++) {
int sex, num;
cin >> sex >> num;
change_state(sex, num);
}
print_state();
return 0;
}
코드 설명
1. 초기 스위치 상태와 학생 정보(성별, 주어진 자연수)를 입력 받는다.
2. 학생 정보를 입력 받을 때마다, 해당 학생의 스위치 조작을 진행한다.
3. 결과 스위치 상태를 출력한다.
고찰
오랜만에 간단한 구현 문제를 풀어서인지, 여학생의 스위치 조작 구현을 조금 고민했다.
'Algorithm Problems > 구현' 카테고리의 다른 글
[백준/C++] 13909번: 창문 닫기 (1) | 2024.12.26 |
---|---|
[백준/C++] 1251번: 단어 나누기 (2) | 2024.10.11 |
[백준/C++] 4072번: Words (0) | 2024.06.12 |
[백준/C++] 4447번: 좋은놈 나쁜놈 (0) | 2024.04.15 |
[백준/C++] 1718번: 암호 (1) | 2024.04.06 |