자료구조&알고리즘/프로그래머스

프로그래머스 - 성격 유형 검사하기 (JAVA)

yong_ღ'ᴗ'ღ 2023. 9. 16. 04:21

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

 

프로그래머스

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

programmers.co.kr

 

문제)

MBIT의 EI, NS, FT, JP 처럼 성격유형 RT, CF, JM, AN 있다.

7개의 선택지가 있고, 각각 1~7점이다.

"RT" 질문이 있을 때,  각 선택지별로 점수 배분은 아래와 같이 된다. 

1점 2점 3점 4점 5점 6점 7점
R+1 R+2 R+3 0 T+1 T+2 T+3

"TR" 질문 받았을 때는

1점 2점 3점 4점 5점 6점 7점
T+1 T+2 T+3 0 R+1 R+2 R+3

검사 끝나고, 성격 유형 중 점수 큰 걸 선택

만약 성격 유형 점수가 같다면, 사전 순으로 빠른 걸 선택

 

접근 방식)

1) HashMap<알파벳, 점수> 만들어서, 각 유형별로 0점으로 초기화 해둔다.

2) survey[] 배열만큼 반복문 돌면서, 각 유형별 점수 UPDATE 해준다.

    2-1) choices[i] - 4 의 결과가 (4를 선택하면 0이므로 4를 기준으로 성격유형이 나뉘므로)

           음수면 → survey 중 왼쪽 알파벳 선택 (ex. "RT" 중 R)

           양수면 → survey 중 오른쪽 알파벳 선택 (ex. "RT" 중 T)

    2-2) 선택한 알파벳의 점수를 map.put()을 사용해서 update 해준다.

            점수는 음수인 경우가 있으니, Math.abs() 를 사용해서 절댓값 처리해준다.

3) RT, DF, JM, AN 중 점수 높은 거 선택해서 StringBuilder에 추가해주고 결과 return 

            

import java.util.HashMap;
class Solution {
    public String solution(String[] survey, int[] choices) {
    
        HashMap<Character, Integer> map = new HashMap<>();
        map.put('R', 0);    map.put('T', 0);
        map.put('C', 0);    map.put('F', 0);
        map.put('J', 0);    map.put('M', 0);
        map.put('A', 0);    map.put('N', 0);
        
        for (int i = 0; i < survey.length; i++) {
            int score = choices[i] - 4;
            if (score == 0) continue;
            
            char type = ' ';
            if (score < 0)
                type = survey[i].charAt(0);
            else
                type = survey[i].charAt(1);
            
            map.put(type, map.get(type) + Math.abs(score));
        }
        
        // RT CF JM AN
        StringBuilder result = new StringBuilder();
        result.append(map.get('R') >= map.get('T') ? 'R' : 'T')
              .append(map.get('C') >= map.get('F') ? 'C' : 'F')
              .append(map.get('J') >= map.get('M') ? 'J' : 'M')
              .append(map.get('A') >= map.get('N') ? 'A' : 'N');
        
        return result.toString();
    }
}