CodingTest/Baekjun Online Judge
[ BOJ / 파이썬 ] 15657 N과M(8)
EEOOOO
2022. 8. 29. 22:42
| 제출 1 |
# 중복조합 메서드 사용
import sys
input = sys.stdin.readline
from itertools import combinations_with_replacement
N, M = map(int, input().split())
nums = sorted(list(map(int, input().split())))
for item in combinations_with_replacement(nums, M):
print(*item)

: 중복을 허용해서 ( 본인 포함 ) 순서를 고려해서 뽑는 경우의 수 : 중복조합 메서드 사용한 풀이
| 제출 2 |
: 백트래킹 구현 실패 .. 🤕
# 백트래킹
import sys
input = sys.stdin.readline
from itertools import combinations_with_replacement
N, M = map(int, input().split())
nums = sorted(list(map(int, input().split())))
keep = []
def recur(x):
if x == M:
print(*keep)
return
for i in range(N):
if len(keep) == 0:
keep.append(nums[i])
recur(x+1)
keep.pop()
recur(0)
이거 같은데 답이 안 나오는 것... 왜냐하면, 초기에 keep이 0일 때 한 번 들어간 이후로는 작동을 못 하니까.
스타트 이후의 다른 옵션을 같이 줘야하는것이었다. 생각해봐도 뭘로 기준 잡을 지 모르겠어서 결국 서치해서 찾아봤는데,
import sys
input = sys.stdin.readline
from itertools import combinations_with_replacement
N, M = map(int, input().split())
nums = sorted(list(map(int, input().split())))
keep = []
def recur(x):
if x == M:
print(*keep)
return
for i in range(N):
if len(keep) == 0 or keep[-1] <= nums[i]: # ✅ 여기에서 or로 추가옵션을 준다.
keep.append(nums[i])
recur(x+1)
keep.pop()
recur(0)
: 항상 keep안에 들어갈 수 있는 수는 keep 내부 값 기준으로 찾으면 되는 것이었다!!
: 어차피 sorting해놓은 상태니까 작은 값 먼저 들어가서 마지막 keep값이랑 새로 들어갈 값을 비교해서 조건에 맞을 때 넣으면 된다.

은근 머리 싸매고 고민해서 정답 처리 받아서 눈물 난다.. 흐.. 거의 비슷한 문제에서 약간씩만 틀어도 꽤 헷갈려진다 😓