• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

8. 순열구하기 (DFS) 질문입니다.

23.01.04 19:54 작성 조회수 291

0

def DFS(L):
  global cnt
  # 종료 => 즉 출력
  if L == m:
    # res에 m개를 뽑은 수를 저장했으므로 출력한다.
    for j in range(m):
      print(res[j], end=' ')
    cnt += 1
    print()
  else:
    # 가지 뻗기
    for i in range(1, n + 1):
      if ch[i] == 0:
        ch[i] = 1
        res[L] = i
        DFS(L + 1)
        ch[i] = 0


if __name__ == "__main__":
  n, m = map(int, input().split())
  # 순열이기때문에 겹치지않게 하기 위해 0과 1로 구분.
  ch = [0] * (n + 1)
  res = [0] * m
  cnt = 0
  DFS(0)
  print(cnt)

궁금한 점이 있어 질문드립니다. 교수님이 짜주신 코드를 보면 for j in range(L)이라고 나와있습니다. 저는 처음에 m번을 뽑아야해서 인덱스가 m개만 필요하므로 저는 m번만큼 반복문이 돌아 출력할 수 있도록 코드를 짰는데 L이 아닌 m으로 짜도 코드가 정상 작동했습니다. 이렇게 짜도 혹시 괜찮은게 맞는지 여부가 궁금합니다.

또한 cnt+=1 을 for j문 안에 넣었을 경우에 12가 출력되었습니다. 왜그런지 알꺼같으나 1 2 1 3 2 1 2 3 3 1 3 2 이거를 모두 한개씩 for문 돌면서 받아들여 12라고 출력되는거 같기는한데 이게 맞는건가요?

그리고 마지막으로 print()의 위치가 교수님의 코드에는 print() 다음 cnt+= 1 이렇게 되있는데 저는 순서를 cnt+=1 print()이렇게 했는데 답에는 문제가 없었습니다. 혹시 순서를 변경해도 코드 실행 속도에 영향을 미치지 않는지 여부가 궁금합니다.

항상 좋은강의 감사합니다.

답변 1

답변을 작성해보세요.

0

안녕하세요^^

  1. if L ==m: 일때 출력하므로 L값과 m값은 같은 값이라 아무거나 해도 됩니다.

  2. 네. 생각한게 맞습니다.

  3. cnt += 1과 print() 순서는 아무렇게 해도 상관없습니다.