15666번

2023. 1. 1. 09:52·CS 이론/알고리즘
728x90

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

 

15666번: N과 M (12)

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

www.acmicpc.net

이 문제는 중복되는 수열을 제거하고 또한 이전에 앞자리에 쓰인 숫자는 사용이 안되게 만드는 것이다. 하지만 자기자신을 사용한 경우는 출력한다. 잘 알아듣지 못할 수도 있어서 I/O 예제를 가져왔다.

여기서 사용해야할 것은 중복을 제거하기 위한 메서드 수행시마다 확인할 tmp와 시작지점을 바꿀 at을 사용한다.

물론 변수는 다른걸 사용해도 상관없다.

그렇게 해서 dfs메서드를 재귀로 돌리는 동안에는 at을 변화시키면 자기 자신을 포함한 수열의 경우는 구할 수 없음으로, at은 재귀가 끝날 때마다 증가시킨다. N과 M문제는 재귀를 이해하는 것이 중요한 문제이기 때문에 크게 설명할 것이 없다.

모두 코드를 직접 손으로 써서 해보거나, 디버깅을 이용해서 확인해 보는 것이 이해가 빠를 것이다.

그래서 정답 코드는 아래와 같다. 

package backjoon.b15666;

import java.io.*;
import java.util.*;
public class b15666 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int[] arr = new int[n];
        st = new StringTokenizer(br.readLine());
        for(int i=0; i<n; i++){
            arr[i]= Integer.parseInt(st.nextToken());
        }
        Arrays.sort(arr);
        Graph g = new Graph(n,m,arr);
        g.dfs(0,0);
        System.out.println(g.sb);
    }
}
class Graph {
    int n;
    int m;
    int[] arr;
    int[] answer;
    boolean[] check;
    StringBuilder sb;

    public Graph(int n, int m, int[] arr) {
        this.n = n;
        this.m = m;
        this.arr = arr;
        sb = new StringBuilder();
        check = new boolean[n];
        answer = new int[m];
    }

    public void dfs(int at, int depth){
        if(depth==m){
            for(int i : answer){
                sb.append(i).append(" ");
            }
            sb.append("\n");
            return;
        }
        int tmp = 0;
        for(int i=at; i<n; i++){
            if(check[i] || tmp==arr[i]){
                continue;
            }
            answer[depth]=arr[i];
            tmp=arr[i];
            dfs(i,depth+1);
            at++;
        }
    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

드디어 N과 M을 다 부쉈다. 확실히 풀고나니 조금 구조가 이해되고, 조합도 이해한 것 같다. 이제 다른 문제들도 더 풀어보면서 알고리즘 지식을 더욱 키워야겠다.

 

728x90

'CS 이론 > 알고리즘' 카테고리의 다른 글

25682번  (1) 2023.01.03
16139번  (0) 2023.01.02
15663번  (0) 2022.12.31
1003번  (2) 2022.12.29
15655번  (0) 2022.12.29
'CS 이론/알고리즘' 카테고리의 다른 글
  • 25682번
  • 16139번
  • 15663번
  • 1003번
Bello's
Bello's
개발하는 벨로
  • Bello's
    벨로의 개발일지
    Bello's
  • 전체
    오늘
    어제
    • 분류 전체보기 (205)
      • 노예 일지 (7)
        • 스타트업 노예일지 (3)
      • CS 이론 (81)
        • 학과 수업 (4)
        • 알고리즘 (64)
        • 시스템 프로그래밍 (3)
        • 데이터 통신 (1)
        • 운영체제 (2)
        • 데이터베이스 (1)
      • project (3)
      • 나는 감자다. (4)
      • Spring (27)
      • 모각코 (45)
        • 절개와지조(모각코) (7)
        • 어쩌다보니 박준태가 조장이조 (11)
        • 어쩌다보니 박준태가 또 조장이조 (12)
      • LikeLion🦁 (20)
      • 캘리포니아 감자 (4)
      • OpenSource Contribute (1)
      • 우아한테크벨로 (13)
        • 프리코스 회고록 (6)
        • Level 1 (2)
        • Level2 (3)
        • Level3 (1)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    Spring
    프리코스
    감자
    뛰슈
    JPA
    회고록
    우테코
    타임리프
    그래프 순회
    자바
    절개와지조
    나는 감자
    DFS
    BFS
    누적합
    어렵다
    8기
    오블완
    모각코
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Bello's
15666번
상단으로

티스토리툴바