프로그래머스 programmers Level1 성격 유형 검사하기 - java 자바
[문제]
2022 KAKAO TECH INTERNSHIP
https://school.programmers.co.kr/learn/courses/30/lessons/118666
[풀이]
survey 배열에 주어진 성격유형에 질문에 choices 배열에 선택한 선택지에 따라 점수가 배분된다.
입출력 예 #1 에 따르면
survey[0] = AN , choices[0] = 5 이므로
왼쪽부터 5번째이므로 네오형(N) 의 점수가 1점 늘어난다.
즉, 점수 배치는 3, 2, 1, 0, 1, 2, 3 이며 0을 기준으로 왼쪽의 점수는 survey 배열 원소의 왼쪽(A)가 취득하게되며 오른쪽의 점수는 survey 배열 원소의 오른쪽(N)이 취득하게된다.
- 제한 사항 참고 : 1 ≤ choices 의 원소 ≤ 7
따라서 점수표를 배열로 생각해서 코드로 작성하면 다음과 같다.
Integer[] scores = {0, 3, 2, 1, 0, 1, 2, 3};
다음으로 해야할 일은 각 성격유형이 취득하는 점수를 취합해야한다.
문제에 주어진 지표는 다음과 같다.
1번 지표 | 라이언형(R), 튜브형(T) |
2번 지표 | 콘형(C), 프로도형(F) |
3번 지표 | 제이지형(J), 무지형(M) |
4번 지표 | 어피치형(A), 네오형(N) |
제한사항에 따르면, survey 의 값이 꼭 지표의 순서대로 RT, CF, JM, AN 만 있는 것이 아니다.
- 제한사항 참고 : survey 의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나입니다.
그래서 Map을 이용해서 저장하는 방법을 택했다.
key = 성격유형, value = 취득점수
Map<String, Integer> typeScore = new HashMap()<>;
맵을 생성하고, 맵의 getOrDefault() 메소드를 이용하여 점수를 얻을때마다 더해주었다.
점수를 모두 Map에 넣어준 후 지표에 따라 어떤 점수가 더 큰지 확인 후 answer 에 넣어주었다.
참고로 문제에 점수가 동점이면 사전순으로 빠른 성격 유형으로 판단한다고 되어있다.
- 문제 참고 : 단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.
이는 4가지 성격유형 타입을 아래와같이 미리 사전순으로 배열에 넣어두었기때문에 정렬은 따로 하지 않았다.
String[] types = {"RT", "CF", "JM", "AN"};
[java 코드]
/**
* 성격 유형 검사하기
* @param survey 질문마다 판단하는 지표를 담은 1차원 문자열 배열
* @param choices 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열
* @return 검사자의 성격 유형 검사 결과를 지표 번호 순서대로, 동점이면 사전순으로 빠른 알파벳으로 정해짐
*/
public String solution4(String[] survey, int[] choices) {
String answer = "";
StringBuilder sb = new StringBuilder();
Integer[] scores = {0, 3, 2, 1, 0, 1, 2, 3}; // 점수 인덱스화
String[] types = {"RT", "CF", "JM", "AN"}; // 4가지 타입
Map<String, Integer> typeScore = createTypeScore(types); // 점수표 생성
for (int i = 0; i < survey.length; i++) {
String[] s = survey[i].split("");
Integer score = scores[choices[i]];
if (choices[i] < 4) {
// score의 왼쪽 3개는 s[0] 왼쪽타입에 점수를 더해준다.
typeScore.put(s[0], typeScore.getOrDefault(s[0], 0) + score);
} else {
// score 의 오른쪽 3개는 s[1] 오른쪽타입에 점수를 더해준다.
typeScore.put(s[1], typeScore.getOrDefault(s[1], 0) + score);
}
}
for (String type : types) {
String[] tp = type.split("");
if (typeScore.get(tp[0]) >= typeScore.get(tp[1])) {
sb.append(tp[0]);
} else {
sb.append(tp[1]);
}
}
answer = sb.toString();
return answer;
}
/**
* 점수표 생성
*/
private Map<String, Integer> createTypeScore(String[] types){
Map<String, Integer> result = new HashMap<>();
for (String type : types) {
String[] splitType = type.split("");
result.put(splitType[0], 0);
result.put(splitType[1], 0);
}
return result;
}