[프로그래머스,Level 2] 단체사진 찍기 (JAVA 구현)

2021. 2. 3. 15:27·CodingTest/프로그래머스(Programmers)
반응형

 

- 첫 풀이 및 정답풀이

  이 문제는 주어진 요소들(카카오프렌즈)을 조건에 맞게 배치할 수 있는지 확인하는 문제이다. 즉, 모든 경우의 수를 완전 탐색으로 순회하며 조건에 맞는 경우를 카운트해주면 된다. 모든 경우의 수를 탐색하는 경우는 재귀 메서드를 이용하면 구할 수 있고 주어진 조건 문자열을 파싱 하여 알맞게 작성해주면 된다.

 

  단, 이 문제는 주의해야 할 점이 전역변수로 카운트했다면 solution 메서드 안에서 초기화를 해주어야 통과가 가능하다. 이유는 모르겠다.

import java.util.HashMap;


class Solution {
    // 1. 인덱스 방문 여부 체크 배열.
    static boolean check[] = new boolean[8];
    // 2. 카카오 프렌즈 0~7인덱스까지 각 알파벳을 매칭.
    static char friends[] = {'A','C','F','J','M','N','R','T'};
    
    static int answer;
    
    // 16. 주어진 조건 data에 맞는지 검사하는 메소드
    public static boolean isPossible(StringBuilder sb,String[] data){
        // 17. 조건 배열 data를 탐색.
        for(int i = 0 ; i<data.length;i++){
            // 18. 조건의 0번 인덱스와 2번 인덱스는 조건을 제시한 프렌즈, 상대 프렌즈이므로, 그 사이 거리를 구한다.
            // 단, 둘 사이의 프렌즈 수를 구해야 하기 때문에 최종 값에 -1.
            int gap = Math.abs(sb.indexOf(String.valueOf(data[i].charAt(0))) - sb.indexOf(String.valueOf(data[i].charAt(2))))-1;
            // 19. 조건의 4번 인덱스는 주어진 정수값.
            int condition_gap = data[i].charAt(4) - '0';
                        
            // 20. 조건의 3번 인덱스는 대소비교 문자이므로 이에 따라 분기처리.
            switch(data[i].charAt(3)){
                    // 21. 각 경우에 따라 조건에 맞지 않다면 false.
                case '=' :
                    if(gap != condition_gap) return false;
                    break;
                    
                case '>' :
                    if(gap <= condition_gap) return false;
                    break;
                    
                case '<':
                    if(gap >= condition_gap) return false;
                    break;                    
            }
            
        }
        
        // 22. 나머지는 true.
        return true;
    }
    
    // 6. dfs 메소드(인덱스, 경우의 수 순열을 저장할 객체, 조건 메소드에 전달 할 data 배열)
    public static void dfs(int idx,StringBuilder sb, String[] data){
        // 7. idx == 마지막 프렌즈인 경우 조건을 검사 및 종료.
        if(idx == friends.length){
            // 8. 조건 검사 메소드 호출.
            if(isPossible(sb,data)){
                answer++;
            } 
            return;
        }
        
        // 9. 전역변수로 선언한 문자형 배열을 탐색.
        for(int i = 0 ; i < friends.length;i++){
            // 10. 방문한 경우 패스.
            if(check[i]) continue;
            // 11. 방문처리 후,
            check[i] = true;
            // 12. 프렌즈에 해당하는 문자를 StringBuilder 객체에 붙인다. 
            sb.append(String.valueOf(friends[i]));
            // 13. 인덱스 증가 및 StringBuilder와 함께 재귀호출.
            dfs(idx+1,sb,data);
            // 14. 방문처리 해제.
            check[i] = false;
            // 15. 위에 붙인 문자를 다시 제거.
            sb.delete(idx,friends.length);           
        }    
    }
    
    public int solution(int n, String[] data) {
        // 3. 모든 경우의 수를 만들 StringBuilder 객체.
        StringBuilder sb = new StringBuilder();    
        // 4. 초기화 해주어야 통과가 된다.
        answer = 0;
        // 5. dfs메소드 호출.
        dfs(0,sb,data);      
        
        return answer;
    }
}

 

저작자표시 (새창열림)
'CodingTest/프로그래머스(Programmers)' 카테고리의 다른 글
  • [프로그래머스,Level 2] 튜플 (JAVA 구현)
  • [프로그래머스,Level 2] 괄호 변환 (JAVA 구현)
  • [프로그래머스,Level 2] 메뉴 리뉴얼 (JAVA 구현)
  • [프로그래머스,Level 2] N개의 최소공배수 (JAVA 구현)
뜸부깅
뜸부깅
코딩에 대한 여러 개인적인 생각을 정리하고 공부를 하는 공간입니다!!
  • 뜸부깅
    코오오딩
    뜸부깅
  • 전체
    오늘
    어제
    • Note (429)
      • Skill (31)
        • Java & Spring (9)
        • Javascript & HTML & CSS (0)
        • React (0)
        • Next.js (22)
      • CodingTest (389)
        • 백준 온라인 저지(BOJ) (140)
        • 프로그래머스(Programmers) (79)
        • LeetCode (170)
      • Algorithm & Data Structure (6)
      • [Project] 포트폴리오 (3)
        • Front end (3)
        • Back end (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    medium
    프로그래머스
    boj1427
    component-scan
    백준7576
    TypeScript
    알고리즘
    백준
    Easy
    next 14
    자바
    BOJ
    meidum
    Java
    boj2108
    leetcode 2236
    백준1427
    백준2751
    백준1260
    백준7576자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
뜸부깅
[프로그래머스,Level 2] 단체사진 찍기 (JAVA 구현)
상단으로

티스토리툴바