[백준 9897] Lamp (C#, C++) - soo:bak
작성일 :
문제 링크
설명
복도에 있는 전구들이 모두 꺼진 상태에서, 각 경비원이 맡은 전구들의 상태를 순서대로 반전시킵니다. 모든 순찰이 끝난 뒤 켜져 있는 전구의 개수를 구하는 문제입니다.
접근법
이 문제는 순찰 과정을 그대로 따라가면 충분합니다.
각 경비원은 자기 차례가 오면 a0, a0 + d, a0 + 2d, … 번 전구를 끝까지 지나가며 켜져 있으면 끄고, 꺼져 있으면 켭니다.
먼저 경비원 이름마다 시작 번호와 간격을 저장해 둡니다. 그 다음 순찰 명단을 앞에서부터 읽으면서, 이름이 나올 때마다 해당 경비원이 바꾸는 전구 번호들을 차례로 따라가며 전구 상태를 반전시킵니다.
모든 순찰이 끝난 뒤에는 전구 배열을 한 번 보면서 켜져 있는 전구의 개수만 세면 됩니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
class Program {
static void Main() {
string[] first = Console.ReadLine()!.Split();
int l = int.Parse(first[0]);
int g = int.Parse(first[1]);
int r = int.Parse(first[2]);
var guards = new Dictionary<string, (int start, int diff)>();
for (int i = 0; i < g; i++) {
string[] parts = Console.ReadLine()!.Split();
string name = parts[0];
int start = int.Parse(parts[1]);
int diff = int.Parse(parts[2]);
guards[name] = (start, diff);
}
bool[] lamps = new bool[l + 1];
for (int i = 0; i < r; i++) {
string name = Console.ReadLine()!;
var info = guards[name];
for (int lamp = info.start; lamp <= l; lamp += info.diff)
lamps[lamp] = !lamps[lamp];
}
int answer = 0;
for (int i = 1; i <= l; i++) {
if (lamps[i])
answer++;
}
Console.WriteLine(answer);
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int l, g, r;
cin >> l >> g >> r;
map<string, pair<int, int>> guards;
for (int i = 0; i < g; i++) {
string name;
int start, diff;
cin >> name >> start >> diff;
guards[name] = {start, diff};
}
vector<bool> lamps(l + 1, false);
for (int i = 0; i < r; i++) {
string name;
cin >> name;
auto info = guards[name];
for (int lamp = info.first; lamp <= l; lamp += info.second)
lamps[lamp] = !lamps[lamp];
}
int answer = 0;
for (int i = 1; i <= l; i++) {
if (lamps[i])
answer++;
}
cout << answer << "\n";
return 0;
}