PS/Backtracking

프로그래머스: 단체사진 찍기 (Java)

닻과매 2022. 6. 29. 21:34

https://programmers.co.kr/learn/courses/30/lessons/1835

 

코딩테스트 연습 - 단체사진 찍기

단체사진 찍기 가을을 맞아 카카오프렌즈는 단체로 소풍을 떠났다. 즐거운 시간을 보내고 마지막에 단체사진을 찍기 위해 카메라 앞에 일렬로 나란히 섰다. 그런데 각자가 원하는 배치가 모두

programmers.co.kr

 

 

 

 

 

 

 

 

 

 

 

 

 

 


풀이

특별할 거 없이 8!가지의 위치 조합을 순열 함수를 통해 구하고, 조건문에 해당하면 1씩 더해주어 answer를 return하면 됩니다. 문자열 처리를 살짝 곁들인 백트래킹? 백준이면 실버 1 정도 될 듯합니다.

역시 카카오가 문제 퀄리티가 좋네요.

 

배운 점

프로그래머스에서는 채점 시 solution을 여러 번 사용하기에, 전역변수를 선언했다면 solution마다 초기화해줄 필요가 있다고 합니다... 🤔

 

코드

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
import java.util.*;
 
class Solution {
    
    static int ans;
    static int[] loc = new int[8];
    static boolean[] visited = new boolean[8];
    static int[][] conditions;
    
    public int solution(int n, String[] data) {
        ans = 0;
        loc = new int[8];
        visited = new boolean[8];
        conditions = new int[n][4];
        // 프렌즈들을 숫자로 처리하기 위한 HashMap
        HashMap<Character, Integer> map = new HashMap<>();
        map.put('A'0);
        map.put('C'1);
        map.put('F'2);
        map.put('J'3);
        map.put('M'4);
        map.put('N'5);
        map.put('R'6);
        map.put('T'7);
        for (int i = 0; i < n; i++) {
             // 조건을 8!의 경우마다 편하게 쓰기 위해 처리
            int x1 = map.get(data[i].charAt(0));
            int x2 = map.get(data[i].charAt(2));
            int y = 0;
            if (data[i].charAt(3== '=') {
                y = 0;
            } else if (data[i].charAt(3== '<') {
                y = -1;
            } else {
                y = 1;
            }
            int x3 = data[i].charAt(4- '0';
            conditions[i][0= x1;
            conditions[i][1= x2;
            conditions[i][2= y;
            conditions[i][3= x3;
        }
        perm(0);
        return ans;
    }
    
    // 순열
    void perm(int cnt) {
        if (cnt == 8) {
            if (valid()) ans++;
            return;
        }
        
        for (int i = 0; i < 8; i++) {
            if (visited[i]) continue;
            visited[i] = true;
            loc[cnt] = i;
            perm(cnt+1);
            visited[i] = false;  
        }
    }
    
    // 가능한지 판단하는 method
    boolean valid() {
        for (int i = 0; i < conditions.length; i++) {
            if (conditions[i][2== -1) {
                if (Math.abs(loc[conditions[i][0]] - loc[conditions[i][1]]) >= conditions[i][3+ 1return false;
            }
            else if (conditions[i][2== 0) {
                if (Math.abs(loc[conditions[i][0]] - loc[conditions[i][1]]) != conditions[i][3+ 1return false;
            }
            else {
                if (Math.abs(loc[conditions[i][0]] - loc[conditions[i][1]]) <= conditions[i][3+ 1return false;
            }
        }
        return true;
    }
}
 
cs

 

'PS > Backtracking' 카테고리의 다른 글

백준 17136번: 색종이 붙이기 (Java)  (0) 2022.07.18
백준 1062번: 가르침 (JAVA)  (0) 2022.05.16
백준 9663번: N-Queen (JAVA)  (0) 2022.04.06
백준 2239번: 스도쿠 (JAVA)  (0) 2022.04.06
백준 1941번: 소문난 칠공주 (JAVA)  (0) 2022.04.05