공부 자료/알고리즘
(C/C++) 백준 1244번- 스위치 켜고 끄기
뚜루뚜루세니
2021. 7. 4. 15:38
728x90
문제 출처:https://www.acmicpc.net/problem/1244
1244번: 스위치 켜고 끄기
첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩
www.acmicpc.net
1. 코드
#include <stdio.h>
int main() {
int n;
int sw[100];
scanf("%d", &n); //스위치 수
for (int i = 1; i <= n; i++) {
scanf("%d", &sw[i]); //스위치상태
}
int m;
scanf("%d", &m); //학생수
int gender, num, a, b;
for (int i = 0; i < m; i++) {
scanf("%d %d", &gender, &num);//성별, 학생이 받은 수
if (gender == 1) { //남학생일 경우
for (int i = num; i <= n; i += num) {
sw[i] ^= 1;
}
}
if (gender == 2) { //여학생일 경우
a = b = num;
while (1) {
a--;
b++;
if (a < 1 || n < b)
break;
if (sw[a] != sw[b])
break;
}
a++;
b--;
for (int i = a; i <= b; i++) {
sw[i] ^= 1;
}
}
}
for (int i = 1; i <= n; i++) {
if (i % 20 == 0) //한 줄에 20개씩 잘라서 출력
printf("%d\n", sw[i]);
else
printf("%d ", sw[i]);
}
return 0;
}
2. 해결 과정
남학생은 자기가 받는 수의 배수일때 스위치의 상태를 바꾸고, 여학생은 자기가 받은 수를 중심으로 좌우 대칭이면서, 많은 스위치를 포함하는 구조일때 상태를 바꾼다.
따라서, 학생 성별에 따라 for문을 생성하여 상태를 바꿔줘야한다.
스위치 상태를 바꿀때 ^=1 연산을 사용하면 쉽게 변경할 수 있다.
3. 느낀점
처음에 여학생일 때 스위치 상태를 변경하는 부분에서 어려움을 좀 겪었고, 스위치 상태를 바꿀때 비트 연산자를 사용하려고 했는데 그렇게 되니 계속 오류가 나서 ^=1연산은 검색을 통해 알게 되었다...
그리고 시간 초과가 나지 않게 수정을 해야했다.. 출력할 때 20개씩 한줄에 표시한다는 부분을 잘 읽지 않아서 틀리기도 했다. 문제를 꼼꼼하게 읽는 걸로,,,
728x90