티스토리 뷰
문제 출처: https://www.acmicpc.net/problem/2877
2877번: 4와 7
창영이는 4와 7로 이루어진 수를 좋아한다. 창영이가 좋아하는 수 중에 K번째 작은 수를 구해 출력하는 프로그램을 작성하시오.
www.acmicpc.net
K의 값이 10억까지 들어올 수 있어 브루트 포스로 접근하면 시간 초과가 발생할 것이다.
규칙을 찾기위해 정답을 나열해본다.
4, 7, 44, 47, 74, 77, 444, 447, 474, 477, 744,...
4와 7을 0과 1로 대응시켜보면 다음과 같은 규칙이 보인다.
0, 1, 00, 01, 10, 11, 000, 001, 010, 011, 100,...
1칸짜리 2^1개,
2칸짜리 2^2개,
3칸짜리 2^3개 순으로 증가한다.
K에 2^1, 2^2, 2^3 순으로 계속 빼기를 한다면,
언젠가 K <= 0이 될 것이다.
마지막으로 2^n을 뺐을 때 음수 혹은 0이 나왔다면 n자리로 구성되는 수임을 알 수 있다.
K에 2^n 더해서 값을 되돌려주고 K-1을 2진수로 변경하고 길이가 n이 아닌 경우 0을 채운다.
그 후 0은 4로 1은 7로 변경하여 출력하면 된다.
EX)
K = 10
K = K - 2^1 ---> K = 8
K = K - 2^2 ---> K = 4
K = K - 2^3 ---> K = -4
K가 음수가 되었기 때문에 마지막 2^n을 더해서 돌려준다. K= K + 2^3 = 4 , K는 n 즉 3자리로 구성됨을 알 수 있다.
K-1을 이진수로 변경하면 11이 된다. 현재 길이가 2이기 때문에 길이가 3이 될 때까지 0으로 채운다.
11 --> 011 이후 0은 4로 1은 7로 변경한다. 011 --> 477
최적화를 위해 이진수 변환 함수를 작성할 때 0과 1을 4와 7로 바로 변환해주는 방식으로 작성했다.
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<math.h>
#include<stack>
using namespace std;
vector<char> tran(int a) {
vector <char> temp;
if (a == 0)temp.push_back('4');
while (a != 0) {
if (a % 2)temp.push_back('7');
else temp.push_back('4');
a /= 2;
}
return temp;
}
int main() {
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int K;
cin >> K;
int a = 2;
int cnt = 1;
vector<char> ans;
while (true) {
K -= a;
if (K <= 0) {
ans = tran(K + a - 1);
while (ans.size() != cnt)ans.push_back('4');
break;
}
else{
a *= 2;
cnt++;
}
}
reverse(ans.begin(), ans.end());
for (int i = 0; i < ans.size(); i++)cout << ans[i];
}
'PS' 카테고리의 다른 글
| [백준] 1922번 네트워크 연결 (0) | 2022.05.27 |
|---|---|
| [백준] 1004번 어린왕자 (0) | 2022.05.22 |
| [백준] 1918번 후위 표기식 C++ (0) | 2022.05.18 |
| [백준] 6018번 Tea Time (0) | 2022.05.13 |
| [백준] 7511번 소셜 네트워킹 어플리케이션 C++ (0) | 2022.05.13 |
- Total
- Today
- Yesterday
- 벨만포드
- 벨만-포드
- 타임머신
- 골목길C++
- 6018
- tea time
- 골목길
- 1738
- 7511
- 소셜네트워킹어플리케이션
- 상범빌딩
- 후위 표기식
- 스택
- C++
- 백준
- 6539
- 1004
- 중위 표기식 후위 표기식으로 변환
- 1918
- 11657
- 어린왕자 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 |
