[파이썬] 15650번. N과 M (2) 풀이

2023. 3. 3. 18:11·알고리즘과 코딩 테스트/백준 25단계

재귀함수는 너무 어렵다..

이전 15649번 문제도 한참 해맸는데, 조금만 응용하니까 더 헷갈린다.

 

처음 직접 풀었던 풀이 -> 그냥 이전 풀이처럼 모든 가능한 경우의 수를 다 때려박고

바로 출력하는 대신, 수열을 강제로 정렬하고 set으로 중복을 제거하고, 다시 출력했다.

딱 봐도 N, M이 커지면 커질 수록 시간 복잡도에서 손해를 볼 것이 분명하다..

 

N, M = map(int, input().split())
seq = [] 
seq_list = [] # 문제의 조건을 만족하는 수열들이 담길 리스트 

def dfs():
    if (len(seq) == M):
        seq_list.append(sorted(seq)) # 수열을 강제로 정렬한다음 리스트에 넣는다.
        return
    
    for i in range(1, N + 1):
        if (i not in seq): # 같은 수 중복을 방지하기 위해
            seq.append(i)
            dfs()
            seq.pop() # pop()은 리스트의 맨 마지막 원소를 리턴하고 그 원소는 삭제한다.

dfs()

# 원소가 list일 때도 set으로 중복을 제거하고 싶다면 map()으로 tuple로 바꾸면 할 수 있다.
seq_list = list(set(map(tuple, seq_list)))
seq_list.sort()
for seq in seq_list:
    print(" ".join(map(str, seq)))

 


인터넷 풀이를 참고한 2번째 방법 -> dfs() 함수를 살짝 변형해서, 반복문이 1 ~ N까지 모든 숫자를 사용하지 않고

앞의 숫자가 뒤의 숫자보다 큰 경우를 제외하기 위해 start부터 N까지의 숫자를 사용한다.

이 방법은 아예 반복문이 적게 실행된다는 장점이 있다!

 

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

def dfs(start):
    if (len(seq) == M):
        print(' '.join(map(str, seq)))
        return
    
    # 기존에는 1부터 N까지 모든 숫자를 사용했지만, 이제는 [2, 1]같은
    # 앞의 숫자가 뒤의 숫자보다 큰 경우를 제외하기 위해 start부터 N까지의 숫자를 사용한다.
    for i in range(start, N + 1):
        if i not in seq:
            seq.append(i)
            dfs(i + 1)
            seq.pop()
            
dfs(1)

 

보아하니

앞으로의 백트래킹 유형 문제들이 나에게는 정말 쉽지 않을 것 같다 ㅠㅠ

 

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

 

15650번: N과 M (2)

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

www.acmicpc.net

 

'알고리즘과 코딩 테스트 > 백준 25단계' 카테고리의 다른 글

[파이썬] 1629번. 곱셈 풀이  (0) 2023.09.07
[파이썬] 9663번. N-Queen 풀이  (0) 2023.03.04
[파이썬] 2004번. 조합 0의 개수 풀이  (0) 2023.02.24
[파이썬] 9375번. 패션왕 신해빈 풀이  (0) 2023.02.22
[파이썬] 2981번. 검문 풀이  (1) 2023.02.21
'알고리즘과 코딩 테스트/백준 25단계' 카테고리의 다른 글
  • [파이썬] 1629번. 곱셈 풀이
  • [파이썬] 9663번. N-Queen 풀이
  • [파이썬] 2004번. 조합 0의 개수 풀이
  • [파이썬] 9375번. 패션왕 신해빈 풀이
달거달거
달거달거
개발자를 꿈꿉니다
  • 달거달거
    SWEE IT
    달거달거
  • 전체
    오늘
    어제
    • 분류 전체보기 (288)
      • 개발 환경 (5)
        • VSCode (1)
        • 파이썬 (Anaconda) (1)
        • Git (1)
        • Flutter (0)
        • Kotlin (1)
      • Spring (5)
        • 스프링 부트와 JPA 실무 완전 정복 로드맵 (2)
        • 스프링 부트와 AWS로 구현하는 웹 서비스 (1)
        • 채쌤의 스프링 부트 프로젝트 (1)
      • 알고리즘과 코딩 테스트 (16)
        • 파이썬 문법 (2)
        • 백준 25단계 (10)
        • 프로그래머스 코딩 테스트 고득점 Kit (1)
        • 코틀린 문법 (1)
      • 요리 (236)
      • 데이터베이스 (2)
        • MySQL (2)
      • 안드로이드 (11)
        • 연습 코드 (6)
        • 도서 내용 정리 (4)
      • Dart와 Flutter (5)
        • 도서 내용 정리 (4)
        • Flutter 위젯 정리 (1)
        • 15개 프로젝트 (2)
      • 피그마 (0)
        • 도서 내용 정리 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코틀린
    오블완
    문법
    프로그래머스
    코딩 테스트
    git
    주석
    C
    spring
    백준
    아나콘다
    자취요리
    node.js
    피그마
    머신러닝
    알고리즘
    c++
    DART
    vscode
    JPA
    티스토리챌린지
    docker
    Flutter
    AWS
    안드로이드
    파이썬
    mysql
    데이터베이스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
달거달거
[파이썬] 15650번. N과 M (2) 풀이
상단으로

티스토리툴바