알고리즘

python 백준10610 30(BOJ10610)

피프밍 2023. 1. 8. 16:26

문제링크 : https://www.acmicpc.net/problem/10610

 

10610번: 30

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

www.acmicpc.net

입력 숫자가 최대 105개의 숫자로 구성되어 있으므로

이것 숫자로 계산해서 풀게 아니라 문자열로 생각하고 풀어야될것같았다

이 문제의 핵심 아이디어는

- 입력숫자에 0이 포함

- 자릿수의 합이 3의 배수

인것같다 그리고 최대값을 구하는것이니 큰숫자부터 주르륵 나열하면 된다

그래서 아래와 같이 풀어서 제출을 했는데

import sys

input = sys.stdin.readline

input_num = int(input())

def find(value):
  input_str = str(value)
  sum = 0
  input_num_count = [0] * 10
  #숫자 갯수 카운트와 자릿수의 합
  for i in input_str:
    num = int(i)
    input_num_count[num] += 1
    sum += num 
  #자릿수의 합이 3의 배수가 아니거나 0이 없으면 -1리턴
  if sum % 3 != 0 or input_num_count[0] == 0:
    return -1
  #리턴할 수의 문자열
  return_str = ""
  for i in range(0,10):
    for j in range(input_num_count[i]):
      #갯수만큼 숫자 더하기
      return_str = str(i)+return_str
  return int(return_str)
#출력
print(find(input_num))

정답은 맞았지만 역시나 시간 문제다..

사람들은 100ms 안쪽으로 다 풀리는데 나만 800ms가 넘는다..

다른사람은 어떻게 풀었나 봤더니 파이썬 기본 내장함수를 아주 요긴하게 쓴것같다

그래서 나도 내장함수를 활용해서 다시 풀었다

#입력
input_num_str = list(input())
#숫자로 변환
input_num = list(map(int, input_num_str))

#자리수 합이 3이 아니거나 숫자에 0이 없다면 -1 리턴
if sum(input_num) % 3 != 0 or 0 not in input_num:
  print(-1)
else:
  input_num_str.sort(reverse=True)
  #리스트 문자열을 구분자로 합쳐주는 함수 join
  print("".join(input_num_str))

매우 간단해졌쥬?

시간도 매우 빨라짐

이번에 알게된건

- 입력을 리스트로 받으면 문자가 하나씩 리스트로 담긴다

- 문자로 된 리스트를 다시 list(map()) 을 사용하면 전부 정수로 변환할수있다

- "구분자".join()함수를 사용하면 구분자로 나누면서 리스트의 문자열을 합칠수 있다

매우 유익한 문제였음.