요르딩딩

프로그머스 : 단체 사진 (순열) 본문

카테고리 없음

프로그머스 : 단체 사진 (순열)

요르딩딩 2022. 4. 11. 14:20
728x90
반응형

지금은 다양한 실전 감각을 위해 프로그래머스를 통해 문제를 풀어보고 있다.

 

일단 어려운것을 먼저 접하면, 다른 문제는 쉽게 느껴지기를 기대하며, 카카오코딩테스트를 풀어보는중이다.

 

이번 문제는 순열에 관련된 문제이다. 순열에 관련된 문제를 처음 접해보니 구현하기에 쉽지 않았다.

 

그리하여 순열관련 로직을 검색하여, 로직을 구현해 보았다.

 

참고 : https://bcp0109.tistory.com/14?category=848939

 

위의 블로그에 잘 정리된 내용을 참고하였다.

 

조합과 순열은 아직 어색하지만 많은 문제를 풀어보면 익숙해 지리라 믿는다. 모두 화이팅 

import java.util.*;

class Solution {
	static String[] output;
	static boolean[] visited;
	static int tot;

	public int solution(int n, String[] data) {
		int answer = 0;

		//초기화
		String[] arr = { "A", "C", "F", "J", "M", "N", "R", "T" };
		visited = new boolean[8];
		output = new String[8];
		tot = 0;

		perm(arr, output, visited, 0, arr.length, 8, data); // 순열 n개중에 8개 순서있게 선택하기

		answer = tot;
		return answer;
	}

	static void perm(String[] arr, String[] output, boolean[] visited, int depth, int n, int r, String[] data) {
		if (depth == r) {
			print(output, r, data);
			return;
		}

		for (int i = 0; i < n; i++) {
			if (visited[i] != true) { //방문안한것 중에서
				visited[i] = true;
				output[depth] = arr[i]; //선택한 문자 추가
				perm(arr, output, visited, depth + 1, n, r, data); // 다음 depth로 이동
				visited[i] = false;
			}
		}
	}

	public static void print(String[] arr, int n, String[] data) {
		boolean[] checkIs = new boolean[data.length];

		for (int j = 0; j < data.length; j++) { //조건별
			String first  = data[j].charAt(0) + "";
			String second = data[j].charAt(2) + "";
			String is     = data[j].charAt(3) + "";
			String isValue = data[j].charAt(4) + "";
			int isValueInt = Integer.parseInt(isValue);

			int firstIndex = -1;
			int secondIndex = -1;

			for (int i = 0; i < n; i++) { //문자별 
				if (first.equals(arr[i])) {
					firstIndex = i;
				} else if (second.equals(arr[i])) {
					secondIndex = i;
				}

				if (firstIndex != -1 && secondIndex != -1) {
					int gab = Math.abs(firstIndex - secondIndex);
					if (is.equals("=")) {
						if (isValueInt == gab - 1) { // 조건이 0인경우 인덱스 간의 차이는 1이다. 그러므로 -1을 해줘야한다.
							checkIs[j] = true;
						}
					} else if (is.equals(">")) {
						if (gab - 1 > isValueInt) { 
							checkIs[j] = true;
						}
					} else if (is.equals("<")) {
						if (gab - 1 < isValueInt) {
							checkIs[j] = true;
						}
					}
				}
				
				if(j >0 && checkIs[j-1] == false) { //이미 이전 조건이 합당하지 않다면 끝내기
					return;
				}
			}
		}

		boolean check = true;
		for (int i = 0; i < checkIs.length; i++) { //여러개의 조건이 모두 합당한지
			if (checkIs[i] == false) {
				check = false;
			}
		}

		if (check == true) { //모든 조건에 합당했다면 카운트 증가
			tot++;
		}
	}
}
728x90
반응형
Comments