본문 바로가기
JAVA/프로그래머스

[Lv.1] 프로그래머스 - 성격 유형 검사하기 : Java

by ♡˖GYURI˖♡ 2024. 5. 10.
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

이해하기

처음 문제를 봤을 때 Map으로 풀어야하나 했지만 구현 방법이 잘 떠오르지 않아서 노가다로 풀었다.

class Solution {
    public String solution(String[] survey, int[] choices) {
        StringBuffer sb = new StringBuffer();
        int[][] arr = new int[4][2];
        
        for (int i = 0; i < survey.length; i++) {
            String s = survey[i];
            int choice = choices[i];
            
            if (s.contains("R")) {
                if (s.startsWith("R")) {
                    if (choice <= 3) {
                        arr[0][0] += 3 - choice + 1;
                    } else if (choice >= 5) {
                        arr[0][1] += choice - 4;
                    } else {
                        continue;
                    }
                } else {
                    if (choice <= 3) {
                        arr[0][1] += 3 - choice + 1;
                    } else if (choice >= 5) {
                        arr[0][0] += choice - 4;
                    } else {
                        continue;
                    }
                }
            } else if (s.contains("C")) {
                if (s.startsWith("C")) {
                    if (choice <= 3) {
                        arr[1][0] += 3 - choice + 1;
                    } else if (choice >= 5) {
                        arr[1][1] += choice - 4;
                    } else {
                        continue;
                    }
                } else {
                    if (choice <= 3) {
                        arr[1][1] += 3 - choice + 1;
                    } else if (choice >= 5) {
                        arr[1][0] += choice - 4;
                    } else {
                        continue;
                    }
                }
            } else if (s.contains("J")) {
                if (s.startsWith("J")) {
                    if (choice <= 3) {
                        arr[2][0] += 3 - choice + 1;
                    } else if (choice >= 5) {
                        arr[2][1] += choice - 4;
                    } else {
                        continue;
                    }
                } else {
                    if (choice <= 3) {
                        arr[2][1] += 3 - choice + 1;
                    } else if (choice >= 5) {
                        arr[2][0] += choice - 4;
                    } else {
                        continue;
                    }
                }
            } else {
                if (s.startsWith("A")) {
                    if (choice <= 3) {
                        arr[3][0] += 3 - choice + 1;
                    } else if (choice >= 5) {
                        arr[3][1] += choice - 4;
                    } else {
                        continue;
                    }
                } else {
                    if (choice <= 3) {
                        arr[3][1] += 3 - choice + 1;
                    } else if (choice >= 5) {
                        arr[3][0] += choice - 4;
                    } else {
                        continue;
                    }
                }
            }
        }
        
        for (int i = 0; i < arr.length; i++) {            
            if (i == 0) {
                sb.append((arr[i][0] >= arr[i][1]) ? "R" : "T");
            } else if (i == 1) {
                sb.append((arr[i][0] >= arr[i][1]) ? "C" : "F");
            } else if (i == 2) {
                sb.append((arr[i][0] >= arr[i][1]) ? "J" : "M");
            } else {
                sb.append((arr[i][0] >= arr[i][1]) ? "A" : "N");
            }
        }
        
        return sb.toString();
    }
}

 

