BOJ 11723. 집합
문제 풀이 과정을 공유하고자 한다.
여담이지만, 요즘 코딩테스트 족보 문제를 풀고 있다.
문제 출처
1. 문제설명
- 처음엔 집합 S가 비어있다.
- option
add x
: S에 x를 추가한다. (1 ≤ x ≤ 20) S에 x가 이미 있는 경우에는 연산을 무시한다.remove x
: S에서 x를 제거한다. (1 ≤ x ≤ 20) S에 x가 없는 경우에는 연산을 무시한다.check x
: S에 x가 있으면 1을, 없으면 0을 출력한다. (1 ≤ x ≤ 20)toggle x
: S에 x가 있으면 x를 제거하고, 없으면 x를 추가한다. (1 ≤ x ≤ 20)all
: S를 {1, 2, …, 20} 으로 바꾼다.empty
: S를 공집합으로 바꾼다.
2. 알고리즘 설계
all
과empty
를 제외하면 입력 인자가 하나 더 있다.- 코드가 좀 지저분해 지겠지만,
if
문으로 추가해준다.
- 코드가 좀 지저분해 지겠지만,
- 집합은 중복되지 않고,
1<=x<=20
이므로, 배열을 21의 크기로 할당- 구현의 편의상, 1번부터 20번 index를 사용하였다.
3. 로직
- 집합에 있냐 없냐이므로,
bool
배열로도 충분하다. - 전부 지우거나 없애는 건
fill_n
함수를 사용하였다.
4. 전체 코드
5. 소감
fill_n
- 1차원 배열인 경우,
fill_n(&arr[0], size, value)
- 2차원 배열인 경우,
fill_n(&arr[0][0], size, value)
- 1차원 배열인 경우,
- 배열의 이름(
arr
)은 배열의 첫 번째 원소의 주소값(&arr[0]
)과 같다?- 나는 학부 때 위와 같이 배웠었다.
- 근데 특이하게 1차원 배열이라면
[0]
, 2차원 배열이라면[0][0]
으로 명시해줘야 한다.
- 위와 같이 명시해주지 않고, 배열의 이름을 사용하면 빌드가 되지 않을 것이다.