프로그래머스 코딩 테스트 문제/lv2

프로래머스 Lv2 단체 사진 찍기 문제

lys4321 2026. 2. 24. 02:09
  • 프로래머스 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));
    }
}