728x90
문제 (링크)
https://www.acmicpc.net/problem/2798
나의 풀이
from itertools import combinations
n, m = map(int, input().split())
items = list(map(int, input().split()))
comb = list(combinations(items, 3)) # combinations를 이용해 나열 가능한 조합 만들기
sum_value = []
for i in range(len(comb)):
if sum(comb[i]) <= m: # 합한 값이 m보다 작아야하므로, 작을 때만 sum_value에 담아준다
sum_value.append(sum(comb[i]))
sum_value.sort() # 오름차순으로 정렬해준 후 맨 뒷 값을 출력
print(sum_value[-1])
생각해내는 데는 큰 무리가 없는 문제였다. 하지만 combinations와 permutations 중 순서를 상관하지 않는 조합을 만드는게 뭐였는지 기억나질 않아 둘 다 해본 다음에야 깨달았다. 이번 기회에 정리하는 게 좋겠다.
permutations VS combinations
기본적으로, 두 함수 모두 파이썬 내장함수가 아니므로 itertools에서 임포트 해와야한다.
from itertools import permutations, combinations
collections 아니고 itertools이다 기억하자..
permutations는 '순열' 이라는 뜻으로, 이름에도 나와있듯 여러 값들 중 몇 가지를 뽑아 나열하는 경우의 수를 구해준다.
즉, (1, 2, 3, 4, 5) 에서 2개를 뽑아 나열할 때, (1, 2) 와 (2, 1)을 다르게 취급한다.
블랙잭 문제를 풀 때는 세 값을 뽑아 합한 값을 기준으로 답을 구하기 때문에 순열 방식은 맞지 않는다.
반면에 combinations는 '조합' 이라는 뜻으로, 진짜 말 그대로 순서 상관 없이 조합하는 경우의 수를 구해준다.
(1, 2)를 뽑나 (2, 1)을 뽑나 같은 것으로 처리해준다는 말이다.
그냥 단어 뜻을 기억하면 헷갈릴게 없는데 영어교육과로서 부끄러운 모습이다.
from itertools import combinations, permutations
items = [1, 2, 3, 4, 5, 6]
permutations(items, 3) # items에서 3개를 순열로 뽑는 방식
combinations(items, 3) # items에서 3개를 조합으로 뽑는 방식
중요한 것은, 단지 permutations(items, 3), combinations(itmes, 3) 을 출력하면
이런 식으로 객체 형태로 출력이 된다.
값을 확인하고 싶다면 해당 객체를 리스트화 시켜주면 되고, 각 묶음은 튜플 형태로 묶여 나온다.
from itertools import combinations, permutations
items = [1, 2, 3, 4, 5, 6]
print("permutations 사용")
print(list(permutations(items, 3)))
print("")
print("combinations 사용")
print(list(combinations(items, 3)))
'알고리즘 > 문제풀이' 카테고리의 다른 글
[백준] 2178번 미로탐색 - 파이썬(Python) (0) | 2021.01.19 |
---|---|
[백준] 1260번 DFS와 BFS - 파이썬(Python) (0) | 2021.01.18 |
[백준] 10773번 제로 - 파이썬(Python) (0) | 2021.01.18 |
[백준] 11399번 ATM - 파이썬(Python) (0) | 2021.01.14 |
[백준] 14916번 거스름돈 - 파이썬(Python) (0) | 2021.01.14 |