- [백준] 9440번 숫자 더하기 파이썬 풀이2022년 11월 26일
- Cat_Code
- 작성자
- 2022.11.26.오후06:05
[문제]
9440번: 숫자 더하기
강민이가 초등학교 3학년일 때, 담임선생님이 이런 문제를 냈었다. 숫자 1, 2, 7, 8, 9 를 사용해서 만든 두 숫자를 더했을 때, 나올 수 있는 가장 작은 수는 무엇일까요? 강민이는 이 문제의 답이 2
www.acmicpc.net
[코드]
import sys input = sys.stdin.readline while True: num = list(map(int, input().split())) if num[0] == 0: break n = num[0] number = sorted(num[1:]) num1, num2 = str(), str() for i in range(n): if number[i] != 0: num1, num2 = str(number[i]), str(number[i+1]) number.pop(i) number.pop(i) break for i in range(0, len(number), 2 ): num1 += str(number[i]) if i < len(number) - 1: num2 += str(number[i+1]) print(int(num1) + int(num2))
[해설]
'그리디'문제이다
지금 당장 최적의 선택을 선택해서 문제를 해결 하는 전형적인 문제이다
이 문제의 핵심은 아래와 같다
주어진 수를 활용해서 두개의 수를 구성하고 이 두개의 수가 최소값이 되게 만들어야한다
즉, 주어진 수를 활용한 두수의 합이 최솟값이 되는 수를 찾는 것이 이 문제의 핵심이다
우선 문제에서 요구하는것이 0을 입력했을 때 프로그램이 종료되는 것이기 때문에 while 문을 활용한다
그리고 input값으로 num이라는 변수를 이용해 활용할 수를 받는다
여기서 만약 num의 첫번째 수가 0이라면 프로그램을 종료하게 한다
import sys input = sys.stdin.readline while True: num = list(map(int, input().split())) if num[0] == 0: break
그리고 0이 아니라면 전체 수의 크기를 n으로 받고
num의 첫번째 값을 제외한 나머지를 number라는 리스트로 다시 인덱싱 한다 (처음 받는 리스트의 첫번째는 사용할 수의 크기이기 때문이다)
이제 우리는 이 number이라는 리스트를 활용해서 수를 구성할 것이다
우선 핵심은 숫자 0이 우리가 만들 두수의 맨앞으로 갈 수 없다는 것이다
따라서 우리는 초기 숫자, 쉽게 말해서 만들 수 의 맨앞자리를 0을 제외하고 선택해 주어야한다
n = num[0] number = sorted(num[1:]) num1, num2 = str(), str()
우서 number는 무작위 순서이므로 정렬을 해준다
그리고 우리가 만들 두 수를 num1, num2로 지정하고 형은 str()으로 지정한다 [int로 하게되면 그냥 수를 더해버려 자릿수를 지정할 수 없다]
for i in range(n): if number[i] != 0: num1, num2 = str(number[i]), str(number[i+1]) number.pop(i) number.pop(i) break
첫번째 for문은 초기 수를 지정하는 for문이다. 즉, 정렬된 number 리스트의 0이 아닌 가장 작은 수를 num1의 가장 앞자리로 지정하고 그 다음수를 num2의 가장 앞자리로 지정한다 그리고 number에서 이 수들을 제거하고 for문을 종료한다
이제 남은 수들을 num1과 num2에 순서대로 넣어주면 된다
ex) 1 2 7 8 9 경우 앞에 1,2는 앞의 for문으로 num1 = '1', num2= '2'에 추가되었고 number에서 사라져 현재 number = [7, 8, 9]이다 .
for i in range(0, len(number), 2 ): num1 += str(number[i]) if i < len(number) - 1: num2 += str(number[i+1])
이제 두번째 for 문을 활용해서 숫자를 추가한다
0부터 number의 len 까지 2개씩 커지는i의 for 문을 구성해서 num1에 추가한다
그리고 i가 len(number)-1 보다 작을 때 num2에는 i+1의 수를 추가해준다 만약 i == len(number)-1 된다면 마지막 숫자에 도착한 것이기 때문에 num2에 숫자를 추가해줄 필요가 없다.
이제 str 형으로 저장된 num1과 num2를 형변환 하여 더해준 값을 출력하기만 하면 문제해결!!
print(int(num1) + int(num2))
문제 핵심요약
- 그리디문제 해결방법
- 작은수에서 - 큰수로 추가해주는 흐름 생각하기
- 가장 작은 수가 0일때 해결방법 생각하기
'[연습의 흔적들] > 백준⚾' 카테고리의 다른 글
[백준] 12018번 Yonsei TOTO 파이썬 풀이 (0) 2022.11.28 [백준] 13471번 카드 문자열 파이썬 풀이 (0) 2022.11.27 [백준] 1213번 팰린드롬 만들기 파이썬 풀이 (0) 2022.11.25 [백준] 11724번 연결 요소의 개수 파이썬(Python) 풀이 (0) 2022.10.31 [백준] 1012번 유기농 배추 파이썬(Python) 풀이 (0) 2022.10.26 다음글이전글이전 글이 없습니다.댓글