엄청 길어졌는데 정리하자면 아래와 같다.

  • 문자열을 저장할 StringBuffer
  • 각 설문조사의 결과를 저장할 int[][] arr
    • 4가지 지표에 두 가지 결과라서 new int[4][2]
  • for문으로 survey를 하나씩 돌면서 choice값을 확인
    • "R"이 있다면 1번 지표
      • 그 중에서도 "R"로 시작한다면
        • 1, 2, 3 choice값이 "R"에 해당
        • 5, 6, 7 choice값이 "T"에 해당
      • "R"로 시작하지 않는다면 ("T"로 시작한다면)
        • 1, 2, 3 choice값이 "T"에 해당
        • 5, 6, 7 choice값이 "R에 해당
    • "C"가 있다면 2번 지표
      • 그 중에서도 "C"로 시작한다면
        • 1, 2, 3 choice값이 "C"에 해당
        • 5, 6, 7 choice값이 "F"에 해당
      • "C"로 시작하지 않는다면 ("F"로 시작한다면)
        • 1, 2, 3 choice값이 "F"에 해당
        • 5, 6, 7 choice값이 "C"에 해당
    • "J"가 있다면 3번 지표
      • 그 중에서도 "J"로 시작한다면
        • 1, 2, 3 choice값이 "J"에 해당
        • 5, 6, 7 choice값이 "M"에 해당
      • "J"로 시작하지 않는다면 ("M"으로 시작한다면)
        • 1, 2, 3 choice값이 "M"에 해당
        • 5, 6, 7 choice값이 "J"에 해당
    • 전부 다 아니면 4번 지표
      • 그 중에서도 "A"로 시작한다면
        • 1, 2, 3 choice값이 "A"에 해당
        • 5, 6, 7 choice값이 "N"에 해당
      • "A"로 시작하지 않는다면 ("N"으로 시작한다면)
        • 1, 2, 3 choice값이 "N"에 해당
        • 5, 6, 7 choice값이 "A"에 해당
  • for문으로 arr를 확인
    • i == 0이면 1번 지표
      • arr[i][0]과 arr[i][1]을 비교해서 arr[i][0] >= arr[i][1] 이라면 "R"을 append, 아니면 "T"를 append
    •  i == 1이면 2번 지표
      • arr[i][0]과 arr[i][1]을 비교해서 arr[i][0] >= arr[i][1] 이라면 "C"을 append, 아니면 "F"를 append
    •  i == 2이면 3번 지표
      • arr[i][0]과 arr[i][1]을 비교해서 arr[i][0] >= arr[i][1] 이라면 "J"을 append, 아니면 "M"를 append
    • 전부 아니면 4번 지표
      • arr[i][0]과 arr[i][1]을 비교해서 arr[i][0] >= arr[i][1] 이라면 "A"을 append, 아니면 "N"를 append

 

통과도 하고 시간도 빨랐지만 문제에서 원한 풀이가 이게 아니라는 생각이 들었다.

 

 

참고한 블로그⬇️

 

[코딩테스트] 프로그래머스 - 성격 유형 검사하기(Java)

🥛 설명 레벨: 1 언어: Java 문제: 나만의 카카오 성격 유형 검사지를 만들려고 합니다. 성격 유형 검사는 다음과 같은 4개 지표로 성격 유형을 구분합니다. 성격은 각 지표에서 두 유형 중 하나로

velog.io

 

 

문제풀이

import java.util.*;

class Solution {
    public String solution(String[] survey, int[] choices) {
        Map<Character, Integer> map = new HashMap<>();
        
        for (int i = 0; i < survey.length; i++) {
            int value = choices[i];
            
            if (value > 0 && value < 4) {
                char ch = survey[i].charAt(0);
                map.put(ch, map.getOrDefault(ch, 0) + 4 - value);
            } else if (value > 4) {
                char ch = survey[i].charAt(1);
                map.put(ch, map.getOrDefault(ch, 0) + value - 4);
            }
        }
        
        return new StringBuffer()
            .append(map.getOrDefault('R', 0) >= map.getOrDefault('T', 0) ? 'R' : 'T')
            .append(map.getOrDefault('C', 0) >= map.getOrDefault('F', 0) ? 'C' : 'F')
            .append(map.getOrDefault('J', 0) >= map.getOrDefault('M', 0) ? 'J' : 'M')
            .append(map.getOrDefault('A', 0) >= map.getOrDefault('N', 0) ? 'A' : 'N')
            .toString();
    }
}
  • HashMap 사용
  • for문으로 하나씩 돌면서
    • choices[i]를 value로 잡고
      • value가 1, 2, 3 중 하나라면
        • ch = survey[i].charAt(0)
        • e.g. "TR"이면 앞의 'T'를 가져온 것
        • map.put(ch, map.getOrDefault(ch, 0) + 4 - value)
      • value가 5 이상이라면
        • ch = survey[i].charAt(1)
        • e.g. "TR"이면 뒤의 'R'을 가져온 것
        • map.put(ch, map.getOrDefault(ch, 0) + value - 4)
  • 각 지표의 두 개의 char의 value를 map에서 가져와서 비교 후 더 큰 값을 append

 

이게 문제에서 원했던 풀이라는 느낌...^^

 

첫번째 풀이랑 비교해보면  아주 쪼끔 느리지만 여전히 빠르다.