728x90
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/1835
문제 풀이
- DFS(깊이 우선 탐색)을 사용하여 순열을 만들고 주어진 조건을 만족하는지 검사한다.
- 어떤 이유인지는 잘 모르겠지만, answer를 solution 메서드에서 초기화해주지 않으면 프로그래머스 테스트에서 통과가 되지 않는다.
class Solution {
static String[] conditions;
static int[] check;
static char[] arr;
static char[] friends = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
static int answer, nLen;
public int solution(int n, String[] data) {
answer = 0; //solution에서 초기화를 해줘야 테스트가 통과된다.
nLen = n;
conditions = data;
check = new int[friends.length];
arr = new char[friends.length];
dfs(0);
return answer;
}
public void dfs(int level) {
if(level == friends.length) {
boolean flag = true;
for(int i = 0; i < nLen; i++) {
int f1 = getPosition(arr, conditions[i].charAt(0));
int f2 = getPosition(arr, conditions[i].charAt(2));
char op = conditions[i].charAt(3);
int value = Character.getNumericValue(conditions[i].charAt(4)) + 1;
if((op == '=' && Math.abs(f1 - f2) != value) ||
(op == '<' && Math.abs(f1 - f2) >= value) ||
(op == '>' && Math.abs(f1 - f2) <= value)) {
flag = false;
break;
}
}
if(flag) answer++;
} else {
for(int i = 0 ; i < friends.length; i++) {
if(check[i] == 0) {
check[i] = 1;
arr[level] = friends[i];
dfs(level + 1);
check[i] = 0;
}
}
}
}
//배열에서 문자 c의 위치가 어디인지 리턴해주는 메서드
public int getPosition(char[] arr, char c) {
for(int i = 0; i < arr.length; i++) {
if(arr[i] == c) {
return i;
}
}
return -1;
}
}
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[2019 KAKAO BLIND RECRUITMENT] 오픈채팅방 - 자바(Java) (0) | 2021.10.15 |
---|---|
[2020 KAKAO BLIND RECRUITMENT] 문자열 압축 - 자바(Java) (0) | 2021.10.15 |
[프로그래머스] 소수 찾기 - JAVA, DFS(깊이 우선 탐색) (0) | 2021.07.16 |
[프로그래머스] 타겟 넘버 - 자바(java), 깊이 우선 탐색(DFS) (0) | 2021.07.12 |
[프로그래머스] 짝지어 제거하기 - 자바(java), 스택(stack) (0) | 2021.07.11 |
댓글