알고리즘
프로그래머스 단체사진 찍기
오래먹는오레오
2021. 1. 2. 12:30
단체사진 찍기 : programmers.co.kr/learn/courses/30/lessons/1835
코딩테스트 연습 - 단체사진 찍기
단체사진 찍기 가을을 맞아 카카오프렌즈는 단체로 소풍을 떠났다. 즐거운 시간을 보내고 마지막에 단체사진을 찍기 위해 카메라 앞에 일렬로 나란히 섰다. 그런데 각자가 원하는 배치가 모두
programmers.co.kr
해당 문제를 풀때 무슨방법이 없나 너무 고민을 했다.
그리고 택한게 그냥 완탐해서 조건을 만족시키는 것만 세주는 방법;;
완탐을 해도 8명밖에 되지않아서 총가짓수가 40320개가나오며 최대 100개의 조건문이 있다고하면 4032000개가 되서 물론 크지만 그리오래 걸리지(?) 않았다..
import java.util.*;
class Solution {
public char[] friends = { 'A', 'C', 'M', 'J', 'F', 'N', 'R', 'T' };
public boolean[] visit = new boolean[8];
public String[] conditions = null;
public int solution(int n, String[] data) {
int answer = 0;
conditions = data;
answer = MakeCases(0, new char[8]);
return answer;
}
private int MakeCases(int count, char[] line) {
int result = 0;
if (count == 8) {
if (CheckCase(line)) {
return 1;
}
return 0;
}
for (int i = 0; i < 8; i++) {
if (visit[i]) {
continue;
}
visit[i] = true;
line[count] = friends[i];
result += MakeCases(count + 1, line);
visit[i] = false;
}
return result;
}
private boolean CheckCase(char[] line) {
String cmpStr = new String(line);
for (String s : conditions) {
char c1 = s.charAt(0);
char c2 = s.charAt(2);
char c3 = s.charAt(3);
int c4 = Integer.parseInt(s.charAt(4) + "");
int idx1 = cmpStr.indexOf(c1 + "");
int idx2 = cmpStr.indexOf(c2 + "");
switch (c3) {
case '<':
if (Math.abs(idx1 - idx2) < (c4 + 1)) {
break;
} else {
return false;
}
case '>':
if (Math.abs(idx1 - idx2) > (c4 + 1)) {
break;
} else {
return false;
}
case '=':
if (Math.abs(idx1 - idx2) == (c4 + 1)) {
break;
} else {
return false;
}
}
}
return true;
}
}
해당 문제는 문자열 처리 + 완탐으로 풀기에 좋은 문제였던거 같다.