문제 설명
상세한 문제 설명은 프로그래머스에서 확인할 수 있습니다.
지표 번호 | 성격 유형 |
1 | R, T |
2 | C, F |
3 | J, M |
4 | A, N |
각 지표 번호에서 두 유형 중 성격이 강한 것을 조합하여 "RFMN", "TCMA" 같은 성격 유형을 결정합니다.
검사지는 N개의 질문과 아래와 같은 7개의 선택지가 있습니다.
선택지 | 성격 유형 점수 |
매우 비동의 | 첫 번째 유형 3점 |
비동의 | 첫 번째 유형 2점 |
약간 비동의 | 첫 번째 유형 1점 |
모르겠음 | 점수 없음 |
약간 동의 | 두 번째 유형 1점 |
동의 | 두 번째 유형 2점 |
매우 동의 | 두 번째 유형 3점 |
1번 질문이 "CF" 유형에 대한 질문인 경우
- 매우 비동의는 C 유형에 3점
- 동의는 F유형에 3점
이 부여되는 방식입니다.
만약 각 지표 번호에서 두 성격 유형 점수가 같다면 사전 순으로 빠른 것을 선택합니다. (F = C = 0 이면 사전 순으로 빠른 C를 선택합니다)
제한 사항
- 1 <= survey 의 길이 (= n) <= 1,000
- survey의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나입니다.
- survey[i] 의 첫 번째 캐릭터는 i+1번 질문의 비동의 관련 선택지를 선택하면 받는 성격 유형입니다.
- survey[i] 의 두 번째 캐릭터는 i+1번 질문의 동의 관련 선택지를 선택하면 받는 성격 유형입니다.
- choices 의 길이 = survey 의 길이
- choices[i] 는 검사자가 선택한 i+1번째 질문의 선택지를 의미합니다.
- 1 <= choices 의 원소 <= 7
입출력 예시
survey | choices | result |
["AN", "CF", "MJ", "RT", "NA"] | [5, 3, 2, 7, 5] | "TCMA" |
["TR", "RT", "TR"] | [7, 1, 3] | "RCJA" |
풀이
길이가 4인 배열을 생성하여 음수인 경우는 사전 순으로 빠른 유형, 양수인 경우는 사전 순으로 느린 유형으로 각 지표를 해석하는 방식으로 풀 수도 있을 것 같습니다만 저는 Map을 이용하여 각 성향을 key로 잡고 점수를 더하여 풀었습니다.
코드
import java.util.*;
class Solution {
public String solution(String[] survey, int[] choices) {
HashMap<Character, Integer> scoreMap = new HashMap<>();
int middlePoint = 4;
for (int i = 0; i < survey.length; i++) {
if (choices[i] == middlePoint) {
continue;
} else {
int point;
char c;
if (choices[i] < middlePoint) {
// 비동의쪽 성향 스코어 증가
point = (choices[i] - middlePoint) * -1; // 낮을 수록 더 강한 수치 부여
c = survey[i].charAt(0);
} else {
// 동의쪽 성향 스코어 증가
point = choices[i] - middlePoint;
c = survey[i].charAt(1);
}
scoreMap.put(c, scoreMap.getOrDefault(c, 0) + point);
}
}
StringBuilder sb = new StringBuilder();
// 추출할 성격 유형 지표를 정의합니다.
char[][] indicators = { { 'R', 'T' }, { 'C', 'F' }, { 'J', 'M' }, { 'A', 'N' } };
for (char[] indicator : indicators) {
// 사전 순으로 빠르도록 정렬합니다. (정렬된 상태로 정의하면 필요없는 부분입니다.)
Arrays.sort(indicator);
int firstItem = scoreMap.getOrDefault(indicator[0], 0);
int secondItem = scoreMap.getOrDefault(indicator[1], 0);
// 점수가 같은 경우 사전 순으로 빠른 유형을 선택하도록 등호를 포함합니다.)
sb.append((firstItem >= secondItem)? indicator[0]: indicator[1]);
}
return sb.toString();
}
}
'개발 > Algorithm' 카테고리의 다른 글
[Java] 오픈채팅방 (2019 KAKAO BLIND RECRUITMENT) (0) | 2023.06.30 |
---|---|
[Java] 영어 끝말잇기 (프로그래머스 Summer/Winter Coding(~2018)) (0) | 2023.06.26 |
[Java] 크레인 인형뽑기 게임 (2019 카카오 개발자 겨울 인턴십) (0) | 2023.06.26 |
[Java] 백준 2178번: 미로 탐색 (0) | 2023.01.05 |
[Python] k진수에서 소수의 개수 구하기 (2022 Kakao) (0) | 2022.06.19 |