[백준] 30(10610) - python

✏️ 문제

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

🎈 입력

N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.

🎈 출력

미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.

🎈 입출력 예

30 ➡️ 30
102 ➡️ 210
2931 ➡️ -1
80875542 ➡️ 88755420

👩‍💻 내 코드

처음 이 문제를 보았을 땐 생각보다 복잡할 것 같다고 생각했다. 그런데 문제에서 '30의 배수가 되는 가장 큰 수'를 만들어야 한다고 했기 때문에 3의 배수 특징을 검색해보았다. 검색 결과 3의 배수는 각 자리 숫자의 합이 3의 배수라는 아주 중요한 특징을 가지고 있다는 것을 알게 되었고, 덕분에 쉽게 풀 수 있었다.

검색을 하지 않았더라면 이 규칙을 내가 직접 생각해낼 수 있었을까 하는 의문이 든다. 실제 코딩테스트를 볼 때는 이런 검색조차 허용이 되지 않으니 연습을 많이 해야됨을 깨달았다.🥲

코드를 구현하기 전 생각한 규칙은 아래와 같다.

  1. 3의 배수는 각 자리 숫자의 합이 3의 배수이다.
  2. 가장 마지막 숫자가 0이면 10의 배수가 된다.

위의 규칙을 모두 이용해 코드를 구현했다.

N = str(input())
sum = 0
arr = []

if "0" not in N:
    print(-1)
else:
    for i in N:
        sum += int(i)
        arr.append(int(i))
    if sum%3 != 0:
        print(-1)
    else:
        result = ""
        arr.sort(reverse=True)
        for i in arr:
            result += str(i)
        print(int(result))

이 문제를 풀면서 배수 판정법을 보게 되었는데 숫자는 굉장히 신비로운 것 같다. 새로운 것을 하나 또 배우게 되어서 기분이 좋다.🙂

좋은 웹페이지 즐겨찾기