IJY
느리더라도 꾸준히
IJY
전체 방문자
오늘
어제
  • 분류 전체보기 (67)
    • Develop (67)
      • Java (8)
      • Go (0)
      • Test (1)
      • Web (1)
      • HTML, CSS (1)
      • TIL(Today I Learned) (18)
      • SQL (0)
      • Algorithm (27)
      • 회고 (7)
      • Troubleshooting (1)
      • Etc (3)
    • Etc (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • 우테코 온보딩
  • sort
  • instance
  • PostConstruct
  • 12921
  • REST Assured
  • 프로그래머스
  • html
  • recursion
  • init
  • 회고
  • Spring
  • web
  • Filter
  • 소수 찾기
  • BufferedWriter
  • object
  • java
  • Interceptor
  • API 예외 처리
  • 독후감
  • 백준
  • stream
  • EntityTransaction
  • MVC
  • BufferedReader
  • Class
  • 알고리즘
  • 재귀
  • 초기화

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
IJY

느리더라도 꾸준히

Develop/Algorithm

프로그래머스 Lv.1 - 118666 성격 유형 검사하기

2022. 10. 24. 11:55

프로그래머스 Lv.1 - 118666 성격 유형 검사하기 문제 풀이

 

문제 설명

나만의 카카오 성격 유형 검사지를 만들려고 합니다.
성격 유형 검사는 다음과 같은 4개 지표로 성격 유형을 구분합니다. 성격은 각 지표에서 두 유형 중 하나로 결정됩니다.

지표 번호성격 유형

1번 지표 라이언형(R), 튜브형(T)
2번 지표 콘형(C), 프로도형(F)
3번 지표 제이지형(J), 무지형(M)
4번 지표 어피치형(A), 네오형(N)

4개의 지표가 있으므로 성격 유형은 총 16(=2 x 2 x 2 x 2)가지가 나올 수 있습니다. 예를 들어, "RFMN"이나 "TCMA"와 같은 성격 유형이 있습니다.

검사지에는 총 n개의 질문이 있고, 각 질문에는 아래와 같은 7개의 선택지가 있습니다.

  • 매우 비동의
  • 비동의
  • 약간 비동의
  • 모르겠음
  • 약간 동의
  • 동의
  • 매우 동의

각 질문은 1가지 지표로 성격 유형 점수를 판단합니다.

예를 들어, 어떤 한 질문에서 4번 지표로 아래 표처럼 점수를 매길 수 있습니다.

선택지성격 유형 점수

매우 비동의 네오형 3점
비동의 네오형 2점
약간 비동의 네오형 1점
모르겠음 어떤 성격 유형도 점수를 얻지 않습니다
약간 동의 어피치형 1점
동의 어피치형 2점
매우 동의 어피치형 3점

이때 검사자가 질문에서 약간 동의 선택지를 선택할 경우 어피치형(A) 성격 유형 1점을 받게 됩니다. 만약 검사자가 매우 비동의 선택지를 선택할 경우 네오형(N) 성격 유형 3점을 받게 됩니다.

위 예시처럼 네오형이 비동의, 어피치형이 동의인 경우만 주어지지 않고, 질문에 따라 네오형이 동의, 어피치형이 비동의인 경우도 주어질 수 있습니다.
하지만 각 선택지는 고정적인 크기의 점수를 가지고 있습니다.

  • 매우 동의나 매우 비동의 선택지를 선택하면 3점을 얻습니다.
  • 동의나 비동의 선택지를 선택하면 2점을 얻습니다.
  • 약간 동의나 약간 비동의 선택지를 선택하면 1점을 얻습니다.
  • 모르겠음 선택지를 선택하면 점수를 얻지 않습니다.

검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단합니다. 단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.

질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 매개변수로 주어집니다. 이때, 검사자의 성격 유형 검사 결과를 지표 번호 순서대로 return 하도록 solution 함수를 완성해주세요.

 

문제의 자세한 내용은 해당 링크를 통해 확인 : 문제 링크

 

풀이 코드

import java.lang.Math;
import java.util.Map;
import java.util.HashMap;

class Solution {
    private Map<Character, Integer> indicator = new HashMap();
    
    public Solution() {
        indicator.put('R', 0);
        indicator.put('T', 0);
        indicator.put('C', 0);
        indicator.put('F', 0);
        indicator.put('J', 0);
        indicator.put('M', 0);
        indicator.put('A', 0);
        indicator.put('N', 0);
    }
    
    public String solution(String[] survey, int[] choices) {
        for(int i = 0; i < choices.length; i++) {
            int value = choices[i] - 4;
            if(value == 0) {
                continue;
            }
            
            Character k = null;
            if(value > 0) {
                // 0보다 큰 경우 : survey의 두 번째 캐릭터
                k = Character.valueOf(survey[i].charAt(1));
            } else {
                // 0보다 작은 경우: survey의 첫 번째 캐릭터
                k = Character.valueOf(survey[i].charAt(0));
            }
            indicator.replace(k, indicator.get(k) + Math.abs(value));
        }
        
        StringBuffer answer = new StringBuffer();
        answer.append(compareCategory('R', 'T'));
        answer.append(compareCategory('C', 'F'));
        answer.append(compareCategory('J', 'M'));
        answer.append(compareCategory('A', 'N'));
        
        return answer.toString();
    }
    
    public char compareCategory(Character k1, Character k2) {
        Integer v = indicator.get(k1) - indicator.get(k2);
        if(v == 0) return k1.compareTo(k2) > 0 ? k2.charValue() : k1.charValue();
        else if(v > 0) return k1.charValue();
        else return k2.charValue();
    }
}

 

문제 해결 전략

이라 쓰고 문제를 보고서 어떻게 풀면 될까?에 대한 생각을 정리한 항목

코드를 보면 Map을 쓰기도 하고, 메서드를 나눠서 구현하기도 했지만.. 사실 해당 문제를 이해한 후 처음 떠올린 방법은 그냥 int형 변수 이름을 R, T, C, F, J, M, A, N으로 만든 후 해당 변수에 점수를 할당 후 계산하려고 했었다.

그러다가 다른 여러 가지를 사용해 보고 싶어져서 Map도 사용해 보고, 반복되는 기능은 메서드를 나눠서 사용해 보고 하다가 위 코드와 같이 구현을 했다.

사실 해당 문제로 해결 전략이라고 할 만한 내용은 딱히 없는 것 같다.

어떻게 입력받은 survey에 choices의 값에 따라 점수를 할당할 수 있는지만 고민하면 될 것 같다.

위 코드에서는 choices에서 -4를 한 후 나온 값이 0인지, 음수인지, 양수인지 판별하여 분기하여 해결한다.

0이면 패스, 양수면 두 번째 성향, 음수면 첫 번째 성향으로 구분하며, survey의 성향은 charAt()을 사용하여 파싱하여 사용


코드를 업로드해 둔 깃 허브

'Develop > Algorithm' 카테고리의 다른 글

프로그래머스 lv.1 - 131128 숫자 짝꿍  (2) 2022.11.03
프로그래머스 lv.2 - 92335 k진수에서 소수 개수 구하기  (0) 2022.11.03
프로그래머스 Lv.1 - 12954 x만큼 간격이 있는 n개의 숫자  (0) 2022.10.23
프로그래머스 Lv.1 - 12921 소수 찾기  (0) 2022.10.23
백준 실버II - 11725 트리의 부모 찾기  (0) 2022.07.26
    'Develop/Algorithm' 카테고리의 다른 글
    • 프로그래머스 lv.1 - 131128 숫자 짝꿍
    • 프로그래머스 lv.2 - 92335 k진수에서 소수 개수 구하기
    • 프로그래머스 Lv.1 - 12954 x만큼 간격이 있는 n개의 숫자
    • 프로그래머스 Lv.1 - 12921 소수 찾기
    IJY
    IJY
    개발 관련 공부한 내용을 정리하는 블로그입니다. 느리더라도 꾸준히 포스팅을 하려고 노력합니다.

    티스토리툴바