백준 10610
양수 N을 입력 받아 30의 배수가 되는 가장 큰 수 만들기
아이디어
- 수를 입력 받아서 각 수를 리스트에 쪼개서 저장.
- 그 수를 정렬.
- 수를 조합하여 30으로 나누어떨어지는 수 찾고
- 가장 먼저나온 수 출력
- 0으로 시작하는 경우 예외처리해주기
=> 이렇게 되면 for문을 N번 돌아야 한다, 각각에 맞게 예외처리 해줘서 하는 건 올바른 답이 아닐 듯. -> 어떤 좋은 idea가 있는지 찾아보자.
30이란 값은 2가지 특징을 가지고 있다.
- 30의 배수가 되려면 마지막 숫자는 무조건 0이 나와야 한다
- 마지막 숫자를 제외한 나머지 숫자의 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))
알게된 사실
-
숫자의 각 자리수를 한 자리씩 나눠처 처리하여야 한다면, 숫자로 받지말고 문자로 입력값을 받아버리면 편하다
-
파이썬 줄바꿈 없이 출력 :
sys.stdout.write()
-
isdigit() 함수 -> 문자열인지 체크
-
rstrip(“\n”)를 쓰면 개행문자 제거 가능하다.
-
여전히 이건 잘 모르겠다. sys.stdin.readline()으로 문자열을 읽으면 개행문자가 들어간다. 이 때, int() 형변환을 해주면, 개행문자까지 형변환이 되서 오류가 난다. rstrip() 같은 걸로 제거해도 ‘‘가 남아있다는 오류가 출력된다.
- input()으로 값을 입력 받으면 문제가 없다.
- 개행 문자를 지우고 int 형으로 형변환 하는 방법을 잘 모르겠다.
- 기존에는 숫자형을 바로 입력 받고 싶을 때는
int(sys.stdin.readline())
이런 식으로 사용했었고 - map을 사용한다면
map(int,sys.stdin.readline().split())
이런 식으로 사용했었다. T = sys.stdin.readline().rstrip()
이렇게 하니까 되는 걸 알 수 있었다.- 즉 아래에서, 값을 대입할 때 해주면 안되고, 입력을 받을 때 즉시 위에서 해줘야 되는 것 같다.. 왜 그런지는 잘 모르겠다.
-
python에는 return 0 이 없고, 강제 종료하려면 sys.exit()를 사용해야 한다.
-
for문에서 range(10,0)한다고 거꾸로 출력되지 않는다. 왜냐하면 range는 숫자가 증가하는 기본 값이 양수 1이기 때문이다. 숫자를 역순으로 생산하려면 증가 폭을 음수로 지정해야 한다.
참고자료
[파이썬 줄바꿈 없이 출력]http://mwultong.blogspot.com/2007/01/python-print-no-newline-print.html [코드 참조]https://lmcoa15.tistory.com/48