안녕하세요~~!!
이 문제는 brute Force 문제입니다.
https://www.acmicpc.net/problem/2231
브론즈 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
}
읽어주셔서 감사합니다.
'백준 PS일지 > BruteForce' 카테고리의 다른 글
[백준/Swift] 사탕 게임: 3085 | PS일지 (0) | 2023.05.09 |
---|---|
[백준/Swift] 2475: 검증수 (0) | 2023.02.16 |
[백준/Swift] 1025 : 제곱수 찾기 문제 뿌수기!! (0) | 2022.07.14 |
[백준/Swift] 1018 : 체스판 다시 칠하기 (0) | 2022.04.30 |