땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • E
  • D
  • 이것이 리눅스다 with Rocky Linux9
  • I
  • ㅗ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

백준 15649,15650 N과 M(Backtracking)
Algorithm/Algorithm Problem

백준 15649,15650 N과 M(Backtracking)

2021. 11. 21. 18:20

https://www.acmicpc.net/problem/15649

 

15649번: N과 M (1)

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

www.acmicpc.net

https://www.acmicpc.net/problem/15650

 

15650번: N과 M (2)

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

www.acmicpc.net

def DFS():
    if len(s) == M:
        print(*s)
        return

    for i in range(1, N + 1):
        if i in s: #가지치기
            continue

        s.append(i)
        DFS()  # 함수 다시 호출
        s.pop()  # 원상복귀

N, M = map(int, input().split())
s = []  # 출력 수열 넣을 stack
DFS()
def DFS(j):
    if len(s) == M:
        print(*s)
        return

    for i in range(j, N + 1):
        if i in s: #가지치기
            continue

        s.append(i)
        DFS(i+1)  # 함수 다시 호출
        s.pop()  # 원상복귀

N, M = map(int, input().split())
s = []  # 출력 수열 넣을 stack
DFS(1)

 

백트래킹은 재귀, 스택을 써서 길을 가다가 이 길이 아닌 것 같으면 왔던 길로 되돌아가 다른 경로로 진행하는 기법으로

즉, 코딩에서는 반복문의 횟수까지 줄일 수 있으므로 효율적이다.

 

문제를 보면 딱봐도 순열(Permutation) 문제라서 

from itertools import permutations

를 써도 되지만 백트래킹 문제이기 때문에 다른 방식으로 접근해보자.

https://www.youtube.com/watch?v=Enz2csssTCs&t=1s 

이 강의를 보고 도움이 많이 되었다.

순서쌍을 이룬다는건 트리에 방문 하는지 안하는지를 판단하면 된다.

재귀함수를 이용해서 풀었으며 

i가 1,2,3동안 각각의 1,2,3이 순서대로 있기 때문에 재귀함수 형태로 코딩을 하였고

부모노드와 자식노드가 동일시 되는 경우를 피하기 위해(가지치기)

if i in s: #가지치기
	continue

 

백준 15650

15650은 오름차순이란 룰이 추가되었다.

부모노드보다 커야되는 경우가 발생해야하니까 재귀함수에 들어갈때 부모노드보다 +1 높게 자식노드를 반복하였다.

for i in range(j, N + 1):
  if i in s: #가지치기
  	continue

  s.append(i)
  DFS(i+1)  # 함수 다시 호출
  s.pop()  # 원상복귀

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 1991 트리 순회  (0) 2022.02.17
Python Asterisk(*) 사용 용도  (0) 2022.01.03
백준 1931 회의실 배정  (0) 2021.11.16
백준 6064 카잉 달력  (0) 2021.11.04
백준 17427 약수의 합2  (0) 2021.11.02
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 1991 트리 순회
    • Python Asterisk(*) 사용 용도
    • 백준 1931 회의실 배정
    • 백준 6064 카잉 달력
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바