본문 바로가기

python/백준_프로그래머스

[백준 2039번] 일곱 난쟁이 python과 combinations

728x90

https://www.acmicpc.net/problem/2309

 

2309번: 일곱 난쟁이

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

www.acmicpc.net

 

<조건>

 

<풀이>

#입력
tall_list= [int(input()) for i in range(9)]
tall_sum=0      #일곱 난쟁이의 키 합
for t in tall_list:
  tall_sum+=t
tall_sum-=100
sum=0
flag=True; i=0

#연산
while(flag and i<9):
  for j in tall_list:
    if i!=tall_list.index(j):
      sum=tall_list[i]+j
      if sum==tall_sum:
        del tall_list[i]    #인덱스 번호로 지우기
        tall_list.remove(j) #값으로 지우기, 원소 하나가 사라져서 인덱스 번호가 달라지므로
        flag=False
        break
  i+=1

#출력
tall_list.sort()
for i in tall_list:
  print(i)

 


 

사실 한 번에 풀었는데 출력을 잘못해서 틀린 케이스. 바보 멍충이

 

 알고리즘은 간단하다. 전체 합에서 - 100 = 남는 값의 합을 가진 난쟁이 두명을 제외하면 된다. 

 


 

<코드 갱신 및 combinations>

from itertools import combinations
#입력
tall_list= [int(input()) for _ in range(9)]

#연산 및 출력
for i in combinations(tall_list, 7):
  if sum(i)==100:
    for j in sorted(i):
      print(j)
    break

 

 다른 사람들의 풀이를 보니 전체적으로 combinations(조합)라는 함수를 많이 사용한 것 같다. 

 

https://docs.python.org/ko/3/library/itertools.html

 

itertools — 효율적인 루핑을 위한 이터레이터를 만드는 함수 — Python 3.10.2 문서

 

docs.python.org

 

 모듈은 itertools이다. 

 

 실험을 해보니 for문을 쓰지 않고 combinations를 사용하면 값은 나오지 않는다. 이때는 list() 함수를 써주면 모든 조합이 리스트 안에 튜플 형태로 나온다.  

 

for문에 쓸 때는 어차피 인자 값으로 하나하나 들어가서 출력물은 똑같은 것 같다. 

 

 다만, list를 활용하는게 좀 더 빠른 코딩이 되는 것 같다.. 

for i in list(combinations(tall_list, 7)):  #68초
for i in combinations(tall_list, 7):        #72초

 

 


 

이번에 백준에 랭킹이 있다는 것과 백준 내에서 풀이를 볼 수 있다는 걸 알게 되었다.

 

  • 랭킹

 나의 랭킹은 현기준 브론즈 4. 총 15문제를 풀었다. 보는 방법은 타 사이트에서 찾아보길 바란다.

  • 백준 내 풀이

 이건 일단 문제의 정답을 맞혀야 풀 수 있다. 풀고나서 보니까 무슨 두줄 만에 푸는 정답들이 있다. 모듈 선언 하나. 코드 하나. 저런 사람들이 카카오를 가는 걸까...?