본문 바로가기
Algorithm/DFS&BFS&백트래킹&재귀

[백준] 수열 - 재귀함수 구현 정리 (1)

by HANNI하니 2023. 10. 30.

사용 언어 - Python3

문제 -  15649, 15650, 15651, 15652번

  • 백준 백트래킹 세트로 공부하기
  • 15649,15650,15651,15652번
  • 15649번 중복X 수열
  • 15650번 중복X 시작포인트 지정 수열
  • 15651번 중복O 수열
  • 15652번 중복O 시작포인트 지정 수열

 

  • 15649번 [1 2] [1 3] [1 4] [2 1] [2 3] [2 4] [3 1] [3 2] [3 4] [4 1] [4 2] [4 3]
  • 15650번 [1 2] [1 3] [1 4] [2 3] [2 4] [3 4]
  • 15651번 [1 1] [1 2] [1 3] [1 4] [2 1] [2 2] [2 3] [2 4] [3 1] [3 2] [3 3] [3 4] [4 1] [4 2] [4 3] [4 4]
  • 16652번 [1 1] [1 2] [1 3] [1 4] [2 2] [2 3] [2 4] [3 3] [3 4] [4 4]
 

15649번: N과 M (1)

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

www.acmicpc.net

 

 

정답

인프런 코테 강의  '2주만에 통과하는 알고리즘 코딩테스트(2023년)' 복습

재귀함수로 풀어보기

 

1. 15649번 (중복X 수열)

[1 2] [1 3] [1 4] [2 1] [2 3] [2 4] [3 1] [3 2] [3 4] [4 1] [4 2] [4 3]

arr 리스트에 방문하지 않은 i를 추가해준다.

def recur(number):
    if len(arr) == m:
        print(*arr)
        return
        
    for i in range(1,n+1):
        if visited[i]:
            continue
        visited[i] = 1
        arr.append(i)
        recur(number+1)
        arr.pop()
        visited[i] = 0

arr = []
n, m = map(int,input().split())
visited = [0 for _ in range(n+1)]
recur(1)

 

2. 15650번 (중복X  시작포인트 지정 수열)

[1 2] [1 3] [1 4] [2 3] [2 4] [3 4]

arr 리스트에 있지 않은 i를 추가해준다.

for문의 시작 위치 = number ( number보다 큰 숫자부터 들어갈 수 있다 )

def recur(number):
    if len(arr) == m:
        print(*arr)
        return
        
    for i in range(number,n+1):
        if i not in arr:
            arr.append(i)
            recur(i+1)
            arr.pop()

arr = []
n, m = map(int,input().split())
recur(1)

 

3. 15651번 (중복O 수열)

[1 1] [1 2] [1 3] [1 4] [2 1] [2 2] [2 3] [2 4] [3 1] [3 2] [3 3] [3 4] [4 1] [4 2] [4 3] [4 4]

def recur():
    if len(arr) == m:
        print(*arr)
        return
    
    for i in range(1,n+1):
        arr.append(i) 
        recur()
        arr.pop()

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

 

 

4. 15652번 (중복O 시작포인트 지정 수열)

[1 1] [1 2] [1 3] [1 4] [2 2] [2 3] [2 4] [3 3] [3 4] [4 4]

def recur(number):
    if len(arr) == m:
        print(*arr)
        return
    for number in range(number,n+1):
        arr.append(number)
        recur(number)
        arr.pop()

n ,m = map(int,input().split())
arr = []
recur(1)
 

 

댓글