알고리즘 문제 풀이

[Swift] BOJ 10610번 30

lgvv 2022. 3. 22. 18:30

BOJ 10610번 30

 

✅ 후 오랜만에 생각보다 어려웠음

처음에 문제보고 잘 이해가 안가서 문제 설명 다른 사람이 해둔거 쓱 본다음에 풀려고 했는데, 어떻게 해야할 지 몰라서 재귀를 돌렸음

 

🟠 [처음 내 접근 방식]

1. 인풋을 String으로 받는다.

2. 받은 String을 [Int] 배열로 만든 후 내림차순으로 정렬한다.

3. 0이 포함되어 있지 않다면, 30의 배수가 될 수 없음으로 바로 "-1"을 리턴하고 종료한다.

  ex) "2931" -> [9, 3, 2, 1]

4. 재귀를 통해서 9xxx, 3xxx 등 조합 가능한 네자리 수를 전부 만들어 낸다.

  4-1. 이때 재귀의 종료 조건에서 4자리 수가 완성되면, 30으로 나누어서 30의 배수인지 아닌지 판단하고, 이 값들 중에서 max값을 갖고 있는 전역 변수를 두어 지속적으로 max값을 업데이트 한다.

 

[문제점] 일단 재귀를 다룰줄은 아는데, 이게 엄청 익숙한 편이 아니라서 뭔가 맘에 들지 않았음.

그리고 이렇게 푸는게 맞는건가 싶어서 구글링 해봄.

 

🟠 [구글링 후 접근방식 개편]

30의 배수를 알기 위해서는 수학적으로 2가지만 만족하면 되는데,

1. 각자리 수의 합이 3으로 나누어 떨어진다.

2. 0을 포함하고 있어야 한다.

 

30의 배수임을 확인하는 조건이다.

그리고 마지막으로 최댓값을 만들라고 했으니까, 숫자 하나하나 따로 분리했다가 내림차순으로 정렬해서 보여주면 끝

 

이건 위의 방법을 모르면 꽤나 어렵... 아니 시간이 .. 

        let input = readLine()
        
        var flag = false
        var input_list = [Int]()
        var sum = 0
        input!.forEach{ c in
            let num = Int("\(c)")!
            
            input_list.append(num)
            sum += num
            
            if num == 0 {
                flag = true
            }
        }
        
        if flag && (sum % 3 == 0) {
            input_list = input_list.sorted(by: >)
            
            let answer = input_list.map { "\($0)" }.joined()
            print(answer)
        } else {
            print("-1")
        }