📍 수 이어 쓰기 1
https://www.acmicpc.net/problem/1748
✨ 방법1 ✨
입력받은 숫자의 자리수를 구하기 위해 String으로 변환 후 길이를 구한다.
int num = Integer.parseInt(sc.readLine());
String numLength = num + " ";
int len = numLength.length() - 1;
1 ~ 9 까지는 자리수가 1,
10부터 99까지는 자리수가 2,
100부터 999까지는 자리수가 3이다.
세 번째 테스트 케이스의 경우, 입력 : 120, 출력 : 252이다.
num * len을 해버리면 1~120까지 3번 곱하는 것인데, (120의 자리수는 3)
이는 1~9까지 1번만, 10~99까지 2번만 곱할 것을 전부 3번씩 곱해버리는 것이기 때문에 오버해서 곱하는 것이다.
따라서 num * len 한 값에서 1~9까지 2번, 10~99까지 1번을 빼야 하는데, 이는 1~9까지 1번, 1~99까지 1번과 똑같은 값이다.
자리수의 크기만큼 반복문을 돌면서 오버해서 곱한 값들을 변수 sum에 담고 마지막에 num*len에서 빼준다.
String str = "9";
int sum = 0;
for(int i=1; i<len; i++){
sum += Integer.parseInt(str);
str += 9;
}
System.out.println(num*len - sum);
✨ 전체 코드 ✨
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(sc.readLine());
String numLength = num + " ";
int len = numLength.length() - 1;
String str = "9";
int sum = 0;
for(int i=1; i<len; i++){
sum += Integer.parseInt(str);
str += 9;
} System.out.println(num*len - sum);
}
}
🌀 성능
- 메모리 : 15,892 KB
- 시간 : 120 ms
⚡️ 방법2 ⚡️
⚡️ 전체코드 (wra님 코드) ⚡️
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int N;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(in.readLine());
int ans = 0;
for (int start = 1, len = 1; start <= N; start *= 10, len++) {
int end = start * 10 - 1;
if (end > N)
end = N;
ans += len * (end - start + 1);
}
System.out.println(ans);
}
}
🌀 성능
- 메모리 : 11340 KB
- 시간 : 68 ms
문자열로 변환하지 않고 수식으로 풀 수 있을 것 같긴 했는데 도저히 식이 떠오르지 않았다. 🙂↕️
역시 수학은 어려워 근데 재밌어
'Algorithm > Boj' 카테고리의 다른 글
[JAVA | 백준] #17388 와글와글 숭고한 (0) | 2024.08.08 |
---|---|
[JAVA | 백준] #1002 터렛 (0) | 2024.08.07 |
[JAVA | 백준] #16304 A Prize No One Can Win 🦄 (0) | 2024.08.06 |
[JAVA | 백준] #14730 謎紛芥索紀 (Small) (0) | 2024.08.06 |
[JAVA | 백준] #17093 Total Circle (0) | 2024.08.06 |