반응형

안녕하세요. 개발 중인 정주입니다.

 

오늘은 "백준 BOJ - 10610 30" 문제를 풀었습니다.


 

Github

 

GitHub - jeongju9216/SwiftAlgorithm: 스위프트 알고리즘

스위프트 알고리즘. Contribute to jeongju9216/SwiftAlgorithm development by creating an account on GitHub.

github.com

 

문제 링크

 

10610번: 30

어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한

www.acmicpc.net

 


풀이

이번 문제는 무슨 분류인지 잘 모르겠네요.

분류는 그리디로 되어 있는데 저는 문자열과 30의 배수 특징을 이용해 풀었습니다.

 

30의 배수 특징은 두 가지가 있습니다.

1. 1의 자리가 0으로 끝난다.

2. 모든 자릿수의 합이 3, 6, 9 즉 3의 배수이다.

이 규칙은 30, 60, 90, 120, 180, 210... 까지 직접 써보면서 발견했습니다.

이래서 공책은 필수라고 말하나봅니다.

 

아무튼 input을 문자열로 처리한 후 내림차순으로 정렬합니다.

그 후 마지막이 0으로 끝나는지, 모든 자리의 합이 3의 배수인지 확인합니다.

위 두 가지 조건 중 하나라도 만족을 안 하면 -1을 출력합니다.

두 가지 조건 모두 충족한다면 내림차순 정렬한 문자열을 출력합니다.

 


전체 코드


      
//10610 30
import Foundation
var input = Array(readLine()!).sorted(by: >)
let sum = input.reduce(0) { $0 + Int(String($1))! }
if input.last! != Character("0") || sum % 3 != 0 {
print("-1")
} else {
print(String(input))
}

아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형
유정주