본문 바로가기

스터디 1일 1커밋

240213 [BOJ/백준] 15649. N과 M(1)

 

15649번: N과 M (1) (acmicpc.net)

 

15649번: N과 M (1)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net


풀던 코드 - 답을 찾지 못함

 
def nm(a, b):
    empty_list = []
    for i in range(1, a+1):
        empty_list.append(i)
        for j in range(1, len(empty_list)+1):
            while j <= b:
                empty_list[i].append(j)
                j += 1
    return empty_list

N, M = map(int, input().split())
print(nm(N, M))

 

빈 리스트를 만들어 i를 범위에 맞게 설정하고 i와 그 뒤에 M과 주어진 데이터들을 이용해 데이터를 추가하는 방식으로 조합을 짜보려고 했는데 방향이 아예 달랐던 것 같다. 


찾아본 코드

def nnm():
    if len(lst) == M:
        print(' '.join(map(str, lst)))
        return

    for n in range(1, N+1):
        if n not in lst:
            lst.append(n)
            nnm()
            lst.pop()

N, M = map(int, input().split())
lst = []

nnm()

 

결과


백트래킹과 재귀함수를 같이 쓰는 코드... 배웠는데 백트래킹은 진짜 잘 못쓸거같다. if n not in lst부분이 백트래킹일까....?

재귀함수는 엄청 많이 들어봐서 이제 아는 줄 알았는데 아직도 확실히 아는건 아닌 것 같다. 파이참으로 디버깅하는건 어려워서 파이썬튜터에 돌렸더니 90퍼센트는 이해한 것 같다! 진짜 몇번만 더하면 재귀함수 정복할 수 있을듯!ㅋㅋㅋㅋㅋㅋㅋ