1. 일곱 난쟁이 2309
- 일곱 난쟁이의 키의 합은 100이었다.
- 9명의 키가 주어지고, 이 중 키의 합이 100이 되는 7명을 출력
- 정답이 여러가지인 경우에는 아무거나 출력
학생 수가 9명일 때, 주번 7명을 뽑는 경우의 수와 동일 -> 조합. 9C2(36)와 동일하다. 수가 9명으로 고정되어 있기 때문에 일일히 값을 다 계산해보는 것도 방법이 될 수 있다. 많아봤자. 36가지 방법 뿐이기 때문이다. 9 가지 중 두 개를 빼는 방법과 동일하기에, for문을 두번 돌면서 i와 j가 같지 않으면서, 두개를 선택해보자.
import sys
arr = []
for _ in range(9):
arr.append(int(input()))
arr.sort()
for i in range(9):
for j in range(9):
if i != j:
a, b = arr[i], arr[j]
arr.remove(a)
arr.remove(b)
if sum(arr) == 100:
for i in arr:
print(i)
sys.exit(0)
else:
arr.append(a)
arr.append(b)
arr.sort()
배운 것
- list slice로 원소를 빼서 제거해주자니 i와 j의 대소에 따라 슬라이스를 다르게 해줘야 해서 귀찮았고
- 그렇다고 인덱스로 지워주자니 값을 지워주면서 인덱스가 변하니 계산이 어려웠다.
- 그래서 remove를 통해 지우고 sort()를 두번 사용해서 순서를 맞춰줬다.
- 그런데 생각해보니 합만 100인지를 판단하면 되었기에, 자연수를 빼는 방향으로 결정했다.
-
그러면 sort()를 한번만 사용해도 된다.
- sys.exit()에서 인자값을 1로 주니 런타임 에러가 발생했다.
- 인자값이 0으로 주면, 프로그램 내부에서 정상적인 종료.
- 인자값을 1로 주면, 비정상적인 종료 처리
import sys
arr = []
for _ in range(9):
arr.append(int(input()))
for i in range(9):
for j in range(9):
if i != j:
a, b = arr[i], arr[j]
if sum(arr)-(a+b) == 100:
arr.remove(a)
arr.remove(b)
arr.sort()
for i in arr:
print(i)
sys.exit(0)
참고자료