본문 바로가기

[IT] 코딩테스트/[문제 및 풀이] 프로그래머스

[프로그래머스] 성격 유형 검사하기 / 자바(Java)

728x90

문제

https://school.programmers.co.kr/learn/courses/30/lessons/118666

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


해설

설문조사에 해당하는 성격유형이 어떤것일지 알 수 없어서 Map을 사용해 각 성격유형별 점수를 Map에 넣고 마지막에 성격유형을 출력시 맞는 점수를 출력하도록 하면 되는 비교적 간단한 자료구조를 이용한 구현문제였습니다.

 

추가로 map이 아닌 배열로만 해결하는 풀이도 깔끔해보여 가져왔습니다.

 

주의점

  • 유형점수가 동일시 사전 순으로 출력

코드

import java.util.*;
class Solution {
    Map<Character, Integer> m;
    public String solution(String[] survey, int[] choices) {
        String answer = "";
        m = new HashMap<>();
        
        // 1. 각 지표의 결과별로 m에 유형별 점수 입력
        for(int i=0;i<survey.length;i++){
            if(choices[i]<4){
                addScore(survey[i].charAt(0),4-choices[i]);
            }else if(choices[i]>4){
                addScore(survey[i].charAt(1),choices[i]-4);
            }
        }
        
        //2. 유형순서별로 정답 출력(점수동일시 사전순 출력)
        StringBuilder sb = new StringBuilder();
        sb.append(getType('R','T')).append(getType('C','F')).append(getType('J','M')).append(getType('A','N'));
        answer = sb.toString();
        return answer;
    }
    
    public void addScore(char a, int score){
        m.put(a,m.getOrDefault(a,0)+score);

    }
    
    public char getType(char a, char b){
        if(m.getOrDefault(a,0)==m.getOrDefault(b,0)) return (a-b>0 ? b : a);

        if(m.getOrDefault(a,0)>m.getOrDefault(b,0)) return a;
        return b;
    }
}

 

다른 풀이

import java.util.HashMap;

class Solution {
    public String solution(String[] survey, int[] choices) {
        String answer = "";
        char [][] type = {{'R', 'T'}, {'C', 'F'}, {'J', 'M'}, {'A', 'N'}};
        int [] score = {0, 3, 2, 1, 0, 1, 2, 3};
        HashMap<Character, Integer> point = new HashMap<Character, Integer>();

        // 점수 기록할 배열 초기화 
        for (char[] t : type) {
            point.put(t[0], 0);
            point.put(t[1], 0);
        }

        // 점수 기록 
        for (int idx = 0; idx < choices.length; idx++){
            if(choices[idx] > 4){
                point.put(survey[idx].charAt(1), point.get(survey[idx].charAt(1)) + score[choices[idx]]);
            } else {
                point.put(survey[idx].charAt(0), point.get(survey[idx].charAt(0)) + score[choices[idx]]);
            }
        }

        // 지표 별 점수 비교 후 유형 기입
        for (char[] t : type) {
            answer += (point.get(t[1]) <= point.get(t[0])) ? t[0] : t[1];
        }

        return answer;
    }
}
728x90