https://www.acmicpc.net/problem/11723
11723번: 집합
첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.
www.acmicpc.net
비트마스킹을 모른 채로 푼 결과
간단한 구현 문제
void operation(string op) {
if (op == "empty")
for (int i = 1; i <= v.size(); i++) v[i] = 0;
else if (op == "all")
for (int i = 1; i <= v.size(); i++) v[i] = 1;
else {
int x;
cin >> x;
if (op == "add")
v[x] = 1;
else if (op == "remove")
v[x] = 0;
else if (op == "check")
cout << v[x] << '\n';
else
v[x] = !v[x];
}
}
이 쉬운 문제를 왜 틀렸지? 하는 사람들은 나처럼 헛수고하지 말고
배열을 call by value로 가져오지는 않았는지 확인해보자
여러 개의 분기가 존재하는 조건문은 switch문을 사용하면 편리하지만, 아쉽게도 switch는 정수형 변수에만 사용 가능하다. 즉 위와 같은 문자열 분기는 사용할 수 없다.
굳이 위 문제에 switch를 적용하려면
1) 위 문제의 각 명령은 맨 앞 문자가 서로 다르므로 op[0]을 기준으로 구별하거나,
2) map을 이용해 각 명령을 key로 하는 별개의 value들을 추가하면 되겠다.
배운 내용
switch문과 해쉬 함수
흔히 하는 실수 -> 배열 call by value
'백준' 카테고리의 다른 글
백준 11723 - 집합 (0) | 2023.07.14 |
---|---|
백준 7662 - 이중 우선순위 큐 (0) | 2023.07.14 |
백준 14940 - 쉬운 최단거리 (0) | 2023.07.13 |
백준 18870 - 좌표 압축 (0) | 2023.07.11 |
백준 7576 - 토마토 (0) | 2023.07.06 |