본문 바로가기

CS ﹒ Algorithm/Programmers

프로그래머스 문제풀이 (6) 성격 유형 검사하기

 

 

문제는 딱히 어려울 게 없다.

가장 일반적인 방법으로는 Map에 각 성격유형마다 값을 넣어서 구하는 방법도 있고

아니면 각 유형( 예 : I와 E )를 묶어서 하나는 점수를 더하는 것으로 계산하고 하나는 빼는 것으로 계산하는 것도 방법이다.

 

예를 들어 1번 지표가 R과 T인데, R이 점수를 얻을 때는 1번에 점수를 올려주고 T가 점수를 얻을때는 빼줘서

마지막에 결과값을 조회했을 때 음수가 나오면 T를 반환하면 될 것이다

 

다만 카카오 인턴쉽 문제인 걸 보니 최소 10분 안에 풀어야하는 문제가 아닐까 싶은데

나는 중간에 이상한 곳에서 실수해서 처음 푸는데 한참 걸렸다.

수도 코드 작성하십시오..

 

나는 switch를 활용한 방법과 if문을 도배하는 방법, 두 가지로 풀어봤다.

 

 

 

 

 

 

 

 

 

 

 

 

1. switch문

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
class Solution {
    public String solution(String[] survey, int[] choices) {
        StringBuilder answer = new StringBuilder();
        Map<Integer, Integer> result = new HashMap<>();
        String[] type = {"R","T","C","F","J","M","A","N"};
        
        for (int i=0; i<survey.length; i++) {
            int point = 0;
            if (choices[i]>4) point = -(choices[i]-4);
            else if (choices[i]<4) point = 4-choices[i];
 
            switch(survey[i].substring(0,1)) {
                case "R" :
                    result.put(1, result.getOrDefault(1,0)+point);
                    break;
                case "T" :
                    result.put(1, result.getOrDefault(1,0)-point);
                    break;
                case "C" :
                    result.put(2, result.getOrDefault(2,0)+point);
                    break;
                case "F" :
                    result.put(2, result.getOrDefault(2,0)-point);
                    break;
                case "J" :
                    result.put(3, result.getOrDefault(3,0)+point);
                    break;
                case "M" :
                    result.put(3, result.getOrDefault(3,0)-point);
                    break;
                case "A" :
                    result.put(4, result.getOrDefault(4,0)+point);
                    break;
                case "N" :
                    result.put(4, result.getOrDefault(4,0)-point);
                    break;
            }
        }
 
        for (int i=0; i<4; i++) {
            if (result.getOrDefault(i+1,0>= 0) answer.append(type[i*2]);
            else answer.append(type[(i*2)+1]);
        }
 
        return answer.toString();
cs

 

### 성능 요약

메모리: 78.5 MB, 시간: 1.04 ms

 

확실히 가독성은 좋다.

switch문 답게 눈에 확 들어온다.

위에서 설명한대로 각 지표의 첫번째는 + 점수, 두번째는 - 점수를 주고

결과값에서 0보다 크거나 같을 경우 첫번째 유형을 고르도록 했다.

 

 

 

 

 

 

 

2. 지저분한 버전

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
class Solution {
    public String solution(String[] survey, int[] choices) {
        StringBuilder answer = new StringBuilder();
        Map<String, Integer> result = new HashMap<>();
        String[] type = {"R","T","C","F","J","M","A","N"};
 
        for (int i=0; i<survey.length; i++) {
            String firstChar = survey[i].substring(0,1);
            String secondChar = survey[i].substring(1,2);
            if (choices[i] < 4) {
                int point = 4-choices[i];
                if (result.getOrDefault(firstChar, null== null) {
                    result.put(firstChar, point);
                } else {
                    result.put(firstChar, result.get(firstChar)+point);
                }
            } else if (choices[i] > 4) {
                int point = choices[i]-4;
               if (result.getOrDefault(secondChar, null== null) {
                    result.put(secondChar, point);
                } else {
                    result.put(secondChar, result.get(secondChar)+point);
                }
            }
        }
 
        for (int i=0; i<type.length; i+=2) {
            int first = result.getOrDefault(type[i], 0);
            int second = result.getOrDefault(type[i+1], 0);
 
            if (first > second) answer.append(type[i]);
            else if (second > first) answer.append(type[i+1]);
            else if (second == first) answer.append(type[i]);
        }
 
        return answer.toString();
cs

 

첫 번째 풀었던 방식이다.

 

### 성능 요약

메모리: 74.2 MB, 시간: 0.74 ms

속도는 조금 더 빠르긴 한데 이렇게 지저분하게 풀다가

중간에 정신 놓는 순간 어디서 잘못된 건지 찾는데 한 세월 걸린다는 게 문제다.