[Java] 프로그래머스(level-1) - 성격 유형 검사하기

상세한 문제 내용은 여기에서 확인 바랍니다.
입출력 예시
Input-1
survey = [“AN”, “CF”, “MJ”, “RT”, “NA”]
choices = [5, 3, 2, 7, 5]
Output-1
TCMA
Input-2
survey = [“AN”, “CF”, “MJ”, “RT”, “NA”]
choices = [5, 3, 2, 7, 5]
Output-2
RCJA
문제 풀이
이 문제는 HashMap에 지표별 유형과 점수를 저장하는 것이 중요하다고 생각한다.
지표 배열 survey를 순회하며 선택지가 1,2,3번이라면, 비동의쪽 선택임을, 5,6,7번이라면, 동의쪽 선택임을 고려해야 한다.
먼저 HashMap에 유형과 점수를 저장하는 코드를 작성해보자.
HashMap에 유형 및 점수 저장
1
2
3
4
5
6
7
8
for(int i=0; i<survey.length; i++) {
if(choices[i] > 4) {
hm.put(survey[i].split("")[1], (hm.getOrDefault(survey[i].split("")[1], 0) + Math.abs(choices[i]-4)));
}
else if(choices[i] < 4) {
hm.put(survey[i].split("")[0], (hm.getOrDefault(survey[i].split("")[0], 0) + Math.abs(choices[i]-4)));
}
}
위 코드를 보면 선택지 문항이 4보다 작을 때 즉, 1,2,3번일 경우 비동의 선택이기에 survey[i]의 왼쪽 문자와 점수를 저장한다.
이 때, 점수를 누적해서 저장해야 하므로 getOrDefault() 메서드를 통해 유형별 누적 점수를 저장하도록 작성하였다.
그리고 동의 선택일 경우는 반대로 생각하면 된다.
성격 유형 검사 결과 구하기
유형과 점수를 집계했으니, 집계한 내용대로 조건에 맞춰 성격 유형 검사 결과를 구하면 된다.
나는 단순하게 모든 유형 변수에 HashMap에 담긴 원소 값을 가져와 저장한 후 조건문으로 구했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
int R = hm.getOrDefault("R", 0);
int T = hm.getOrDefault("T", 0);
int C = hm.getOrDefault("C", 0);
int F = hm.getOrDefault("F", 0);
int J = hm.getOrDefault("J", 0);
int M = hm.getOrDefault("M", 0);
int A = hm.getOrDefault("A", 0);
int N = hm.getOrDefault("N", 0);
if(R!=0 && T==0) answer += "R";
else if(T!=0 && R==0) answer += "T";
else {
if(R>T) answer += "R";
else if(R<T) answer += "T";
else answer += "R";
}
if(C!=0 && F==0) answer += "C";
else if(F!=0 && C==0) answer += "F";
else {
if(C>F) answer += "C";
else if(C<F) answer += "F";
else answer += "C";
}
if(J!=0 && M==0) answer += "J";
else if(M!=0 && J==0) answer += "M";
else {
if(J>M) answer += "J";
else if(J<M) answer += "M";
else answer += "J";
}
if(A!=0 && N==0) answer += "A";
else if(N!=0 && A==0) answer += "N";
else {
if(A>N) answer += "A";
else if(A<N) answer += "N";
else answer += "A";
}
작성한 코드를 제출하니 시간은 좀 걸리긴 하지만 모든 테스트케이스에 통과하였다.
작성 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import java.util.*;
class Solution {
public static void main(String[] args) {
String[] survey = {"AN", "CF", "MJ", "RT", "NA", "JM"};
int[] choices = {5,3,2,7,5,7};
// String[] survey = {"TR", "RT", "TR"};
// int[] choices = {7,1,3};
// String[] survey = {"TR", "TR", "TR"};
// int[] choices = {1, 7, 3};
long start = System.currentTimeMillis();
solution(survey, choices);
long end = System.currentTimeMillis();
System.out.println("\n수행시간 = " + (end-start));
}
public static String solution(String[] survey, int[] choices) {
String answer = "";
HashMap<String, Integer> hm = new HashMap<>();
for(int i=0; i<survey.length; i++) {
if(choices[i] > 4) {
hm.put(survey[i].split("")[1], (hm.getOrDefault(survey[i].split("")[1], 0) + Math.abs(choices[i]-4)));
}
else if(choices[i] < 4) {
hm.put(survey[i].split("")[0], (hm.getOrDefault(survey[i].split("")[0], 0) + Math.abs(choices[i]-4)));
}
}
int R = hm.getOrDefault("R", 0);
int T = hm.getOrDefault("T", 0);
int C = hm.getOrDefault("C", 0);
int F = hm.getOrDefault("F", 0);
int J = hm.getOrDefault("J", 0);
int M = hm.getOrDefault("M", 0);
int A = hm.getOrDefault("A", 0);
int N = hm.getOrDefault("N", 0);
if(R!=0 && T==0) answer += "R";
else if(T!=0 && R==0) answer += "T";
else {
if(R>T) answer += "R";
else if(R<T) answer += "T";
else answer += "R";
}
if(C!=0 && F==0) answer += "C";
else if(F!=0 && C==0) answer += "F";
else {
if(C>F) answer += "C";
else if(C<F) answer += "F";
else answer += "C";
}
if(J!=0 && M==0) answer += "J";
else if(M!=0 && J==0) answer += "M";
else {
if(J>M) answer += "J";
else if(J<M) answer += "M";
else answer += "J";
}
if(A!=0 && N==0) answer += "A";
else if(N!=0 && A==0) answer += "N";
else {
if(A>N) answer += "A";
else if(A<N) answer += "N";
else answer += "A";
}
return answer;
}
}
회고
- 해경방법 자체는 쉬웠던 문제였으나 성격유형 검사 결과 구하는 코드를 간결하게 작성하지 못해 아쉬웠다. 다음에 다시 풀면서 코드를 줄여봐야 겠다.