정보올림피아드 초등 - 지역예선] 2008년도 31번문제
이미지에서
for(i = 1; i<=n; i++) {
fscanf(fin,"%d",&a); <-- 이부분이 빠져 있음
operation(a);
}
문제풀이) 알고리즘을 이해 하고 문제를 풀어 나간다.
먼저 변수의 값을 이해 한다.
n 의 값은 스위치 갯수 예제에서는 8의 값이 들어 옴
s 는 현재 스위치의 상태
예제에서는 다음과 같은 값이 들어 옴
s
0 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
m 은 학생 수 예제에서는 1
a 는 학생에게 주어지는 스위치 번호 예에서는 3
operation(a) 가 수행 하는 일은
스위치번호가 주어지면 자기 자신을 기점으로 왼쪽과 오른쪽으로 한칸씩 나가면서 대칭인 수의 값을 변경 하는 것임
따라서 temp 의 값은 자신을 기준으로 좌우측으로 몇칸을 계산해야 하는지 그 값을 받는다.
가령 학생이 숫자가 1을 받은 경우 왼쪽으로 한칸도 비교 할 수 없기때문에 temp 의 값은 0 이며 8을 받은 경우 오른쪽으로 한칸도 비교 할 수 없기 때문에 temp 의 값은 0 이다.
이것을 표로 나타내 보면 다음과 같다.
받은번호(x) |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
temp |
0 |
1 |
2 |
3 |
3 |
2 |
1 |
0 |
따라서 이 값을 만족하기 위해서는
㉠ x - 1
㉡ n - x
의 값이 입력 되어야 함
31번 정답) 4번
32번은 앞뒤를 바꾸는 것인데
① ~ ④ 은 s(x - i) 의 값과 s(x + i) 의 값이 같으므로 모두 성립함
⑤ s(x + i) = !s(x - i) <-- 여기서 s(x + 1) 의 값이 변경 되었는데...
s(x - i) = !s(x + i) <-- 다시 s(x+i) 의 값을 변경 하여 넣으므로 s(x-i) 의 값은 원래 값으로 되돌아감
32번 정답) 5번