누룽지맛치킨
어미새의 개발일지
누룽지맛치킨
전체 방문자
오늘
어제
  • 분류 전체보기 (86)
    • 코틀린 (8)
    • 안드로이드 (5)
      • 디자인 (2)
      • 개발 (2)
      • 도구 (1)
    • 피그마 (1)
    • 대외활동 (0)
    • 프로젝트 (0)
    • 백준 (55)
      • JAVA (55)
    • 알고리즘 (3)
    • 클라우드 (5)
    • 스터디 (2)
      • 코테 (2)
    • 자료구조 (5)
    • 컴퓨터 기술 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준 자바 2292번
  • 안드로이드 디자인
  • 알고리즘 조합
  • 자료구조
  • 클라우드
  • 백준 자바 벌집
  • 클라우드 컴퓨팅
  • 코틀린 인 액션
  • 백준 자바
  • 백준 자바 정렬
  • 자바 Priority Queue
  • 코틀린
  • 백준 자바 2559번
  • 백준 자바 다이나믹 프로그래밍
  • Room version 올리기
  • 안드로이드
  • 백준 자바 누적합
  • 코틀린 runBlocking
  • Room Migration
  • 백준 자바 수열

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
누룽지맛치킨

어미새의 개발일지

백준/JAVA

[백준/JAVA] 15650번 N과 M(2)

2023. 2. 10. 14:31
  • 백트래킹 입문 문제 2
    https://www.acmicpc.net/problem/15650

1. 문제

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
  • 고른 수열은 오름차순이어야 한다.

2. 문제 접근

1) N의 수가 충분히 적고 M의 길이가 계속 달라지기 때문에 백트래킹 알고리즘을 적용한다.
2) 중복이 되면 안되기 때문에 중복을 체크하는 boolean 배열을 하나 사용하고 수열을 저장하는 int형 배열을 하나 사용한다.
3) 백트래킹 알고리즘에서 boolean 배열을 체크하고 전에 나온적이 없고 바로 이전의 수가 현재 수보다 작은 경우에만 수를 저장한다.
4) 모든 경우의 수를 다 탐색한다.

3. 코드

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class b_15650 {
    static int N,M;
    static boolean check[];
    static int num[];
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        int depth = 0;
        check = new boolean[N+1];
        num = new int[N];
        back(depth);
        System.out.print(sb);
    }

    static void back( int depth){
        if(depth == M){
            for(int i=0;i<M;i++){
                sb.append(num[i]).append(" ");
            }
            sb.append("\n");
            return;
        }
        for(int i=1;i<=N;i++){
            if(!check[i]){
                if(depth ==0 || (depth>0 && num[depth-1] < i)){
                    num[depth] = i;
                    check[i] = true;
                    back( depth +1);
                    check[i] = false;
                }
            }
        }
    }
}

'백준 > JAVA' 카테고리의 다른 글

[백준/JAVA] 14889번 스타트와 링크  (0) 2023.02.10
[백준/JAVA] 14888번 연산자 끼워넣기  (0) 2023.02.10
[백준/JAVA] 17298번 오큰수  (0) 2023.02.10
[백준/JAVA] 1021번 회전하는 큐  (0) 2023.02.10
[백준/JAVA] 10866번 덱  (0) 2023.02.10
    '백준/JAVA' 카테고리의 다른 글
    • [백준/JAVA] 14889번 스타트와 링크
    • [백준/JAVA] 14888번 연산자 끼워넣기
    • [백준/JAVA] 17298번 오큰수
    • [백준/JAVA] 1021번 회전하는 큐
    누룽지맛치킨
    누룽지맛치킨

    티스토리툴바