728x90

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

 

프로그래머스

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

programmers.co.kr


# 문제요약

한 지표당 두가지 경우의 성격 유형에 대한 점수를 채점한다.

선택한 항목에 따른 가중치 점수를 부여하여, 점수가 높은 성격 유형 알파벳 4개를 붙여 결과를 반환한다.

성격 유형
1번 지표 라이언형(R), 튜브형(T)
2번 지표 콘형(C), 프로도형(F)
3번 지표 제이지형(J), 무지형(M)
4번 지표 어피치형(A), 네오형(N)

선택 항목(가중치=실제점수)
1 매우 비동의 (3)
2 비동의 (2)
3 약간 비동의 (1)
4 모르겠음 (0)
5 약간 동의 (1)
6 동의 (2)
7 매우 동의 (3)

 

# 풀이

파이썬의 사전 형식으로 성격 유형을 담는다.

이는 지표의 유형을 랜덤으로 받기 때문에 성격 알파벳을 인덱스 형식으로 빨리 찾아 점수를 부여하기 위해서다.

 

여기서 점수와 관련해서 복잡한 계산식을 써버렸는데, 이는 한 줄로 가중치를 내고 싶어서다.

    선택 번호 => [1,2,3,4,5,6,7] 이라면

    해당 점수 => [3,2,1,0,1,2,3] 으로 점수를 주기 위해서다.

더 자세한 설명을 하자면,

( ) + ( * ) + ( * ) 식에서 첫번쨰와 두번째는 1,2,3번을 3,2,1로 만들기 위해서 / 세번째는 5,6,7을 1,2,3 으로 만드는 식이다.

더보기

3 / 1 = 3  + ( 3 % 1 = 0 * 3 / 1 = 3 ) + (1 % 4 = 1 * 1 / 4 = 0) = 3 + 0 + 0 = 3

3 / 2 = 1  + ( 3 % 2 = 1 * 3 / 2 = 1 ) + (2 % 4 = 2 * 2 / 4 = 0) = 1 + 1 + 0 = 2

3 / 3 = 1  + ( 3 % 3 = 0 * 3 / 3 = 1 ) + (3 % 4 = 3 * 3 / 4 = 0) = 1 + 0 + 0 = 1

3 / 5 = 0  + ( 3 % 5 = 3 * 3 / 5 = 0 ) + (5 % 4 = 1 * 5 / 4 = 1) = 0 + 0 + 1 = 1

3 / 6 = 0  + ( 3 % 6 = 3 * 3 / 6 = 0 ) + (6 % 4 = 2 * 6 / 4 = 1) = 0 + 0 + 2 = 2

3 / 7 = 0  + ( 3 % 7 = 3 * 3 / 7 = 0 ) + (7 % 4 = 3 * 7 / 4 = 1) = 0 + 0 + 3 = 3

 

최종적으로 두가지 유형 중, 점수가 크거나 같으면 왼쪽 유형(사전순에 의해)을 선택하면 된다.

 

#코드

import java.util.HashMap;
import java.util.Map;

class Solution {
    public String solution(String[] survey, int[] choices) {
        Map<String, Integer> score = new HashMap<String, Integer>();
        String[] category = new String[]{"R", "T", "C", "F", "J", "M", "A", "N"};

        // [1] dictionary 형태로 데이터 초기화
        for(String s : category){
            score.put(s, 0);
        }

        // [2] 성격 점수 넣기
        for(int i=0; i<survey.length; i++){
            String[] datas = survey[i].split("");
            int choice = choices[i]; // 선택한 점수
            if(choice/4 == 1 && choice%4 == 0) continue; // 잘모르겠음이면, 넘어감

            String idx = datas[choice/4]; // 123은 datas[0], 567은 datas[1]
            Integer s = 3/choice + (3%choice)*(3/choice)+(choice%4)*(choice/4);
            score.put(idx, score.get(idx) + s); // 해당 성격에 점수 증가
        }

        // [3] 성격 결과
        String result = "";
        for(int i=0; i< category.length; i=i+2){
            String left = category[i];
            String right = category[i+1];

            result += score.get(left) >= score.get(right) ? left : right;
        }
        
        return result;
    }
}
728x90

+ Recent posts