Baekjoon 문제 풀기 (2309번 : 일곱 난쟁이) Python

2309번 : 일곱 난쟁이

1. 문제읽기


조건을 만족하는 조합 구하기.

기분이 너무 좋다.
4번 시도 후에 결국 문제 풀기에 성공했다!!!

문제를 보자마자 itertools 라이브러리를 사용해야겠다고 생각했다.
9개 입력 값 중 7개를 선택하는 것이므로 시간 초과는 없었다.
역시 경우의 수가 작았기 때문에 brute force 알고리즘으로 분류되었다.

2. 제출 코드


itertools를 제대로 써보는 것은 이번이 처음이라서 사용방법을 헤맸다.
아래 코드를 보면 알겠지만 별 괴상한 시도를 다 해본 것을 알 수 있다.

  1. 조합을 뽑는 것은 알겠는데.. 어떻게 쓰는가?
  2. 리스트를 하나씩 어떻게 출력하는가..?

이 두개의 문제점이 코드가 괴상해지는데 큰 도움을 주었다^^
그래도 풀면 장땡!
아래에서 정리해보자.

import sys
import itertools

shortMen = []

for _ in range(9):
    shortMen.append(sys.stdin.readline().rstrip())

shortMen_int = list(map(int, shortMen))
sevenMen = list(itertools.combinations(shortMen_int, 7))
for men in sevenMen:
    if sum(men) == 100:
        for i in sorted(men):
            print(i)

        break

3. 공부할 것


순열, 조합 라이브러리 사용방법

2798번 문제를 풀 때 정리했던 함수이다.
내가 푼 방식이 아니라서 정리만 하고 넘어갔었는데, 이렇게 발목을 잡을 줄이야..

itertools 모듈에는 permutations(순열), combinations(조합) 함수가 각각 존재한다.

  • permutations(iterable, int r) : iterable
    • 순서를 고려하여 나열한 경우의 수 (nPr)
    • (A,B)와 (B,A)가 다른 경우의 수이다.
  • combinations(iterable, int r) : iterable
    • 순서를 고려하지 않은 경우의 수 (nCr)
    • (A,B)와 (B,A)가 같은 경우의 수이다.
    • 카드 뽑기를 생각하면 쉽다.

둘 다 iterable 객체로 반환되기 때문에 아래와 같이 for문을 사용 가능하다.

import itertools

arr = [1, 2, 3, 4, 5, 6, 7, 8]

for i in itertools.combinations(arr, 2):
    print(i)
수정한 코드
import sys
import itertools


shortMen = [int(sys.stdin.readline().rstrip()) for _ in range(9)]
	// append를 안하고 [] 바꿔줬고, int() 형변환을 시켜주었다.  
	// 한줄로 for문을 안만든다면 원래 코드에 형변환을 하는게 최선인듯..?

for men in itertools.combinations(shortMen, 7): 
	// list 쓰고 난리 안쳐도 for문에 바로 사용할  있음
    if sum(men) == 100:
        for i in sorted(men):
            print(i)
        break 

break 같은 경우는 문제 조건에서 가능한 답이 여러개인 경우 하나만 출력하라고 해서 붙여줬는데 혹시나 해서 없애고 채점 돌려보니까 틀린 답으로 나왔다.
신기하다.

그리고 2번 문제였던 리스트를 하나씩 출력하는 방법은 반복문 말고 고민했었는데 대부분 반복문을 사용했다. join 함수로 이용하는 방법도 있다고 하는데 시도해봐야겠다.

+ Unpacking Operator *
원하는 기능을 찾았다!
리스트나 튜플을 언패킹하여 바로 값을 출력할 수 있는 방법이다.
주로 sep과 같이 활용하는 듯 하다.

arr1 = [1, 2, 3]
arr2 = ["Hello", "World"]

print(*arr1)
print(*arr1, sep=', ')
print(*arr1, sep='\n')

print(*arr2)
print(*arr2, sep=', ')
print(*arr2, sep='\n')

댓글남기기