Greedy(6)_30(10610번)

백준 10610

양수 N을 입력 받아 30의 배수가 되는 가장 큰 수 만들기

아이디어

  1. 수를 입력 받아서 각 수를 리스트에 쪼개서 저장.
  2. 그 수를 정렬.
  3. 수를 조합하여 30으로 나누어떨어지는 수 찾고
  4. 가장 먼저나온 수 출력
  5. 0으로 시작하는 경우 예외처리해주기

=> 이렇게 되면 for문을 N번 돌아야 한다, 각각에 맞게 예외처리 해줘서 하는 건 올바른 답이 아닐 듯. -> 어떤 좋은 idea가 있는지 찾아보자.

30이란 값은 2가지 특징을 가지고 있다.

  1. 30의 배수가 되려면 마지막 숫자는 무조건 0이 나와야 한다
  2. 마지막 숫자를 제외한 나머지 숫자의 3의 배수이며, 모든 자리의 숫자의 합이 3의 배수여야 한다.

=> 0부터 9까지의 숫자를 담는 배열을 만들어서, 각각의 숫자의 합을 3으로 나누어서 0이 되는지 확인하는 방법

import sys

T = sys.stdin.readline().rstrip()  # 문자열로 입력 받기

arr = [0]*10
n = 0
sum = 0

for i in range((len(T))):
    n = int(T[i])
    sum += n
    arr[n] += 1

if(arr[0] == 0 or sum % 3 != 0):
    print(-1)
    sys.exit()

for i in range(9, -1, -1):
    for j in range(0, arr[i], 1):
        sys.stdout.write(str(i))

알게된 사실

  1. 숫자의 각 자리수를 한 자리씩 나눠처 처리하여야 한다면, 숫자로 받지말고 문자로 입력값을 받아버리면 편하다

  2. 파이썬 줄바꿈 없이 출력 : sys.stdout.write()

  3. isdigit() 함수 -> 문자열인지 체크

  4. rstrip(“\n”)를 쓰면 개행문자 제거 가능하다.

  5. 여전히 이건 잘 모르겠다. sys.stdin.readline()으로 문자열을 읽으면 개행문자가 들어간다. 이 때, int() 형변환을 해주면, 개행문자까지 형변환이 되서 오류가 난다. rstrip() 같은 걸로 제거해도 ‘‘가 남아있다는 오류가 출력된다.

  • input()으로 값을 입력 받으면 문제가 없다.
  • 개행 문자를 지우고 int 형으로 형변환 하는 방법을 잘 모르겠다.
  • 기존에는 숫자형을 바로 입력 받고 싶을 때는 int(sys.stdin.readline()) 이런 식으로 사용했었고
  • map을 사용한다면 map(int,sys.stdin.readline().split()) 이런 식으로 사용했었다.
  • T = sys.stdin.readline().rstrip() 이렇게 하니까 되는 걸 알 수 있었다.
  • 즉 아래에서, 값을 대입할 때 해주면 안되고, 입력을 받을 때 즉시 위에서 해줘야 되는 것 같다.. 왜 그런지는 잘 모르겠다.
  1. python에는 return 0 이 없고, 강제 종료하려면 sys.exit()를 사용해야 한다.

  2. for문에서 range(10,0)한다고 거꾸로 출력되지 않는다. 왜냐하면 range는 숫자가 증가하는 기본 값이 양수 1이기 때문이다. 숫자를 역순으로 생산하려면 증가 폭을 음수로 지정해야 한다.


참고자료

[파이썬 줄바꿈 없이 출력]http://mwultong.blogspot.com/2007/01/python-print-no-newline-print.html [코드 참조]https://lmcoa15.tistory.com/48

0%