본문 바로가기
Algorithm/구현

[Python3] 백준 2309번 일곱 난쟁이

by HANNI하니 2022. 1. 2.

try 5 times / 난이도 : ★(난이도는 제가 느끼는 매우 주관적인 난이도입니다.)

문제 확인

 

2309번: 일곱 난쟁이

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

www.acmicpc.net

코드 깃허브 확인

 

GitHub - yyeongeun/codingtest: 코딩테스트 공부

코딩테스트 공부. Contribute to yyeongeun/codingtest development by creating an account on GitHub.

github.com

정답 해설

9명중에 두 명(one,two)를 빼서 100이 된다면 그 원소들을 리스트에서 빼준다.

그 후, 일곱 난쟁이의 키를 오름차순으로 출력한다.

one이 1인 경우, two는 1을 제외한 2부터 for문으로 반복되어야 하기 때문에 범위는 range(i+1,9)와 같다.

import sys

heights = []
for i in range(9):
    heights.append(int(sys.stdin.readline())) # 한줄에 여러 입력 값 

total = sum(heights)
one = 0
two = 0

for i in range(9):
    for j in range(i+1, 9):
        if total - (heights[i] + heights[j]) == 100:
            one, two = heights[i], heights[j]
            break

heights.remove(one)
heights.remove(two)
heights.sort() # 오름차순 정렬

# 출력
for i in heights:
    print(i)

 

공부한 내용

1.  sys.stdin.readline()

sys 라이브러리를 불러와주었다.

아홉 난쟁이의 키를 아홉 개의 줄에 걸쳐 입력값을 받는 문제이다.

여러줄을 입력 받아야할 때는 input()으로 입력 받는다면 시간초과가 발생할 수 있다. 그런 경우, sys.stdin.readline()을 사용한다.

sys.stdin.readline()은 한 줄 단위로 입력 받으므로 for문을 9번 반복했음을 확인할 수 있다.

# 방법1
heights = []
for i in range(9):
    heights.append(int(sys.stdin.readline())) # 한줄에 여러 입력 값 

# 방법2
data = lambda: sys.stdin.readline().rstrip() # 오른쪽 공백 삭제
heights = [int(data()) for _ in range(9)]
## 함수를 딱 한 줄로 만들게 해주는 lambda
## lambda 매개변수 : 표현식

# 방법3
heights = [int(input()) for i in range(9)]
  • 방법1 : 빈 리스트에 sys.stdin.readline()으로 생긴 입력값을 int변환하여 append
  • 방법2 : sys.stidin.readline.rstrip() + int + for문
  • 방법3 : input() + int + for문

결과는 모두 동일! heights list 형태!

 

 

2. 다른 풀이 이해하기

1. 가짜 난쟁이의 인덱스를 직접 지정하여 삭제하기

bool 타입의 변수 finish를 만든다. 

가짜 난쟁이 두명을 찾으면 변수 finish 변수를 False에서 True로 지정하여 for문을 탈출하도록 한다. 

 

새로운 리스트 save를 만들어 가짜 난쟁이들의 인덱스를 따로 저장해준다.

save[0]에는 i의 값이, save[1]에는 j의 값이 저장되어 있다. save[0]을 삭제하면 원소 한 개가 없어지기 때문에 정확한 가짜 난쟁이의 인덱스를 찾기 위해서는 save[1]에서 1을 빼줘야한다.

finish = False
for i in range(8):
    for j in range(i + 1, 9):
        if (heights[i] + heightts[j] == sum - 100):
            save = [i, j]
            finish = True
            break
 
    if (finish):
        break
        1

del heights[save[0]]
del heights[save[1] - 1]
 

[백준 문제집][Python 배우기 (101~150)][2309] 일곱 난쟁이

이 글에서 살펴볼 문제는 백준 2309번입니다. 주소는 아래와 같습니다. https://www.acmicpc.net/problem/2309 2309번: 일곱 난쟁이 아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지

feca.tistory.com

 

2. itertools의 combinations 사용하기

from itertools import combinations

heights = [int(input()) for _ in range(9)]
occation = list(combination(hieights,7)) #9개중에 7개만 선택하는 조합 저장하기

for i in occation:
	if sum(i) is 100:a
    	answer = list(i) # 합이 100이면, list로 저장하기
    	break

answer.sort()
for i in answer:
	print(i)

 

 


레퍼런스

  • sys.stdin.readline() 설명
 

[Python 문법] 파이썬 입력 받기(sys.stdin.readline)

파이썬으로 코딩 테스트를 준비한다면, 반드시 알아야 할 입력방식인 sys.stdin.readline()에 대한 정리 입니다.

velog.io

  • itertools 설명
 

[python] itertools를 이용해 순열과 조합 구하기

itertools를 이용해 순열과 조합 구하기

itholic.github.io

댓글