Baekjoon/백트래킹

[백준] 15652 N과 M (4) (실버3) / 백트래킹

hellosonic 2023. 4. 13. 13:24

문제요약

나의 코드 및 설명 

  • ans에 수열을 직접 집어넣고 출력한다.
  • for문을 돌릴 때 ans의 마지막에 저장된 수(바로 이전 함수에서 저장된 수)보다 i가 작을 경우엔 넘어가고, 그렇지 않을 경우엔 비내림차순에 해당되므로 i를 추가하고 다음 함수를 호출한다.
def dfs(index):
    if index == m:
        print(" ".join(map(str, ans)))
        return
    for i in range(1, n+1):
        if len(ans) != 0:
            if ans[-1] > i:
                continue
        ans.append(i)
        dfs(index+1)
        ans.pop()

n, m = map(int, input().split())
ans = []

dfs(0)

다른 코드 및 설명

  • 함수의 두 번째 변수로 temp(수열의 시작값)을 주었다.
  • 함수를 호출할 때 변수로 수열의 시작값을 줌으로써 for문을 돌릴 때, 자연히 현재의 수보다 같거나 큰 수를 다음 함수의 변수로 준다.
def dfs(index, temp):
    if index == m:
        print(" ".join(map(str, ans)))
        return
    for i in range(temp, n+1):
        ans.append(i)
        dfs(index+1, i)
        ans.pop()

n, m = map(int, input().split())
ans = []

dfs(0,1)

피드백

이전 문제에서 조금 숙달된 것처럼 보였는데, 아직도 흐름을 몰라서 갈팡질팡이다.. ㅠ 여러 문제를 풀어보다보면 조금 나아질 것을 기대하며 ... 다음 문제도 화이팅!