Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 트라이 #trie #알고리즘
- pycon
- 튜플
- CleanCode
- 티스토리 open api
- 보행자 천국
- 크레인 인형뽑기 게임
- trie
- 불량 사용자
- bulk update
- 징검다리 건너기
- 카카오 인턴
- 알고리즘
- Open API
- 호텔 방 배정
- 티스토리
- Tistory
- 가사 검색
- Python
- 프로그래머스
- 트라이
- Spring Boot
- jdbc
Archives
- Today
- Total
택시짱의 개발 노트
[백준] 14225번 부분수열의 합 (비트마스크) 본문
링크
https://www.acmicpc.net/problem/14225
14225번: 부분수열의 합
수열 S가 주어졌을 때, 수열 S의 부분 수열의 합으로 나올 수 없는 가장 작은 자연수를 구하는 프로그램을 작성하시오. 예를 들어, S = [5, 1, 2]인 경우에 1, 2, 3(=1+2), 5, 6(=1+5), 7(=2+5), 8(=1+2+5)을 만들 수 있다. 하지만, 4는 만들 수 없기 때문에 정답은 4이다.
www.acmicpc.net
풀이
수열 S가 주어졌을 때, 수열 S의 부분 수열의 합으로 나올 수 없는 가장 작은 자연수를 구하는 문제이다.
일단 비트 마스크를 이용하여 수열 S의 모든 부분 수열의 합을 구하고 map에 추가하고
모든 부분 수열을 구하고 나서 1부터 최대로 나올 수 있는 2000000까지 map에 존재하는지 확인하여
존재하지 않다면 값을 출력하도록 하였습니다.
#include<iostream>
#include<map>
using namespace std;
int arr[1 << 22];
map<int, bool> _map;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int N; cin >> N;
for (int i = 0; i < N; i++) {
cin >> arr[1 << i];
}
for (int i = 1; i < (1 << N); i++) {
int sum = 0;
for (int j = 0; (1 << j) <= i; j++) {
if (i & (1 << j)) {
sum += arr[1 << j];
}
}
_map[sum] = true;
}
for (int i = 1; i <= 2000000; i++) {
if (_map[i] != true) {
cout << i;
break;
}
}
return 0;
}
반응형
'알고리즘' 카테고리의 다른 글
[백준] 16988번 Baaaaaaaaaduk2 (Easy) (0) | 2020.03.25 |
---|---|
[백준] 5670번 휴대폰 자판 (0) | 2020.03.24 |
[백준] 14425번 문자열 집합 (트라이) (0) | 2020.03.24 |
[프로그래머스] 단어 변환 (0) | 2020.03.20 |
[백준] 17822번 원판 돌리기 (0) | 2020.03.20 |
Comments