- 프로래머스 Lv2 단체 사진 찍기 문제
- 해당 문제의 난이도 상승 원인
- 재귀함수 이용법에 대한 미숙함과 for를 이용한 반복문 처리법 고집 및 문제를 해결하는 순환 구조를 잘 못 이해하여 난이도가 상승
- 해당 문제를 해결한 방법
- 재귀함수를 이용한 방식을 사용
- 이전 방식에선 사이 거리가 제일 큰 것을 기준으로 점점 작은 것들을 넣는 마트료시카 방식을 사용하려 했으나 비효율적인 것을 느껴 다른 이들의 코드를 조사하여 해당 문제에 대한 순환 구조를 이해하고 적용
- 처음 방식에서 변경한 방식
- 처음
- 사이 거리가 제일 큰 것을 기준으로 점점 작은 것들을 넣는 마트료시카 방식을 사용
- 변경
- 결국 8명을 정렬하는 것은 ""로부터 시작된 것을 인지하고 한 경우에 대해 무수히 많은 갈림길이 나온단 것을 알아내 일종의 트리 구조로 진행이 되게끔 재귀함수를 작성하여 문제 해결
- 문제의 핵심
- 보통 이런 류의 문제들은 제일 큰 것을 기준으로 하여 문제를 해결하게 끔 유도하지만 이 문제는 그것이 아닌, 결국 전체 길이는 8이라는 것이라는 한계를 두어 시작점을 ""로 설정해 경우의 수들을 알아내게끔 함
- 이 문제의 목적
- 재귀함수 사용법을 숙지하도록 문제 구성
- 순환에는 for, while 같은 반복문만 있다는 관념타파
- 한계점이 있는 순환에 대해 시작점을 설정할 수 있도록 학습
- 경우의 수가 아닌, '구조'를 이해하도록 유도
package TakeGroupPhoto;
// 굳이 data를 전처리하여 사용할 필요없음
// 이 솔루션 함수 하나만으로 처리할 필요가 없음
// 반복문만을 고집하여 순환을 처리할 필요가 없음
// 순환을 하려면 반복문만이 유일한 정답이 아님
// -----------------------
// ""으로부터 시작하여 모든 경우의 수를 순환
// 순환은 재귀함수를 이용
// |- AB
// |- AC
// |- AD
// A---
// |- AE
//. ....
// |- BA
// |- BC
// |- BD
// B---
// |- BE
// 의 구조처럼 이용
// => 저 많은 경우의 수도 ""으로부터시작
class TakeGroupPhoto {
char[] frd = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
boolean[] line;
int answer;
public int solution(int n, String[] data) {
String orderBy = "";
line = new boolean[8];
answer = 0;
ordering(orderBy, data);
return answer;
}
public void ordering(String curr, String[] data){
if(curr.length() == 8){
if(check(curr, data)) answer++;
return;
}
for(int i = 0; i < 8; i++){
if(!line[i]){
line[i] = true;
ordering(curr + frd[i], data);
line[i] = false;
}
}
}
public boolean check(String curr, String[] data){
for(String d : data){
int res = curr.indexOf(d.charAt(0));
int req = curr.indexOf(d.charAt(2));
char oper = d.charAt(3);
int len = d.charAt(4) - '0';
int dist = Math.abs(res - req) - 1;
if(oper == '>'){
if(len >= dist) return false;
}
else if(oper == '<'){
if(len <= dist) return false;
}
else if(oper == '='){
if(dist != len) return false;
}
}
return true;
}
public static void main(String[] args) {
int n = 2;
String[] data = {"N~F=0", "R~T>2"};
TakeGroupPhoto gp = new TakeGroupPhoto();
System.out.println("결과 : " + gp.solution(n, data));
}
}