알고리즘문제풀이/프로그래머스
[프로그래머스]단체사진찍기_Java
초보개발자..
2022. 3. 19. 10:30
--문제--
https://programmers.co.kr/learn/courses/30/lessons/1835
코딩테스트 연습 - 단체사진 찍기
단체사진 찍기 가을을 맞아 카카오프렌즈는 단체로 소풍을 떠났다. 즐거운 시간을 보내고 마지막에 단체사진을 찍기 위해 카메라 앞에 일렬로 나란히 섰다. 그런데 각자가 원하는 배치가 모두
programmers.co.kr
--문제 접근--
문제를 읽고 처음 들었던 생각은 순서를 고려하여 단체사진을 찍는다고 생각하여 순열을 사용해야겠다고 생각하였습니다.
순열을 만든 이후에 검증을 하는 과정은 카카오 프렌즈들이 어디 있는지 확인하여 조건에 부합하는 과정이 필요하였습니다.
이 과정은 순열을 다 만든 이후에 한번 더 탐색하여 카카오 프렌즈의 위치를 찾는 것보다 각 카카오프렌즈들의 위치를 계속 기억하는 것이 더 괜찮을 것 같다고 생각하여. 별도의 변수로 지정하여 풀이를 진행하였습니다.
--코드--
package Level2;
public class 단체사진찍기 {
public static void main(String[] args) {
int n=2;
String[] data= {"N~F=0", "R~T>2"};
System.out.println(solution(n,data));
}
static char[] Friends= {'A','C','F','J','M','N','R','T'};
static int A_index,C_index,F_index,J_index,M_index,N_index,R_index,T_index;
static boolean[] Check;
static int answer;
private static int solution(int n, String[] data) {
answer=0;
Check=new boolean[8];
MakePer(0,n,data);
return answer;
}
private static void MakePer(int idx, int n,String[] data) {
if(idx==8) {
for(int i=0;i<n;i++) {
String condition= data[i];
int firstFriend=Value(condition.charAt(0));
int secondFriend=Value(condition.charAt(2));
if(!validation(firstFriend,secondFriend,condition.charAt(3),condition.charAt(4)-'0'))return;
}
answer++;
return ;
}
for(int i=0;i<8;i++) {
if(Check[i])continue;
Convert(idx,i);
Check[i]=true;
MakePer(idx+1,n,data);
Check[i]=false;
}
}
//올바르게 위치해 있는지 검증하는 과정
private static boolean validation(int x,int y,char K,int stand) {
int result=Math.abs(x-y)-1;
switch (K) {
case '<':
if(result<stand)return true;
return false;
case '>':
if(result>stand)return true;
return false;
case '=':
if(result==stand)return true;
return false;
default:
break;
}
return false;
}
//순열을 만드는 과정 배열은 별도로 만들지 않은 이유는 그 위치를 알아야하기 때문에 위치를 저장하면 좋겠다고 생각
//하지만 Stirng클래스에서 indexof를 사용하면 더 편했다고 생각한다..
private static void Convert(int idx, int i) {
switch (idx) {
case 0:
A_index=i;
break;
case 1:
C_index=i;
break;
case 2:
F_index=i;
break;
case 3:
J_index=i;
break;
case 4:
M_index=i;
break;
case 5:
N_index=i;
break;
case 6:
R_index=i;
break;
case 7:
T_index=i;
break;
default:
break;
}
}
//각 카카오프렌즈 친구들의 위치를 알려주는 메소드
private static int Value(char x) {
switch (x) {
case 'A':
return A_index;
case 'C':
return C_index;
case 'F':
return F_index;
case 'J':
return J_index;
case 'M':
return M_index;
case 'N':
return N_index;
case 'R':
return R_index;
case 'T':
return T_index;
default:
break;
}
return 0;
}
}
하지만 다른 사람들의 풀이를 보며 들었던 생각은 Stirng 클래스의 index of를 활용하였다면 더 괜찮은 풀이가 나왔을 거라고 생각이 들었습니다..