
문제 링크 : https://www.acmicpc.net/problem/2877
#include <bits/stdc++.h>
using namespace std;
int n;
void func(string &ans, int count, int val)
{
for(int i = count - 1; i >= 0; i--)
{
int div = pow(2,i);
if(val / div == 0)
{
ans += '4';
}
else if(val / div == 1)
{
ans += '7';
}
val %= div;
}
return;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
//freopen("test.txt", "rt", stdin);
int num = 0, powcount = 1, prenum;
cin >> n;
while(1)
{
prenum = num;
num += pow(2,powcount);
if(n <= num)
{
break;
}
powcount++;
}
string ans = "";
func(ans,powcount,n - prenum - 1);
cout << ans;
return 0;
}
문제와 입출력 예시를 보자마자 이진수가 먼저 떠올랐고, 몇개 예시를 적어보면서 규칙성을 확인해 보았다.
규칙을 찾아 보니 4를 0, 7을 1로 바꿔서 생각한다면 0,1,00,01,10,11,000,001...
이렇게 자릿수가 증가하는 이진수 배열 규칙이 보였다.
자릿수를 계산하기 위해 while문을 통해 powcount를 얻었고, 구해진 자릿수 내의 숫자들 사이에서 상대적인 크기값인 n - prenum - 1 값을 func에 파라미터로 전달했다.
func는 자릿수를 미리 세팅한 이진수 변환 로직이지만, 0은 4로, 7은 1로 저장되게끔만 구현하였다.
