[코딩테스트] 성격 유형 검사하기 | 프로그래머스

Bluewave·2024년 6월 11일

코테공부_java

목록 보기
39/99
post-thumbnail

문제

💀 문제 바로가기

문제레벨정답률
성격 유형 검사하기Lv.151%

My Code

import java.util.*;

class Solution {
    public String solution(String[] survey, int[] choices) {
        HashMap<Character, Integer> grades = new HashMap<>();
        String result = "";
        
        grades.put('R', 0);
        grades.put('T', 0);
        grades.put('F', 0);
        grades.put('C', 0);
        grades.put('M', 0);
        grades.put('J', 0);
        grades.put('A', 0);
        grades.put('N', 0);
        
        for(int i = 0; i<survey.length; i++){
            char firstUnit = survey[i].charAt(0);
            char secondUnit = survey[i].charAt(1);
            int currentGrade1 =  grades.getOrDefault(firstUnit, 0);
            int currentGrade2 =  grades.getOrDefault(secondUnit, 0);
            
            switch(choices[i]){
                case 1:
                    grades.put(firstUnit, currentGrade1+3);
                    break;
                case 2:
                    grades.put(firstUnit, currentGrade1+2);
                    break;
                case 3:
                    grades.put(firstUnit, currentGrade1+1);
                    break;
                case 5:
                    grades.put(secondUnit, currentGrade2+1);
                    break;
                case 6:
                    grades.put(secondUnit, currentGrade2+2);
                    break;
                case 7:
                    grades.put(secondUnit, currentGrade2+3);
                    break;
            }
            
        }
        
        
        if(grades.get('R') >= grades.get('T')){
            result += "R";
        } else{
            result += "T";
        }
        
        if(grades.get('C') >= grades.get('F')){
            result += "C";
        } else{
            result += "F";
        }
        
        if(grades.get('J') >= grades.get('M')){
            result += "J";
        } else{
            result += "M";
        }
        
        if(grades.get('A') >= grades.get('N')){
            result += "A";
        } else{
            result += "N";
        }
        
        return result;
    }
    
}
  1. 키-값 쌍으로 저장이 가능한 HashMap을 통해 모든 성격 유형을 키로 넣고 값을 0으로 초기화

  2. 각 survey의 첫 유형과 두 번째 유형을 각각 변수로 저장하고, 해당 변수의 현재 점수 역시 변수로 각각 저장

  3. choices 점수에 따라서 해시맵의 점수 update

  4. 각 유형별로 높은 점수를 기준으로 result에 추가
    같으면 사전 순으로 판별


Optimized Code

import java.util.HashMap;

public class Solution {
    public String solution(String[] survey, int[] choices) {
        HashMap<Character, Integer> grades = new HashMap<>();
        grades.put('R', 0);
        grades.put('T', 0);
        grades.put('F', 0);
        grades.put('C', 0);
        grades.put('M', 0);
        grades.put('J', 0);
        grades.put('A', 0);
        grades.put('N', 0);

        for (int i = 0; i < survey.length; i++) {
            char firstUnit = survey[i].charAt(0);
            char secondUnit = survey[i].charAt(1);

            if (choices[i] >= 1 && choices[i] <= 3) {
                grades.put(firstUnit, grades.get(firstUnit) + 4 - choices[i]);
            }
            if (choices[i] >= 5 && choices[i] <= 7) {
                grades.put(secondUnit, grades.get(secondUnit) + choices[i] - 4);
            }
        }

        StringBuilder result = new StringBuilder();
        result.append(getBetterUnit(grades, 'R', 'T'));
        result.append(getBetterUnit(grades, 'C', 'F'));
        result.append(getBetterUnit(grades, 'J', 'M'));
        result.append(getBetterUnit(grades, 'A', 'N'));

        return result.toString();
    }

    private char getBetterUnit(HashMap<Character, Integer> grades, char unit1, char unit2) {
        return grades.get(unit1) >= grades.get(unit2) ? unit1 : unit2;
    }
}
  • switch-case 문 대신 if문과 수식으로 간결하게 점수 update
  • 따로 함수를 만들고, 간결한 if-else 문을 통해 보다 쉽게 점수 산정 부분 구현

반복을 충분히 피할 수 있는 코드였음에도 그렇게 구현하지 못한게 아쉬운 문제였다.
마지막 점수 산정 부분은 솔직히 함수로 만들려고 했으나 귀찮아서 놔둔 것도 맞긴 한데, 솔직히 점수 update하는 부분에서 연산을 통해 쉽게 추가할 점수를 계산하는 건 생각하지 못했다.
반복을 줄여 간결한 코드를 작성하는 것도 신경써서 문제를 풀어야겠다.

profile
Developer's Logbook

0개의 댓글