반응형

백준 6679번 문제입니다. (solved.ac) 기준 브론즈 2 문제입니다.

https://www.acmicpc.net/problem/6679

 

6679번: 싱기한 네자리 숫자

싱기한 네자리 숫자란, [1000,9999]인 10진수 숫자중에서,  다음의 조건을 만족하는 숫자를 말한다. 숫자를 10진수, 12진수, 16진수로 나타낸 다음, 각각의 숫자에 대해, 각 숫자의 자리수를 더했을

www.acmicpc.net

문제

문제 접근

특정한 네자리 숫자를 10, 12, 16진법으로 변환 후 모든 자릿수를 더하였을 때 같은 값이 나오는 숫자가 있다면 그것을 싱기한 네자리 숫자라고 합니다.

1000 ~ 9999까지의 모든 수들 중 싱기한 네자리 숫자를 출력하면 되는 문제입니다. 힌트에서 싱기한 네자리 숫자의 첫 번째 수는 2992로 알려줬으므로 1,000부터가 아닌 2,992부터 탐색하도록 하였습니다. 

 

2992~9999까지 모든 수를 탐색하여 각 10, 12, 16진법으로 변환 후 자릿수를 더하여 셋이 같다면 출력하도록 하였습니다. 

코틀린에서 진법 변화를 하고 싶을 경우 toString()의 인자로 수를 넣어주면 해당 진법으로 변환이 됩니다. 넣지 않는다면 기본인 10진수로 됩니다. ex) num.toString(16) -> num을 16진법으로 변환.

12, 16진법으로 변환하면 알파벳이 나오게 되기 때문에 각 진법으로 변환 후 매핑을 하여 그냥 숫자라면 정수형인 int로 그렇지 않고 알파벳이라면 해당 알파벳에 맞는 수를 반환해주는 함수를 만들어 준 후 모든 자릿수를 더하였습니다.

정답 코드

fun main() {

    for (no in 2992..9999) {

        val decimal = no.toString().toList()
            .map { if (it.isDigit()) it - '0' else toNum(it) }.sum()

        val duoDecimal = no.toString(12).toList()
            .map { if (it.isDigit()) it - '0' else toNum(it) }.sum()

        val hexaDecimal = no.toString(16).toList()
            .map { if (it.isDigit()) it - '0' else toNum(it) }.sum()

        if (decimal == duoDecimal && decimal == hexaDecimal) println(no)

    }
}

fun toNum(n: Char): Int {
    var num = 0
    when (n) {
        'a' -> num = 10
        'b' -> num = 11
        'c' -> num = 12
        'd' -> num = 13
        'e' -> num = 14
        'f' -> num = 15
    }
    return num
}

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기