Bibbidi Bobbidi Boo

* 알고리즘 너무 약해서 기초 문제 50개 목표로 푸는 중...

* 3시간 안에 답을 내지 못하면 답지를 보고 30분 내로 정답 판정을 받고, 3일 뒤 다시 풀어보기


Greedy

3 / 50(NEW!)

 

탐색

2 / 50

 

기초 동적 프로그래밍

3 / 50

 

투포인터

0 / 10


문제

10610번: 30 (acmicpc.net)

 

10610번: 30

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

www.acmicpc.net

→ solved.ac 기준 실버 4


문제 해결 아이디어

가장 먼저 떠오르는 브루트포스

→ 30의 배수가 되는 가장 큰 수

→ 각 숫자를 섞어서 30의 배수가 되도록 해야 함

→ for문으로 모든 숫자를 뽑아서 30의 배수가 있는지 확인한다

→ 근데 N이 10000이라서 시간 초과

 

그 외에는 그리디를 생각해야 함

→ 30의 배수이므로 늘 마지막 숫자는 0

→ 문제의 출력 예시를 보니 일정한 패턴이 존재함

→ 30의 배수가 있는 경우: N으로 할 수 있는 가장 큰 숫자가 늘 답

그 외: -1

→ 30의 배수 몇 가지를 가지고 순서를 뒤집어도 30의 배수임을 확인


구현

내 풀이


import sys
input = sys.stdin.readline

n = list(input().strip('\n'))
n.sort(reverse=True)
max_number = int(''.join(n))
if (max_number % 30 == 0) :
  print(max_number)
else:
  print(-1)

메모

  • 걸린 시간 : 15분
  • 다른 사람 풀이는 대부분 이렇다.
    • n의 마지막이 0이 되는지 확인한다.
    • 대부분 n의 각 자리수를 합했을 때 3의 배수가 되는지 확인한다
    • 근데 결과적으로는 else해서 sort한 값을 더해주는 것 같아서 똑같음.
    • N이 0으로 끝나고, N의 모든 자릿수의 합이 3의 배수라면 30의 배수라는 걸 알았다.

마치며

뭐지뭐지뭐지..?!! 하면서 푼 문제

그리고 드디어 골드 5가 되었따(다만 푼 문제가 대부분 실버문제라는 게 흠)

profile

Bibbidi Bobbidi Boo

@비비디

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!