백준 6603번 로또 (JAVA)

SeungMin Park·2024년 2월 10일
1

알고리즘

목록 보기
6/9

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


문제

실버 2 난이도의 재귀 문제이다
완전 탐색 문제인지, 재귀문제인지 헷갈렸는데, 일일히 다 완전탐색하면 힘들것 같아서 재귀로 푸는게 좋아보였다


풀이

풀이의 핵심은 recur 메서드에 depth 라는 변수를 설정함으로써 depth 의 길이가 6이 되면 저장되어있는 배열을 출력하도록 하는 것이다.
그리고 recur 메서드 안에서 해당되는 boolean 배열을 true로 바꿔주고 recur(재귀)를 해주는데, 재귀에서 나오면 앞에 바꿨던 boolean 배열을 false로 다시 바꿔주면서 해당 알고리즘이 수행되도록 하였는데, 이 부분이 구현할때 힘들고 시간이 많이 걸린것 같다.


코드

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

public class Main {
    static int [] number, answer;
    static boolean[] check;
    static StringBuilder sb;
    static int k;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true){
            sb = new StringBuilder();
            StringTokenizer st = new StringTokenizer(br.readLine());
            k = Integer.parseInt(st.nextToken());
            if(k == 0){
                break;
            }
            number = new int[k];
            check = new boolean[k];
            answer = new int[6];
            for(int i=0; i<k; i++){
                number[i] = Integer.parseInt(st.nextToken());
            }
            recur(0,0);
            sb.append("\n");
            System.out.print(sb);
        }


    }

    public static void recur(int start, int depth) {
        if(depth == 6){
            for(int i=0; i<6; i++){
                sb.append(answer[i]).append(" ");
            }
            sb.append("\n");
            return;
        }

        for(int i=start; i<k; i++){
            if(!check[i]){
                check[i] = true;
                answer[depth] = number[i];
                recur(i,depth+1);
                check[i] = false;
            }
        }

    }
}

느낀점

아직은 재귀를 쓸때 변수들의 값을 제대로 설정하는 것이 익숙하지 않은것 같다. 주기적으로 재귀 문제를 풀어봐야될것 같다.

0개의 댓글

관련 채용 정보