BOJ(일곱난쟁이) 2309

  1. 일곱 난쟁이

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)

참고자료

코드플러스 [순열과조합]https://mathbang.net/551 sys.exit()사용법

0%