본문 바로가기
TIL - 프로그래밍/Python 알고리즘

[백준] 15649. N과 M (1) ~ (4) - Python

by chaemj97 2022. 6. 18.
728x90

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

 

15649번: N과 M (1)

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

www.acmicpc.net


  • 생각
    • 재귀로 달성하면 return
  • 코드
from sys import stdin

N, M = map(int, stdin.readline().split())

# 수열, 수열에 들어간 요소 표시
def check(arr,visited):
    # 수열의 길이가 M인가?
    if len(arr) == M:
        print(*arr)
        return

    for i in range(1,N+1):
        # 수열에 없다면
        if visited[i] == 0:
            # 수열에 넣기
            visited[i] = 1
            check(arr+[i],visited)
            # 초기화
            visited[i] = 0

check([],[0]*(N+1))

 


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

 

15650번: N과 M (2)

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

www.acmicpc.net


  • 코드
from sys import stdin

# 1부터 N까지 자연수 중 중복 없이 M개 오름차순으로 고르기
N,M = map(int,stdin.readline().split())

# 직전에 들어간 수+1, 수열, 수열에 들어간 요소 표시
def check(idx,arr,visited):
    # 수열의 길이가 M인가?
    if len(arr) == M:
        print(*arr)
        return

    # 직전에 넣은 값보다 큰 값만 수열에 들어갈 수 있음
    for i in range(idx,N+1):
        # 수열에 없다면
        if visited[i] == 0:
            # 수열에 넣기
            visited[i] = 1
            check(i+1, arr+[i],visited)
            # 초기화
            visited[i] = 0

check(1,[],[0]*(N+1))

 


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

 

15651번: N과 M (3)

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

www.acmicpc.net


  • 코드
from sys import stdin

# 1부터 N까지 자연수 중 M개 고르기(중복 허용)
N,M = map(int,stdin.readline().split())

# 수열
def check(arr):
    # 수열의 길이가 M인가?
    if len(arr) == M:
        print(*arr)
        return

    # 직전에 넣은 값도 넣을 수 있음
    for i in range(1,N+1):
        check(arr+[i])

check([])

 


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

 

15652번: N과 M (4)

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

www.acmicpc.net


  • 코드
from sys import stdin

# 1부터 N까지 자연수 중 M개 오름차순으로 고르기(중복 허용)
N,M = map(int,stdin.readline().split())

# 직전에 들어간 수, 수열
def check(idx,arr):
    # 수열의 길이가 M인가?
    if len(arr) == M:
        print(*arr)
        return

    # 직전에 넣은 값보다 크거나 같은 값만 수열에 들어갈 수 있음
    for i in range(idx,N+1):
        check(i,arr+[i])

check(1,[])
728x90
반응형

댓글