프로그래밍/Algorithm

백준 일곱난쟁이 파이썬

모지사바하 2021. 3. 1. 12:25

www.acmicpc.net/problem/2309

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

A = [int(input()) for _ in range(9)]

over_num = sum(A) - 100
A.sort()
a, b = -1,-1
for i in range(9):
  if a != -1:
    break
  temp1 = A[i]
  for j in range(i+1, 9):
    temp2 = A[j]

    if temp1 + temp2 == over_num:
      a, b = i, j
      break
      
for i in range(len(A)):
  if i != a and i != b:
    print(A[i])

7명의 난쟁이의 키의 합이 100이고 정답을 찾을수 없는 경우는 없다고 문제에서 단정했다.

9명의 난쟁이의 키의 합은 7난쟁의 키의 합보다 무조건 더 크기 때문에 9난쟁이의 키의 합을 구하고 100보다 큰 수만큼을 갖는 2명의 난쟁이를 찾아내서 제외 해주면된다.

 

예를들어, 아홉 난쟁이 키의 합이 140인 경우, 2명의 키의 합이 40인 가짜 난쟁이를 찾아내서 걸러주면된다.

우선 일곱 난쟁이의 키의 합을 정렬하여 출력하라는 조건이 있었으므로 정렬해 준 후,

이 중 for loop 로 모든 경우의 수를 검사하여 9명 중 2명의 키의 합이 넘치는 값인 경우, index 를 저장한 후, loop 를 break 한다.

마지막으로 아홉난쟁이를 순회하며 저장된 인덱스가 아닌 경우 (지정된 인덱스가 가짜 난쟁이 두명이므로) 출력해준다.

 

브루트포스 매우순한맛.