알고리즘문제풀이/프로그래머스

[프로그래머스]단체사진찍기_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를 활용하였다면 더 괜찮은 풀이가 나왔을 거라고 생각이 들었습니다..