728x90
https://www.acmicpc.net/problem/1748
1748번: 수 이어 쓰기 1
첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.
www.acmicpc.net
이 문제는 절대... 1 ~ N 수를 진짜로 이으면 안 된다.ㅋㅋㅋ 규칙을 찾아야 한다.
자릿수를 생각해보면 되는데,
1 - 9 : 1칸
10 - 99 : 2칸
100 - 999 : 3칸
....
이런식으로 진행된다.
즉, N의 자릿수가 몇 개인지 알아내고, 그 아랫 자릿수들의 길이를 구한다.
1 - 9 : 1칸 -> 9
10 - 99 : 2칸 -> 180
100 - 999 : 3칸 -> 2700
이렇게 보면 딱 눈에 규칙이 보이지 않나요?
1 - 9 : 1칸 -> 9 : 1 * 9 * 10^0
10 - 99 : 2칸 -> 180 : 2 * 9 * 10^1
100 - 999 : 3칸 -> 2700 : 3 * 9 * 10^2
...
여기서 당연히 1, 2, 3은 자릿수에 따라 차지하는 길이를 말한다!
그리고 N이 속한 자릿수의 길이를 구해야 하는데,
15의 경우, 10-15이므로 15 - 10 + 1의 개수가 나온다
-> 10, 11, 12, 13, 14, 15 (6개)
여기서도 길이만큼 자리를 차지하기 때문에 * length를 해준다.
import Foundation
/*
1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.
123456789101112131415161718192021222324...
이렇게 만들어진 수는 몇자리수?
*/
let N = readLine()!
let length = N.count //N은 몇 자리수?
var answer = 0
for i in 1..<length { //아랫 자리수들 더해주기
answer = answer + i * 9 * Int(pow(10.0, Double(i - 1)))
}
answer = answer + (Int(N)! - Int(pow(10.0, Double(length - 1))) + 1) * length
print(answer)
*여기서 Swift의 pow 함수는 인자를 Float으로 받고 Float을 반환하기 때문에 값 타입 변환에 신경 써야 한다.
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준/Swift] 16974번: 레벨 햄버거 (0) | 2022.12.20 |
---|---|
[백준/Swift] 14500번: 테트로미노 (0) | 2022.12.19 |
[백준/Swift] 3085번: 사탕 게임 (0) | 2022.12.18 |
[백준/Swift] 2164번: 카드2 (0) | 2022.12.14 |
[백준/Swift] 1919번: 애너그램 만들기 (0) | 2022.12.13 |