티스토리 뷰
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/1835
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 설명
경우의 수 최대가 8!이기 때문에 재귀를 사용했다.
backtracking을 사용해서 경우의 수를 줄이려고 했는데,
검사하는 경우의 수는 줄었지만 결과적으로 시간은 늘어났다.
왜지
3. 코드
class Solution {
static char[] friends = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
static boolean[] visited;
static char[] position;
static int answer;
public int solution(int n, String[] data) {
answer = 0;
visited = new boolean[8];
position = new char[8];
backtracking(0, n, data);
return answer;
}
void backtracking(int idx, int n, String[] data) {
if(idx == 8) {
answer++;
}
else {
for(int i=0; i<8; i++) {
if(!visited[i]) {
visited[i] = true;
position[idx] = friends[i];
// 조건을 만족할 경우에만 실행
if(isPossible(idx +1, n, data))
backtracking(idx + 1, n, data);
visited[i] = false;
}
}
}
}
boolean isPossible(int idx, int n, String[] data) {
for(int i=0; i<n; i++) {
char[] condition = data[i].toCharArray();
int from = -1, to = -1;
for(int j=0; j<idx; j++) {
if(position[j] == condition[0]) from = j;
if(position[j] == condition[2]) to = j;
}
if(from < 0 || to < 0)
return true;
// 프렌즈와의 간격
int gap = Math.abs(from - to) -1;
int len = condition[4] - '0';
switch(condition[3]) {
case '=' :
if(gap != len) return false;
break;
case '>' :
if(gap <= len) return false;
break;
case '<' :
if(gap >= len) return false;
break;
}
}
return true;
}
}
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 [3차] 방금그곡 JAVA (0) | 2020.05.08 |
---|---|
프로그래머스 문자열 단축 JAVA (0) | 2020.05.06 |
프로그래머스 괄호 변환 JAVA (0) | 2020.05.04 |
프로그래머스 카카오프렌즈 컬러링북 JAVA (DFS) (0) | 2020.05.04 |
프로그래머스 멀쩡한 사각형 JAVA (0) | 2020.05.02 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday