프로그래머스 : 성격 유형 검사하기

김아무개·2023년 3월 23일
0

프로그래머스

목록 보기
16/41

다른사람 코드

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

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

profile
Hello velog! 

0개의 댓글