ํ๋ฌธ์ธ ์(11068๋ฒ)
Silver 5
#์ํ #๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ
https://www.acmicpc.net/problem/11068
๋ฌธ์ ๋ด์ฉ
๋ฌธ์ ์ ๊ทผ
10์ง์์ธ ์ซ์๋ฅผ ์ ๋ ฅ๋ฐ์ ๋, 2์ง๋ฒ๋ถํฐ 64์ง๋ฒ๊น์ง ์๋ฅผ ๋ณํํ ๋, ๋ณํํ ์๊ฐ ํฐ๋ฆฐ๋๋กฌ(ํ๋ฌธ)์ด๋ฉด 1์ ์ถ๋ ฅ. ์๋๋ฉด 0์ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ด๋ค.
Kotlin์์ ์ง๋ฒ ๋ณํ์ ์ฝ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ toString(N), toInt(N)์ ์ฐ๋ ๋ฐฉ๋ฒ์ด๋ค.
ํ์ง๋ง toString, toInt๋ก ๋ ๋จนํ ์๊ฐ ์๋ค. ์๋ํ๋ฉด toString, toInt๋ฅผ ์ฐ๋ฉด ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
Exception in thread "main" java.lang.IllegalArgumentException: radix 37 was not in valid range 2..36
์ค๋ฅ ๋ฉ์์ง๋ก ๋ดค์ ๋ 36์ง๋ฒ๊น์ง ๋ณํ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋ปํ๋ ๊ฒ ๊ฐ๋ค. ๊ทผ๋ฐ ๋ฌธ์ ์์๋ 64์ง๋ฒ๊น์ง ๊ตฌํํด์ผ ํ๋ค.
๊ทธ๋์ ์ง์ ์ง๋ฒ ๋ณํ ํจ์๋ฅผ ๋ง๋ค์ด ์ค์ผ ํ๋ค.
์ง๋ฒ ๋ณํ ํจ์์ ์๋ฆฌ๋ ์ฐ์ ๋ณ๊ฒฝํ ์ซ์์ ๋ช ์ง๋ฒ์ผ๋ก ๋ณํ์ํฌ์ง ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ๊ฒ์ด๋ค.
private fun converter(digits: Int, number: Int): String
number๋ฅผ digits๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํด์ ๊ฒฐ๊ณผ๋ฅผ return ํ String์ ๋งจ ์์ ๋ฃ์ด ์ค์ผ ํ๋ค.
23์ 2์ง์๋ก ๋ณ๊ฒฝํ ๋๋ฅผ ์๋ก ๋ค์ด ๋ณด๊ฒ ๋ค.
1. 23์ 2์ง์๋ก ๋ณ๊ฒฝํด์ผ ํ๋๊น 2๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํ๋ค(remain). ๊ทธ๋ฌ๋ฉด 1์ด ๋์จ๋ค(23 % 2 = 1).
2. 1์ sb(StringBuilder)์ ๋งจ ์์ ์ถ๊ฐํด ์ค๋ค.
3. ๊ทธ๋ฆฌ๊ณ number๋ฅผ digits๋ก ๋๋ ์ ๊ฐ์ ๊ฐฑ์ ํ๋ค. ๊ทธ๋ฌ๋ฉด 11์ด ๋๋ค(23 / 2 = 11.5).
์ 3๊ฐ์ ๊ณผ์ ์ ๋ฐ๋ณตํด ์ฃผ๋ฉด 1110์ด ๋์์ 2์ง์๋ฅผ ๊ตฌํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ 1๊ฐ์ง์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด์ผ ํ๋ค. 11์ง๋ฒ๋ถํฐ๋ 0๋ถํฐ 9๊น์ง๋ก ํํํ ์๊ฐ ์์ด์ ๋ฌธ์๋ฅผ ์จ์ผ ํ๋ค.
๋ฌธ์๋ฅผ ์ฐ๊ธฐ ์ํด remain๊ฐ์ด 10 ์ด์์ธ์ง ํ์ธํด์ผ ํ๋ค. ๋๋จธ์ง๊ฐ 10์ธ ๊ฒฝ์ฐ๋ถํฐ digits๊ฐ 11 ์ด์์ด๋ผ๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ํ๋ฒณ์์ remain๋ฒ์งธ ์ํ๋ฒณ ๊ฐ์ ๊ตฌํด์ sb์ ์ถ๊ฐํ๋ ์์ ์ด ํ์ํ๋ค.
while (num != 0) {
val remain = num % digits
if (remain > 9) sb.insert(0, (remain + 55).toChar())
else sb.insert(0, remain)
num /= digits
}
remain์ 55๋ฅผ ๋ํด์ ์ํ๋ฒณ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค. ๊ทธ๊ฒ์ char๋ก ๋ณ๊ฒฝํ๋ฉด ์ํ๋ฒณ์ด ๋์ค๊ฒ ๋๋ค.
์ง์ ๋ณํ์ ๋ํ ๋ ์์ธํ ์ค๋ช ์ ์๋์ ํฌ์คํ ์ ์ ํ ์๋ค. ๋๋ ์ด ํฌ์คํ ์ ๋ณด๊ณ ์๋ฆฌ๋ฅผ ๊นจ์ฐ์ณค๋ค.
๋ฌธ์ ํด๊ฒฐ ์ฝ๋
import java.io.BufferedReader
import java.io.InputStreamReader
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val case = readLine().toInt()
for (c in 0 until case) {
val number = readLine().toInt()
var isPalindrome = 0
for (f in 2 .. 64) {
val formation = converter(f, number)
if (formation.reversed() == formation) {
isPalindrome = 1
break
}
}
println(isPalindrome)
}
}
private fun converter(digits: Int, number: Int): String {
var num = number
val sb = StringBuilder()
if (num == 0) return "0"
while (num != 0) {
val remain = num % digits
if (remain > 9) sb.insert(0, (remain + 55).toChar())
else sb.insert(0, remain)
num /= digits
}
return sb.toString()
}
๋ฌธ์ ํ์ด
์ ๋ ฅ๋ฐ์ ์ซ์๋ฅผ converter ํจ์๋ก f์ง๋ฒ์ผ๋ก ๋ณํํ๋ค.
๋ณํํ f์ง๋ฒ ์ซ์๊ฐ ํฐ๋ฆฐ๋๋กฌ์ธ์ง ํ์ธํ๊ธฐ ์ํด์๋ ๋ณ๊ฒฝํ ๊ฐ์ด ๋ค์ง์ ๊ฐ๊ณผ ์ผ์นํ๋ฉด ํฐ๋ฆฐ๋๋กฌ์ด๋ค.
๋ฌธ์ ํด๊ฒฐ ๊ณผ์
์ง๋ฒ ๋ณํ ํจ์๋ฅผ ์ง์ ๊ตฌํํด์ผ ํ๋ ๋ฌธ์ ์ด๋ค. ์ผ๋ถ ์ธ์ด์์๋ ๊ทธ๋ ์ง ์์๋ ๋๋ ๊ฒ ๊ฐ์ง๋ง.
kotlin์ 36์ง๋ฒ๊น์ง๋ฐ์ ์ง์ํ์ง ์๋ ๋ฏํ๋ค. ๊ทธ๋์ ๊ทธ๋ฅ ๋ง๋ค์๋ค.
๋ง๋ค๊ณ ๋ณด๋ ๊ทธ๋ ๊ฒ ๋ณต์กํ ๋ก์ง์ ์๋์๋ค.
'๐ฏ | ๋ฐฑ์ค > ๐ | Silver' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin, S2] ๋ฐฑ์ค 2716๋ฒ ์์ญ์ด ๋งค๋ฌ๊ธฐ (0) | 2024.08.25 |
---|---|
[Kotlin] ๋ฐฑ์ค 16506๋ฒ CPU (0) | 2024.08.23 |
[Kotlin, S1] ๋ฐฑ์ค 1991๋ฒ ํธ๋ฆฌ ์ํ (0) | 2024.08.21 |
[Kotlin, S3] ๋ฐฑ์ค 1904๋ฒ 01ํ์ผ (0) | 2024.08.20 |
[Kotlin, S3] ๋ฐฑ์ค 1002๋ฒ ํฐ๋ (0) | 2024.08.20 |