# 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/118666
# 문제요약
한 지표당 두가지 경우의 성격 유형에 대한 점수를 채점한다.
선택한 항목에 따른 가중치 점수를 부여하여, 점수가 높은 성격 유형 알파벳 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;
}
}
'algorithm > programmers' 카테고리의 다른 글
[programmers] 신규 아이디 추천(Java)_2021 KAKAO BLIND RECRUITMENT (1) | 2022.09.29 |
---|---|
[programmers] 신고 결과 받기(Java)_2022 KAKAO BLIND RECRUITMENT (0) | 2022.09.29 |
[programmers] [1차] 비밀지도(Java)_2018 KAKAO BLIND RECRUITMENT (0) | 2022.08.30 |
[programmers] 두 개 뽑아서 더하기(Java)_월간 코드 챌린지 시즌1 (0) | 2022.06.28 |
[programmers] 크레인 인형뽑기 게임(Java)_2019 카카오 개발자 겨울 인턴십 (0) | 2022.06.26 |