코테/코드트리

[코드트리/INTERMEDIATE LOW] 아름다운 수 (JAVA)

imname1am 2024. 1. 27. 22:51
반응형

📖 문제

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

 

 

💡  풀이 방식

• 백트래킹

1~4까지의 숫자 중 하나를 선택해 총 N번 선택하는 재귀를 작성해 모든 숫자들을 만든다.

그 중 정확히 숫자만큼 연달아 같은 수가 나오는 숫자 수를 구한다.

 

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.util.*;
import java.io.*;
 
public class Main {
    static int N;
    static ArrayList<Integer> list = new ArrayList<>();
    static int cnt = 0;
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
 
        dfs(0);
        System.out.println(cnt);
    }
 
    private static void dfs(int depth) {
        if(depth == N) {
            if(isBeautiful())
                cnt++;
            return;
        }
 
        for(int i = 1 ; i <= 4 ; i++) {
            list.add(i);
            dfs(depth + 1);
            list.remove(list.size() - 1);
        }
    }
 
    private static boolean isBeautiful() {
        for(int i = 0 ; i < N ; i += list.get(i)) {    // 연달아 같은 숫자가 나오는 시작 위치
            if(i + list.get(i) > N) {    // 연속해서 해당 숫자만큼 안 나오면 안 됨.
                return false;
            }
 
            for(int j = i ; j < i + list.get(i) ; j++) {    // 연속하여 해당 숫자만큼 같은 숫자가 있는지 확인 (하나라도 다르면 안 )
                if(list.get(j) != list.get(i))
                    return false;
            }
        }
 
        return true;
    }
}
cs

 

 

 

➕ 다른 풀이 방식

배열을 활용한 방법도 있다..

 

코드트리 [자바 java] 아름다운 수

https://www.codetree.ai/missions/2/problems/beautiful-number/submissions 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국

ethereal-coder.tistory.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.*;
import java.io.*;
 
public class Main {
    static int N;
    static int[] arr;
    static int cnt = 0;
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        N = Integer.parseInt(br.readLine());
        arr = new int[N];
 
        dfs(0);
        System.out.println(cnt);
    }
 
    private static void dfs(int depth) {
        if(depth == N) {
            cnt++;
            return;
        }
 
        for(int i = 1 ; i <= 4 ; i++) {
            if(depth + i > N) {    // 배열 범위 벗어나는 경우 예외처리
                return;
            }
            else {
                for(int j = 0 ; j < i ; j++) {  // 숫자 i를 한 번에 j개씩 덩어리로 집어넣는다.
                    arr[depth + j] = i;
                }
                dfs(depth + i);
            }
        }
    }
}
cs


💦 어려웠던 점

- 1~4만 활용하면 된다는 문제 조건을 제대로 확인하지 못 했다.

- 아름다운 수인지 판별하는 함수 작성(구현)

 

🧐 새로 알게 된 내용

- 한 번에 아름다운 수를 만들거나 / 1~4로 모든 수를 만들고 아름다운 수의 수를 세도 된다.. (편리한 건 후자가 더 편리하다 한다.)

- 한 번에 아름다운 수를 덩어리로 넣는 방법 (방법2)

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

✔ 코드트리

 

반응형