Today
-
Yesterday
-
Total
-
  • 프로그래머스 : 성격 유형 검사하기
    코딩테스트 문제 풀이/프로그래머스 2023. 11. 21. 00:01

    다른사람 코드

    출처 : 프로그래머스 스쿨 - 다른사람 풀이 첫번째

    import java.util.HashMap;
    class Solution {
        public String solution(String[] survey, int[] choices) {
            String answer = "";
            
            char[][] arrChar = new char[][]{{'R', 'T'}, {'C', 'F'}, {'J', 'M'}, {'A', 'N'}};
            int[] points = new int[]{0, 3, 2, 1, 0, 1, 2, 3};
            HashMap<Character, Integer> tbl = new HashMap();
            
            for (char[] c: arrChar) {
                tbl.put(c[0], 0);
                tbl.put(c[1], 0);
            }
            
            for (int i = 0; i < choices.length; i++) {
                char type = (choices[i] > 4) ? survey[i].charAt(1) : survey[i].charAt(0);
    
                tbl.put(type, tbl.get(type) + points[choices[i]]);
            }
            
            for (char[] c: arrChar) {
                answer += tbl.get(c[0]) >= tbl.get(c[1]) ? c[0] : c[1];
            }
            return answer;
        }
    }

    이번에 가져온 다른 사람의 코드는 나에겐 배울 점이 많아보이는 코드였다. 이 코드를 해석해보면서 문제에 대해 어떻게 접근했는지 배워봐야겠다. 🤓

    1. 사용할 변수들 생성 & 초기화

    // 지표 2차 배열로 생성
    // ➡️ 각 점수가 매겨지는 지표를 char 타입으로 각각 배열에 담음
    char [][] type = {{'R', 'T'}, {'C', 'F'}, {'J', 'M'}, {'A', 'N'}};
    
    // choices 숫자 별 점수를 배열로 등록
    // ➡️ choices가 1~7 이기 때문에 계산하기 편하게 인덱스 1~7까지 해당되는 점수로 저장
    int [] score = {0, 3, 2, 1, 0, 1, 2, 3};
    
    // 점수 기록할 배열 생성 : HashMap<Character, Integer> point
    // 점수 기록할 배열 초기화 : 모든 하나의 타입을 key로 하여 value를 0으로 초기화
    HashMap<Character, Integer> point = new HashMap<Character, Integer>();
    for (char[] t : type) {
        point.put(t[0], 0);
        point.put(t[1], 0);
    }

    2. 점수 기록

    // 점수를 별도로 계산할 필요 없이, 위에서 만들어둔 score배열을 바로 가져다가 사용할 수 있음. 
    // 단, 이때 점수를 등록할 타입이 0점이 아닐 수 있기때문에 get한 값과 더해서 저장해줌
    for (int idx = 0; idx < choices.length; idx++){
        if(choices[idx] > 4){
            // 키는 choices가 4보다 크면 뒤쪽 타입에 대한 값이기 때문에 charAt(1)만 있으면 됨
            point.put(survey[idx].charAt(1), point.get(survey[idx].charAt(1)) + score[choices[idx]]);
        } else {
            // 키는 choices가 4보다 작으면 앞쪽 타입에 대한 값이기 때문에 charAt(0)만 있으면 됨
            point.put(survey[idx].charAt(0), point.get(survey[idx].charAt(0)) + score[choices[idx]]);
        }
    }

    3. 지표 별 점수 비교 후 유형 기입

    // point에서 t[1]과 t[2]의 값을 비교해서 더 큰 값이 나오는 t를 answer에 기록
    for (char[] t : type) {
        answer += (point.get(t[1]) <= point.get(t[0])) ? t[0] : t[1];
    }

    내 코드

    import java.util.*;
    class Solution {
        public String solution(String[] survey, int[] choices) {
            String answer = "";
            String[] arrS = new String[]{"RT","CF","JM","AN"};
            HashMap<String, Integer[]> table = new HashMap();
            for (String s: arrS) {
                table.put(s, new Integer[]{0,0});
            }
    
            int idx = 0;
            Integer[] temp;
            for (String s: survey) {
                if (choices[idx] != 4) {
                    if (s.contains("R"))            temp = table.get("RT");
                    else if (s.contains("C"))       temp = table.get("CF");
                    else if (s.contains("J"))       temp = table.get("JM");
                    else                            temp = table.get("AN");
    
                    int idxType;
                    if (s.charAt(0) == 'R' || s.charAt(0) == 'C' || 
                    	s.charAt(0) == 'J' || s.charAt(0) == 'A' ) {
                        idxType = choices[idx] > 4 ? 1 : 0;
                    } else {
                        idxType = choices[idx] > 4 ? 0 : 1;
                    }
    
                    if (choices[idx] > 4) {
                        temp[idxType] += choices[idx] - 4;
                    } else {
                        temp[idxType] += 4 - choices[idx];
                    }
                    table.put(s, temp);
                } 
                
                idx++;
            }
    
            for (String s : arrS) {
                temp = table.get(s);
                if (temp[0] >= temp[1]) answer += s.charAt(0);
                else answer += s.charAt(1);
            }
            return answer;
        }
    }

    흐으으으으음..

    🔻접근 방식을 계산했던 메모 첨부..

    이렇게 긴 문제는 처음 풀어봐서 문제 읽으면서 깜짝 놀랐다. 문제 풀면서 메모를 시작한건 예전에도 몇번 해보긴 했지만 즉흥적?으로 필요에 의해서 했던거고 계획적인 메모와 어떻게 메모할지 생각해보고 한적이 없었다. 이번 문제부터는 꼭 메모하면서 생각을 정리하고 코드의 풀이 방향을 함께 메모하면서 풀어보려고 했는데 생각보다 어려웠다..!!!!

    그래도 메모를 해놓고 생각을 정리한 후 코드를 작성했더니, 메모하지 않고 키보드부터 두드릴때와는 다르게 길을 잃지 않고 두세번만에 통과하는 코드를 작성할 수 있었다. (그래도 놓치는 부분이 있었다는것.. 하하!;) 어제까지만해도 정말 간단한 문제가 아니고서야 최소 8번 정도는 도전했어야 통과하는 수준이었는데.. 메모를 잘 사용해봐야겠다는 생각이 들었다!

    코드 작성하면서 새롭게 깨닫게 된 부분

    int[] a = new int[2]; 
    // 이렇게 배열을 생성하면 배열의 자료형이 기본자료형(int)이라서 int의 기본값인 0으로 초기화가 되지만,
    
    Integer[] b = new Integer[2]; 
    // 이렇게 생성하게되면 참조자료형타입의 배열이 되기 때문에, 기본 값이 null로 초기화 된다.

    처음 풀어본 날 : 23.03.23 다시 풀어본 날 : 23.03.25,26, 30

Designed by Tistory / Custom by 얼거스