-
728x90
[ 풀이 방법 ]
1. 8명의 친구들을 줄세워 본다.
2. 주어진 모든 조건에 만족하면 answer++
[ 해설 ]
- 카카오 프렌즈 친구 {A, C, F, J, M, N, R, T}들에게 번호를 부여한다.
- 8명의 친구들을 차례대로 줄세우는 모든 방법을 구한다. => 순열! perm()
- 하나의 조합을 완성할 때 마다, 주어진 조건에 만족하는지 확인한다. => isCorrect()
list에는 해당 index번호를 가지고있는 프렌즈가 들어갈 위치가 저장된다.
ex) N의 위치를 확인 하는 방법은 다음과 같다.
= list[ 'N'의 번호 ]
N의 번호는 friend라는 해쉬맵에 저장되어 있다.
= list[ friend.get( 'N' ) ]
조건에 등장하는 친구는 조건으로 주어진 문자열의 0번과 2번에 위치한다.
= list[ friend.get( s.charAt(0) ) ]
위의 방법으로 친구1과 친구2의 위치를 구한다.- '=', '>', '<'에 따라서 distance(친구 1과 친구 위치의 차이)가 부합하는지 확인 후, true 또는 false를 리턴한다.
import java.util.HashMap; class Solution { static HashMap<Character, Integer> friend; static int list[], answer; static boolean isVisited[]; static String[] s_data; static int solution(int n, String[] data) { s_data = data; friend = new HashMap<Character, Integer>(); friend.put('A', 0); friend.put('C', 1); friend.put('F', 2); friend.put('J', 3); friend.put('M', 4); friend.put('N', 5); friend.put('R', 6); friend.put('T', 7); answer = 0; list = new int[8]; // 알파벳이 들어갈 위치 isVisited = new boolean[8]; perm(0); return answer; } private static void perm(int cnt) { if (cnt == 8) { if (isCorrect()) answer++; return; } for (int i = 0; i < 8; i++) { if (isVisited[i]) continue; isVisited[i] = true; list[cnt] = i; perm(cnt + 1); isVisited[i] = false; } } private static boolean isCorrect() { for (String s : s_data) { int friend1 = list[friend.get(s.charAt(0))]; int friend2 = list[friend.get(s.charAt(2))]; char op = s.charAt(3); int d = s.charAt(4) - '0' + 1; int distance = Math.abs(friend1 - friend2); if (op == '=') { if (distance != d) return false; } else if (op == '>' ) { if(distance <= d) return false; } else if (distance >= d) return false; } return true; } }
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[level2] 프로그래머스 - 괄호 변환(JAVA) (0) 2021.09.09 [level2] 프로그래머스 - 메뉴 리뉴얼(JAVA) (3) 2021.09.09 [level2] 프로그래머스 - 카카오프렌즈 컬러링북(JAVA) (0) 2021.09.02 [level2] 프로그래머스 - 오픈채팅방(JAVA) (0) 2021.09.02 [level2] 프로그래머스 - 문자열 압축(JAVA) (0) 2021.09.01 댓글