코테/프로그래머스

[프로그래머스/Level2] 외벽 점검 (JAVA)

imname1am 2024. 3. 5. 15:14
반응형

📖 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

💡  풀이 방식

원형 완전탐색 + 순열

 

1. 모든 weak 케이스 만들기

: 다음 시작 지점 기준으로 마지막 weak point + N까지 직선으로 펼치기 (원형 큐 방식)

// 모든 weak 케이스 만드는 메서드 (완탐. 원형 큐처럼 펼치기) - 1 5 6 10 / 5 6 10 13 / 6 10 13 17 / 10 13 17 18
private static void makeWeakCases() {
    int[] wc = weak.clone();
    weakCases[0] = wc.clone();

    for(int i = 1 ; i < weak.length ; i++) {
        int tmp = wc[0];

        for(int j = 1 ; j < weak.length ; j++) {
            wc[j - 1] = wc[j];
        }

        wc[weak.length - 1] = tmp + n;	// 직선으로 펼치기
        weakCases[i] = wc.clone();
    }
}
예를 들어, N = 12, weak = [1, 5, 6, 10]인 경우 처음에 위치 1을 기준으로 직선으로 펼쳤다면, 이번에는 위치 5를 기준으로 [5, 6, 10, 13]과 같이 직선 형태로 만들어 주면 됩니다. 이때, 13은 값이 증가하는 형태로 만들어 주기 위해 1 + 12를 해준 결과입니다.

- 출처 : https://tech.kakao.com/2019/10/02/kakao-blind-recruitment-2020-round1/

 

 

2. 모든 dist 케이스 만들기

: dist에서 점검할 친구 1명 ~ 8명까지 순열로 선택해 나열하는 방법을 모두 고려한다. 

// 친구로 모든 dist 케이스 만드는 메서드 (순열) - 3 5 7 / 3 7 5 / 5 3 7 ...
private static void makeDistCases(int depth) {
    if(depth == dist.length) {
        for(int[] wc : weakCases)   // 3. 모든 weak 케이스에 대해 모든 dist 케이스 검사
            chk(dist_case, wc);
        return;
    }

    for(int i = 0 ; i < dist.length ; i++) {
        if(!visited[i]) {
            visited[i] = true;
            dist_case[depth] = dist[i];

            makeDistCases(depth + 1);

            //dist_case[depth] = 0;
            visited[i] = false;
        }
    }
}

 

 

3. 모든 weak 케이스에 대해 모든 dist 케이스로 검사하기

: 구한 순서대로 weak point를 최대로 할당해, 전체 weak point를 커버 가능하지 검사한다.

// 모든 weak 케이스에 대해 모든 dist 케이스 검사하는 메서드
private static void chk(int[] dc, int[] wc) {
    int now = 0;
    int idx = 0;

    while(now < wc.length && idx < dc.length) { // 기존 weak 길이만큼 탐색
        int next = now + 1;

        // 순서대로 외벽을 얼만큼 점검할 수 있는지 확인
        while(next < wc.length && wc[now] + dc[idx] >= wc[next]) {
            next++;
        }

        now = next;
        idx++;
    }

    if(now == wc.length && idx < answer)    // 모든 외벽 점검했는지 확인
        answer = idx;
}

 

 

 

🔺 코드

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.util.*;
 
class Solution {    
    static int n;
    static int[] weak, dist;
    static int[][] weakCases;
    
    // dfs용
    static boolean[] visited;
    static int[] dist_case;
    
    static int answer = Integer.MAX_VALUE;
    
    public int solution(int n, int[] weak, int[] dist) {
        this.n = n;
        this.weak = weak;
        this.dist = dist;
        
        weakCases = new int[weak.length][weak.length];
        makeWeakCases();    // 1. 모든 weak 케이스 만들기
        
        visited = new boolean[dist.length];
        dist_case = new int[dist.length];   // 순열 저장할 배열
        makeDistCases(0);
 
        return (answer == Integer.MAX_VALUE) ? -1 : answer;
    }
    
