본문 바로가기

백준 PS일지/BruteForce

[백준/Swift] 2231 : 분해합

728x90

안녕하세요~~!!

 

 

이 문제는 brute Force 문제입니다.

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

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net


브론즈 2 문제인데 제가 이해력이 낮아서 그런지 살짝 해맸습니다... (ㅎㅎ ㅠㅠ 책 많이 읽고있는 중,,)

 

간단히 문제 파악하면서 시작하겠습니다.

생성자가 없을 경우 0을 출력해야합니다. 

 

입력값은 자연수 N 노란 줄 입니다.

생성자는 M 초록색 줄 입니다.

생성자 M의 각 자리수는 주황색 줄 입니다. 

분해합( K 라고 가정하고) K를 구할 때

K = M + M의 각 자리수 의 합 로 구할 수 있습니다. 

 

저는 생성자 M일때 M의 자리수를 구하기 위해 class variable에 정의한 temp변수를 통해 각 자리수를 구해갔습니다.

또한 특정 자리수의 합을 variable 의 sum 변수에 저장하고, 나중에 M의 각자리 수를 다 구했을 때 생성자 M까지 더한 후,

생성자 M이 입력받은 자연수 N과 같을 때 결과값으로 구했습니다.

 

다음은 제 코드입니다.

 

import Foundation
/**
 * ----------------------------------------
 * 입력값 = n
 *
 * 분해합 = n + n의 각 자리수
 * 이때의 n을 M이라하고, 생성자라고 한다.
 *      즉, 분해합 = m + n의 각 자리수.
 *
 *  포문을 통해 1부터 입력값까지 브루트포스 탐색을 실시한다.
 *      variable 클래스는 for문에 쓰일 변수
 *      - temp(이 변수에서 각 자리수를 얻어낼 것임),
 *      - sum(각 자리수를 더한 결과)
 *      을 저장합니다.
 *  i 를 특정 생성자라고 가정하고, 생성자 + 이 생성자의 각 자리수의 합 == 입력값일 때
 *  이전에 구한 값보다 작으면 결과가 되는 것!
 * ----------------------------------------
 * 주의할 점
 * 생성자 (M ) 존재하지 않을 경우 0을 반환 해야한다.
 */


solution()

func solution(){
    
    let n = inputN()
    var result = 1000000
    
    bruteForce(number: n, result: &result)
    
    print(result == 1000000 ? "0" : "\(result)")
}

class variable{
    var temp : Int
    var sum : Int
    
    init(M temp : Int){
        sum = 0
        self.temp = temp
    }
}


func bruteForce(number n : Int, result: inout Int ){
    
    for i in 1..<n {
        let data = variable(M: i)
        
        while(data.temp != 0){
            data.sum += data.temp % 10
            data.temp = data.temp / 10
            
            if data.temp == 0 {
                data.sum += i
                if result > data.sum  && n == data.sum {
                    result = i
                }
            }
        }
    }
}

func inputN()-> Int{
    if let n = readLine() {
        return Int(n) ?? 0
    }
    return 0
}

 

읽어주셔서 감사합니다.

 

728x90