개발자 피터
Peter's Dev Blog
개발자 피터
전체 방문자
오늘
어제
  • 분류 전체보기 (77)
    • 🧑🏻‍💻 Develop (13)
      • Devops (3)
      • Elasticsearch (3)
      • Design Pattern (1)
      • SQL (4)
      • Architecture (1)
      • APM (1)
    • 💻 Service (7)
      • E-ROOM (3)
      • Briefing (4)
    • 💡 Problem Solving (43)
      • Baekjoon (40)
      • Programmers (2)
    • 📚 Reading (12)
      • Tech (9)
      • Self-Help (3)
    • 💬 Etc (1)
    • 📈 Retrospective (1)

블로그 메뉴

  • 🌟 깃허브
  • 🏷️ 태그 클라우드
  • 📝 방명록

공지사항

인기 글

태그

  • Programmers
  • 브루트포스
  • SQL
  • boj
  • 백트래킹
  • MySQL
  • 백준
  • 문자열
  • E-ROOM
  • java
  • 그리디
  • 독서
  • 구현
  • elasticsearch
  • briefing

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
개발자 피터

Peter's Dev Blog

💡 Problem Solving/Baekjoon

[백준 - 15663] N과 M (9) [C++]

2021. 1. 20. 16:47
728x90
반응형

1. 문제

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

 

15663번: N과 M (9)

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

www.acmicpc.net

2. 풀이과정

N개의 자연수 중에서 M개를 고른 수열을 출력하는 문제인데, 아래의 조건들을 만족해야한다.

  1. 중복되는 수열을 여러 번 출력하면 안된다.

  2. 수열은 사전 순으로 증가하는 순서로 출력해야 한다.

 

N = 4, M = 2

N개의 수 = {9, 7, 9, 1}일 때,

1 7

1 9

7 1

7 9

9 1

9 7

9 9

가 출력되어야 한다. 

 

2번 조건을 만족하기 위해 N개의 수를 오름차순 정렬한다.

N개의 수  = {1, 7, 9, 9}

 

그림1

 

1번조건을 만족하기 위해선 그림1과 같이 같은 레벨에서 같은 수를 중복 방문하지 않아야한다.

 

[코드설명]

dfs함수는 문제의 조건을 만족하는 N개의 자연수 중에서 M개를 고른 수열을 출력해준다.

3. 코드

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
int n, m;
vector<int> arr;
bool visited[8];


void dfs(vector<int>& v, int depth) {
    if(depth == m) {
        for(int i=0; i<m; i++) cout << v[i] << " ";
        cout << "\n";
        return ;
    }
    bool same_level_visited[10001] = {false};
    for(int i=0; i<n; i++) {
        if(!same_level_visited[arr[i]] && !visited[i]) {
            v.push_back(arr[i]);
            visited[i] = true;
            same_level_visited[arr[i]]=true;
            
            dfs(v, depth+1);
            
            v.pop_back();
            visited[i] = false;
            
        }
    }
}

int main() {
    cin.tie(NULL);
    ios::sync_with_stdio(false);
    cin >> n >> m;
    for(int i=0; i<n; i++) {
        int tmp;
        cin >> tmp;
        arr.push_back(tmp);
    }
    sort(arr.begin(), arr.end());
    vector<int> v;
    dfs(v, 0);
    return 0;
}
728x90
반응형
저작자표시 (새창열림)

'💡 Problem Solving > Baekjoon' 카테고리의 다른 글

[백준 - 2503] 숫자 야구 [C++]  (0) 2021.01.23
[백준 - 1436] 영화감독 숌 [C++]  (0) 2021.01.21
[백준 - 2529] 부등호 [C++]  (0) 2021.01.18
[백준 - 2108] 통계학 [C++]  (0) 2021.01.17
[백준 - 14502] 연구소 [C++]  (0) 2021.01.16
    '💡 Problem Solving/Baekjoon' 카테고리의 다른 글
    • [백준 - 2503] 숫자 야구 [C++]
    • [백준 - 1436] 영화감독 숌 [C++]
    • [백준 - 2529] 부등호 [C++]
    • [백준 - 2108] 통계학 [C++]
    개발자 피터
    개발자 피터
    Backend Engineer 🔥

    티스토리툴바