BOJ / Greedy / 30 / Python

30

n을 리스트로 입력받아서 숫자 한 자리씩 떼어내서 저장
itertools.permutations로 가능한 모든 숫자 조합을 만들어 리스트로 저장
그 리스트를 내림차순으로 정렬 후
30으로 나눠가며 나누어 떨어지면 해당 값이 정답이 된다.
위와 같이 풀어봤는데 메모리 초과가 떴다.
쓸데없이 복잡하게 생각했다.

풀면서

  • 개행문자 빼고 문자열 입력받기
n = input().rstrip()
  • "구분자".join(리스트)
    구분자를 기준으로 리스트 내의 문자들을 합쳐준다.

  • 형변환, map(함수, 반복 가능한 자료형)
    여러 개의 데이터를 한 번에 자료형으로 변환할 때
    두 번째 인자로는 주로 리스트나 튜플이 들어간다.

nums = list(map(int, input().rstrip()))
nums = map(str, nums)

내 코드1

import sys
input = sys.stdin.readline

# 개행문자빼고 입력받은 문자열을 map(int,~)로 정수형으로 변환 후 리스트화
nums = list(map(int, input().rstrip()))
if 0 not in nums or sum(nums) % 3 != 0:
    print(-1)
else:
    # 최댓값을 찾는 거니까 + 0은 자동으로 가장 끝자리에 위치
    nums.sort(reverse=True)
    # 정수형으로 저장된 nums 리스트내의 모든 값들을 str형으로 변환
    nums = (map(str, nums))
    print("".join(nums))

30의 배수를 찾아내는 조건문을 만들어 주면 된다.
3의 배수는 각 자릿수의 합이 3의 배수다.
즉, 0이 반드시 1개 이상 존재하고 모든 자릿수들의 합이 3의 배수라면 30의 배수가 된다.

내 코드2

import sys
input = sys.stdin.readline

nums = list(input().rstrip())
nums.sort(reverse=True)

if nums[-1] != '0' or sum(map(int, nums)) % 3 != 0:
    print(-1)
else:
    print("".join(nums))

sum을 구할 때만 nums내의 값들이 정수형이면 된다.
실행 시간이 줄었다.

좋은 웹페이지 즐겨찾기