[ 백준 15666번 ] N과 M(12)

2023. 3. 8. 10:20·Algorithm/문제풀이

1. 문제

 

15666번: N과 M (12)

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

www.acmicpc.net

 

2. 풀이

N과 M 시리즈의 마지막 문제다. 문제의 핵심 조건은 아래와 같다.

 

  • 수열에서 같은 수를 여러번 사용할 수 있음
  • 비내림차순으로 출력해야 함

 

비내림차순 자체는 입력받은 수열을 오름차순으로 정렬하면 되서 어렵지 않은 조건이지만, 같은 수를 여러번 사용할 수 있게는 어떻게 처리할 것인가?

 

바로 입력 받은 수열의 중복을 제거하는 것이다! 수열의 중복을 제거하고 단순하게 수열의 요소들을 반복 선택하여 M의 길이로 맞춰주면 되는 것으로 코드를 보면 보다 직관적으로 이해될 것이다.

 

3. 소스코드

더보기
public class backtracking_15666_NnM12 {
    static int N, M;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        int[] arr = lineToSortedDistinctArray(br.readLine());

        backtracking(arr, 0, 0, "");

        bw.write(sb.toString());
        bw.close();
        br.close();
    }

    /**
     * @param arr 중복이 제거되고 오름차순 정렬된 수열
     * @param start 시작 idx
     * @param cnt 현재 수열의 길이
     * @param seq 현재 만들고 있는 부분수열
     */
    static void backtracking(int[] arr, int start, int cnt, String seq) {
        if (cnt == M) {
            sb.append(seq.trim()).append("\n");
            return;
        }

        for (int i = start, n = arr.length; i < n; i++) {
            backtracking(arr, i, cnt + 1, seq + arr[i] + " ");
        }
    }

    // 입력 받은 수열의 중복을 제거하고 오름차순으로 정렬
    static int[] lineToSortedDistinctArray(String line) {
        return Arrays.stream(line.split(" "))
                .mapToInt(Integer::parseInt)
                .distinct()
                .sorted()
                .toArray();
    }

}
 

GitHub - kwanik-kor/BOJ: Baekjoon Online Judge - explanation of solved problems and complete code

Baekjoon Online Judge - explanation of solved problems and complete code - GitHub - kwanik-kor/BOJ: Baekjoon Online Judge - explanation of solved problems and complete code

github.com

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'Algorithm > 문제풀이' 카테고리의 다른 글

[ 백준 1715번 ] 카드 정렬하기  (1) 2023.03.10
[ 백준 17144번 ] 미세먼지 안녕!  (0) 2023.03.10
[ 백준 2225번 ] 합분해  (0) 2023.03.06
[ 백준 14891번 ] 톱니바퀴  (0) 2023.03.05
[ 백준 3190번 ] 뱀  (3) 2023.03.03
'Algorithm/문제풀이' 카테고리의 다른 글
  • [ 백준 1715번 ] 카드 정렬하기
  • [ 백준 17144번 ] 미세먼지 안녕!
  • [ 백준 2225번 ] 합분해
  • [ 백준 14891번 ] 톱니바퀴
갈닉
갈닉
중요한 건 엔지니어가 되겠다는 마음. 근데 이제 인문학을 곁들인.
    반응형
  • 갈닉
    KwanIk Devlog
    갈닉
  • 전체
    오늘
    어제
    • 분류 전체보기 (57)
      • Algorithm (41)
        • 알고리즘 개요 (8)
        • 문제풀이 (33)
      • Language (6)
        • Java (1)
        • Kotlin (4)
        • Rust (1)
      • Framework (0)
        • Spring (0)
        • Spring Security (0)
        • Spring Data JPA (0)
      • Computer Science (1)
        • 프로그래밍 언어 (0)
        • 자료구조 (1)
        • 보안 (0)
      • ETC (1)
        • MSA (0)
        • TDD (1)
        • DDD (0)
      • 개발서적 (3)
        • 오브젝트 (3)
      • Life (5)
        • 생각생각 (4)
        • 회고록 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

    • My Github
  • 공지사항

  • 인기 글

  • 태그

    Algorithm
    Kotlin
    너비우선탐색
    backtracking
    자바
    백트래킹
    BFS
    java
    DP
    greedy
    코틀린
    구현
    비트마스크
    알고리즘
    boj
    시뮬레이션
    백준
    오브젝트
    객체지향
    bitmask
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
갈닉
[ 백준 15666번 ] N과 M(12)
상단으로

티스토리툴바