https://www.acmicpc.net/problem/2877
* 풀이
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll k;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>k;
int len=1;
int cnt=2;
while(k>cnt) {
k-=cnt;
cnt *=2;
len++;
}
int idx = k; //그룹내 위치
idx--; //0-idx로
// cout<<k<<" ";
string ret="";
for(int i=0;i<len;++i) {
if(idx & (1<<i)) {
ret = "7" + ret;
}
else {
ret="4" + ret;
}
}
cout<<ret;
}
- 자바는 string대신
- StringBuilder 사용
- insert ( idx, 문자) 사용
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long k = sc.nextLong();
int len = 1;
long cnt = 2;
while (k > cnt) {
k -= cnt;
cnt *= 2;
len++;
}
long idx = k - 1;
StringBuilder ret = new StringBuilder();
for (int i = 0; i < len; i++) {
if ((idx & (1L << i)) != 0) {
ret.insert(0, "7");
} else {
ret.insert(0, "4");
}
}
System.out.println(ret.toString());
}
}
* 문제2 (숫자에 0이 포함된 경우)
- 숫자가 0,3일때도 잘작동하는가?
- 맨앞이 0인 숫자는 유효하지 않음.
- 핵심변수
- cnt
- len
- k
- 이진수, 십진수도 그려보자.
- 0인경우는, 맨앞을 특수처리 해줘야함.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll k;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>k;
int len=1;
int cnt=1;
while(k>cnt) {
k-=cnt;
cnt *=2;
len++;
}
int idx = k; //그룹내 위치
idx--; //0-idx로
// cout<<k<<" ";
string ret=""; //맨앞고정
len--; //자리수하나 줄여야함 (맨앞고정)
for(int i=0;i<len;++i) {
if(idx & (1<<i)) {
ret = "4" + ret;
}
else {
ret="0" + ret;
}
}
ret = "4" + ret; //맨앞고정
cout<<ret;
}
'Algorithm > 수학' 카테고리의 다른 글
[틀림] 백준 1456 거의소수 // 대소비교 최적화방법, 소수판별 (0) | 2025.03.27 |
---|---|
[틀림] 백준 2023 신기한소수 //dfs, 소수판별 알고리즘, 안되는경우(1천만) (0) | 2025.03.26 |
[알고리즘] 백준 4375 1 // 모듈러연산, str금지, 자릿수저장할 변수 (0) | 2025.01.01 |
[알고리즘] 백준 1629 곱셈 // 지수승은 재귀로 (0) | 2024.12.31 |
[알고리즘] 구름 해외주식투자 c++ // 소수점 절사방법, 비교방법, 로그값구하는법 (0) | 2024.06.12 |