    // 1. 모든 weak 케이스 만드는 메서드 (완탐. 원형 큐처럼 펼치기) - 1 5 6 10 / 5 6 10 13 / 6 10 13 17 / 10 13 17 18
    private static void makeWeakCases() {
        int[] wc = weak.clone();
        weakCases[0= wc.clone();
        
        for(int i = 1 ; i < weak.length ; i++) {
            int tmp = wc[0];
            
            for(int j = 1 ; j < weak.length ; j++) {
                wc[j - 1= wc[j];
            }
            
            wc[weak.length - 1= tmp + n;
            weakCases[i] = wc.clone();
        }
    }
    
    // 2. 모든 dist 케이스 만드는 메서드 (순열) - 3 5 7 / 3 7 5 / 5 3 7 ...
    private static void makeDistCases(int depth) {
        if(depth == dist.length) {
            for(int[] wc : weakCases)   // 3. 모든 weak 케이스에 대해 모든 dist 케이스 검사
                chk(dist_case, wc);
            return;
        }
        
        for(int i = 0 ; i < dist.length ; i++) {
            if(!visited[i]) {
                visited[i] = true;
                dist_case[depth] = dist[i];
                
                makeDistCases(depth + 1);
                
                dist_case[depth] = 0;
                visited[i] = false;
            }
        }
    }
    
    // 3. 모든 weak 케이스에 대해 모든 dist 케이스 검사하는 메서드
    private static void chk(int[] dc, int[] wc) {
        int now = 0;
        int idx = 0;
        
        while(now < wc.length && idx < dc.length) { // 기존 weak 길이만큼 탐색
            int next = now + 1;
            
            // 순서대로 외벽을 얼만큼 점검할 수 있는지 확인
            while(next < wc.length && wc[now] + dc[idx] >= wc[next]) {
                next++;
            }
            
            now = next;
            idx++;
        }
        
        if(now == wc.length && idx < answer)    // 모든 외벽 점검했는지 확인
            answer = idx;
    }
}
cs

 

 

➕ 다른 풀이 방식

- 3번 과정이 약간 다르다.

 

[java] 프로그래머스 (외벽 점검) Level 3

Problem : https://programmers.co.kr/learn/courses/30/lessons/60062 코딩테스트 연습 - 외벽 점검 레스토랑을 운영하고 있는 스카피는 레스토랑 내부가 너무 낡아 친구들과 함께 직접 리모델링 하기로 했습니다.

gre-eny.tistory.com

 

 

프로그래머스 외벽 점검 java

코딩테스트 연습 - 외벽 점검 레스토랑을 운영하고 있는 "스카피"는 레스토랑 내부가 너무 낡아 친구들과 함께 직접 리모델링 하기로 했습니다. 레스토랑이 있는 곳은 스노우타운으로 매우 추운

sc-science.tistory.com

 

 

- dist 배열을 오름차순 정렬하고, 뒤에서부터 0까지 DFS 진행! (내가 생각했던 부분)

 

[프로그래머스/자바] 외벽 점검 풀이 - 2020 KAKAO BLIND RECRUITMENT

https://school.programmers.co.kr/learn/courses/30/lessons/60062 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는

thdbs523.tistory.com


💦 어려웠던 점

아따 다 어렵다,,,,,,,,,ㅎㅎ

 

 

🧐 새로 알게 된 내용

- 원형 탐색 위해 배열을 확장해서 붙이는 방법. 이러면 반시계 방향까지 커버한다고 한다.

 

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

(참고)

 

[프로그래머스] 2020 카카오 #6 외벽 점검 (Java)

#6 외벽 점검 난이도 : LEVEL3 유형 : 순열 / 브루트포스 코딩테스트 연습 - 외벽 점검 레스토랑을 운영하고 있는 "스카피"는 레스토랑 내부가 너무 낡아 친구들과 함께 직접 리모델링 하기로 했습니

loosie.tistory.com

 

[프로그래머스] 외벽 점검 / Java

문제주소 :programmers.co.kr/learn/courses/30/lessons/60062?language=java 코딩테스트 연습 - 외벽 점검 레스토랑을 운영하고 있는 "스카피"는 레스토랑 내부가 너무 낡아 친구들과 함께 직접 리모델링 하기로

dev-note-97.tistory.com

 

 

[프로그래머스] 2020 KAKAO BLIND RECRUITMENT 외벽 점검 (Java)

프로그래머스 2020 KAKAO BLIND RECRUITMENT 외벽 점검 : https://programmers.co.kr/learn/courses/30/lessons/60062 코딩테스트 연습 - 외벽 점검 | 프로그래머스 레스토랑을 운영하고 있는 스카피는 레스토랑 내부가 너

leveloper.tistory.com

 

 

외벽점검 - JAVA

https://school.programmers.co.kr/learn/courses/30/lessons/60062?language=java 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합

yummy0102.tistory.com

 

반응형