728x90
0. [c++] 백준 |
https://www.acmicpc.net/problem/1038
1. 풀이 |
이번 문제를 풀면서 정말 감탄할만한 코드를 마주하였다. BaaaaaaaaarkingDog님이 짜놓은 코드였었는데, 보면 이 문제를 너무나 간결하게 풀이했다는 것을 느낄 수 있었다.
뭐, 이거보다 더 좋은 코드가 있기는 힘들 것 같을정도였다.
풀이하자면,
(9,8,7,6,5,4,3,2,1,0)의 수의 위치는 우선적으로 고정이 되어있다 가정하자.
(0,1,1,0,0,1,0,0,0,1)의 경우라면
( 8,7, 4, 0)의 출력이 나오게 되는 것이다.
이런식으로 나오게 되는 수는 선택하거나 선택하지 않는 2가지의 경우의 수, 2^10에 아무것도 선택하지 않는 1가지의 경우를 제외한, 1023개의 경우가 발생하는데,
이 발생을 (% 2)를 활용해 2진수로 치환하여 간단하게 배열을 만들어 저장하고, sort를 활용해 정리를 끝낸 후 원하는 순서의 수를 꺼내오기만 하면 되는 방식의 풀이였다.
2. 소스코드 |
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 | #include<iostream> #include<vector> #include<algorithm> typedef unsigned long long ull; std::vector<ull> dec_num; void downSizeingNum(int N) { if (N > 1022) { std::cout << "-1" << std::endl; return; } for (int i = 1; i <= 1023; i++) { ull num = 0;// i에 대응되는 감소하는 수 int tmp_i = i; for (int idx = 9; idx >= 0; idx--) { if (tmp_i % 2 == 1) num = 10 * num + idx; tmp_i /= 2; } dec_num.push_back(num); } sort(dec_num.begin(), dec_num.end()); std::cout << dec_num[N] << std::endl; } int main() { int N; std::cin >> N; downSizeingNum(N); return 0; } | cs |
3. 참고 |
질문이나 지적 있으시면 댓글로 남겨주세요~
도움 되셨으면 하트 꾹!
'<백준> > |C++| hard' 카테고리의 다른 글
[c++] 백준 3665 - 최종 순위(그래프 정렬하기) (0) | 2019.05.15 |
---|---|
[c++] 백준 11725 - 트리의 부모 찾기(BFS) (0) | 2019.05.07 |
[c++] 백준 11778 - 피보나치 수와 최대공약수 (0) | 2019.05.01 |
[C++] 백준 12796 - 나의 행렬곱셈 답사기 (0) | 2019.04.30 |
[c++] 백준 1015 - 수열 정렬 (0) | 2019.04.30 |