[백준] 2309번 일곱 난쟁이 . python

sun1·2023년 3월 3일
0

im_test

목록 보기
8/22
post-thumbnail

문제

' 2309번 일곱 난쟁이 '
https://www.acmicpc.net/problem/2309

풀이

조건

  • 아홉 명의 난쟁이 중 일곱 난쟁이의 키의 합이 100인 일곱 난쟁이를 찾는다.
  • 아홉 난쟁이의 키는 모두 다르며 주어지는 키는 100을 넘지 않는 자연수이다.
  • 일곱 난쟁이의 키를 오름차순으로 출력한다. 단, 일곱 난쟁이를 찾을 수 없는 경우는 없으며 정답이 여러 가지인 경우에는 아무거나 출력한다.

풀이 순서

  • 아홉난쟁이의 키를 입력값으로 받는다.
  • 아홉난쟁이의 전체키를 구해준 뒤, 100을 빼서 나머지 2명의 키를 구한다.
  • 2명의 난쟁이를 찾은 뒤, 그 난쟁이 들만 리스트에서 지우고 나머지 7명의 난쟁이를 키의 오름차순으로 정렬하여 출력한다.

코드

Python

arr=[]
for i in range(9):
    arr.append(int(input()))
lst=[]
n=sum(arr)-100 # 나머지 2명의 키의 합 
for i in range(len(arr)-1):  # 나머지 2명의 키의 합으로 해당하는 2명의 난쟁이 찾기 (모든 난쟁이는 키가 다 다르므로)
    for j in range(i+1,len(arr)):
        if arr[i] + arr[j] == n:
            lst.append(arr[i])
            lst.append(arr[j])
            break
    if len(lst)==2: #2명을 찾았으면 for문 탈출
        break
l= sorted(list(set(arr) - set(lst))) #2명을 제외한 나머지 난쟁이들만 리스트에 남기고 오름차순으로 정렬 -> 이방법 말고 arr에서 해당 값들 remove로 지워내도 된다.
for i in range(len(l)):
    print(l[i])

다른 방법 1

# 두 난쟁이를 제거하는 방식
def solve():
    for i in range(9):
        for j in range(i + 1, 9):
            if 100 == sum(lst) - (lst[i] + lst[j]):
                lst.pop(j)  # 맨 뒤에꺼부터 제거하기
                lst.pop(i)
                return lst
                # lst.remove(lst[i]) #다른방법
                # lst.remove(lst[j])


lst = []
for _ in range(9):  # 난쟁이 키 입력 받음
    lst.append(int(input()))
lst.sort()  # 오름차순 정렬
result = solve()
for a in result:
    print(a)

다른 방법 2 (비추천)

# 7명의 합이 100인 난쟁이들 찾기
lst = []
for _ in range(9):  # 난쟁이 키 입력 받음
    lst.append(int(input()))
lst.sort()  # 오름차순 정렬

for a in range(9):
    for b in range(a + 1, 9):
        for c in range(b + 1, 9):
            for d in range(c + 1, 9):
                for e in range(d + 1, 9):
                    for f in range(e + 1, 9):
                        for g in range(f + 1, 9):
                            # 7명의 키의합이 100인 난쟁이 찾기
                            if 100 == lst[a] + lst[b] + lst[c] + lst[d] + lst[e] + lst[f] + lst[g]:
                                print(lst[a])
                                print(lst[b])
                                print(lst[c])
                                print(lst[d])
                                print(lst[e])
                                print(lst[f])
                                print(lst[g])
                                exit()  # 테스트 케이스가 한개 뿐이라서

0개의 댓글