문제링크 : https://www.acmicpc.net/problem/10610
입력 숫자가 최대 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()함수를 사용하면 구분자로 나누면서 리스트의 문자열을 합칠수 있다
매우 유익한 문제였음.
'알고리즘' 카테고리의 다른 글
python 백준1049 기타줄(BOJ1049) (0) | 2023.01.09 |
---|---|
python 백준13305 주유소(BOJ13305) (0) | 2023.01.08 |
python 백준1463 1로 만들기(BOJ1463) (0) | 2023.01.08 |
python 백준9655 돌게임(BOJ9655) (0) | 2023.01.08 |
python 백준1010 다리 놓기(BOJ1010) (1) | 2023.01.04 |