문제 출처 : https://www.acmicpc.net/problem/22351
언어 : Kotlin
문제 설명 :
이환이는 4차 산업혁명 시대에 살고 있는 천재 5살 아기이다. 어느 날, 유치원 선생님은 이환이의 천재성을 알아본 후 다음과 같은 문제를 내줬다.
A 이상 B 이하의 정수를 모두 더한 값은 얼마일까?
이환이는 천재성은 있지만 아직 아기라서 덧셈이 무엇인지는 잘 모른다. 다음 날, 이환이는 공책에 A 이상 B 이하의 모든 정수를 크기 순서대로 띄어쓰기 없이 적어 왔다. 예를 들어 A = 4, B = 21 일 경우, 이환이가 적어 온 답은 456789101112131415161718192021과 같다.
이환이는 특출난 과제 집착력을 가진 천재지만, 이환이의 선생님은 그렇지 않다. 사실, 이환이의 선생님은 어제 본인이 부른 두 개의 수가 무엇이었는지도 잊어버렸다. 선생님이 기억하는 정보는 A와 B 모두 1 이상 999 이하의 정수였고, 당연히 A는 B보다 작거나 같았다는 것뿐이다.
이환이가 적어 온 숫자들의 나열이 주어지면, 선생님이 부른 두 수를 찾을 수 있을까?
입력 :
첫 번째 줄에 이환이가 적어 온 답을 나타내는 문자열 S가 주어진다. S는 숫자(0123456789)로만 이루어져 있으며, 길이는 1 이상 2889 이하이다.
출력 :
이환이의 선생님이 부른 두 정수 A와 B를 공백으로 구분하여 출력하라. 만약 가능한 답이 두 가지 이상이라면, 그중 A가 가장 작은 것을 출력하라.
이환이는 항상 정확한 답을 쓰기 때문에, 문제의 조건을 만족하는 답이 존재하는 입력만이 주어진다.
제한 사항 :
- 시간 제한 : 1초 (추가 시간 없음)
- 메모리 제한 : 1024MB (추가 메모리 없음)
입출력 예 :
입력 | 출력 |
9101112 | 9 12 |
12 | 1 2 |
999 | 999 999 |
풀이 :
주어지는 S의 길이는 1 이상, 가능한 답이 두 가지 이상이라면 작은 것으로.
S가 1 이상이라면?
9 -> 9 9
S가 2 이상이라면?
12 -> 1 2, 12 12 -> 1 2
99 -> 99 99
S가 3 이상이라면?
123 -> 1 2 3, 123 123 -> 1 2 3
910 -> 9 10, 910 910 -> 9 10
999 -> 999 999
S가 4 이상이라면?
1234 -> 1 2 3 4
8910 -> 8 9 10
문자열 S가 999나 11과 같이 반복되는 수가 나올 경우 result는 999 999, 11 11이 나와야 한다.
S의 길이가 4 미만일 경우, 모든 문자가 같은지 비교 후 같다면 그대로 출력.
아니라면 반복문을 통해 답을 찾아나가야 한다.
원본 문자열을 변수에 복사한 뒤, startWith라는 함수를 사용하여 맨 앞 자리수를 비교하며, 같을 경우 문자열의 앞에서부터 substring으로 잘라 변수의 길이를 줄여나가면서 변수가 Empty가 될때까지 진행한다. 변수가 Empty가 되었다면, 맞는 문자를 찾았으므로 sb에 값을 넣는다.
범위 1 ~ 999를 비교했는데 sb에 값이 없다면 맞는 문자를 찾지 못한 것 이므로 i를 증가시키고 다시 startWith 비교문으로 돌아간다.
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val s = readLine()
var idx = 1
val sb = StringBuilder()
if (s.length < 4) {
for (i in 1 until s.length) {
if (s[i] != s[0]) { idx = i; break }
}
}
if (idx != s.length) {
for (i in 1..999) {
if (s.startsWith("$i")) {
var temp = s
for (j in i..999) {
if (temp.startsWith("$j")) {
temp = temp.substring("$j".length)
} else {
break
}
if (temp.isEmpty()) { sb.append("$i $j"); break }
}
if (sb.isNotEmpty()) break
}
}
} else {
sb.append("$s $s")
}
bw.write(sb.toString())
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
24510번: 시간복잡도를 배운 도도 (0) | 2024.05.28 |
---|---|
20154번: 이 구역의 승자는 누구야?! (0) | 2024.05.28 |
23841번: 데칼코마니 (0) | 2024.05.27 |
17502번: 클레어와 팰린드롬 (0) | 2024.05.27 |
1593번: 문자 해독 (0) | 2024.05.24 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!