반응형

백준 4673번 문제입니다. (solved.ac)기준 실버 5 문제입니다.

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

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

문제

문제 접근

d(n)은 n과 n의 각 자리수를 더하는 함수라고 합니다. ex) d(672) => 672 + 6 + 7 + 2 = 687

n을 d(n)의 생성자라고 합니다. d(672)에서는  672은 687의 생성자 입니다. 

생성자가 없는 수를 셀프 넘버라고 합니다. 100 이하의 셀프 넘버는 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97와 같이 총 13개가 있습니다. 

10000이하의 셀프 넘버를 한 줄에 하나씩 출력하도록 코드를 작성하면 됩니다.

생성자가 있는 수들(셀프 넘버가 아닌 수)를 담을 리스트인 exceptedList라는 mutableList를 만들어주고 1 ~ 10000까지 반복문을 통하여 d(n)을 계산할 수 있도록 구현하였습니다.d(10000)은 10000을 넘기므로 명시적으로 제외하였습니다.

10000보다 작은 수들의 자릿수는 총 4가지 경우가 있습니다. 한 자릿수, 두 자릿수, 세 자릿수, 네 자릿수. 각 자릿수 별로 d(n)을 계산하여 생성자가 있는 수들은 exceptedList에 add해주었고 작업이 끝난 후에는 1 ~ 10000까지 모든 수를 exceptedLisg에 존재하는지 여부를 확인하고 존재하지 않는다면 셀프 넘버라는 뜻이므로 println()을 이용하여 한 줄에 하나씩 출력하도록 하였습니다.

정답 코드

fun main() {
    val exceptedList = mutableListOf<Int>()

    for (no in 1..10000) {
        // 네 자리 수 일경우
        if (no / 1000 > 0) {
            val thousands = no / 1000
            val hundreds = (no % 1000) / 100
            val tens = (no % 100) / 10
            val unit = (no % 10)
            exceptedList.add(no + thousands + hundreds + tens + unit)

        } else if (no / 100 > 0) {
            val hundreds = no / 100
            val tens = (no % 100) / 10
            val unit = (no % 10)
            exceptedList.add(no + hundreds + tens + unit)
        } else if (no / 10 > 0) {
            val tens = no / 10
            val unit = no % 10
            exceptedList.add(no + tens + unit)
        } else {
            exceptedList.add(no + no)
        }
    }

    for (no in 1..10000) {
        if (!(exceptedList.contains(no))) println(no)
    }
}
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기