[프로그래머스/자바] 성격 유형 검사하기

솔솔·2022년 12월 21일
0
post-thumbnail

📑 문제 설명

나만의 카카오 성격 유형 검사지를 만들려고 합니다.
성격 유형 검사는 다음과 같은 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차원 문자열 배열 survey와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 매개변수로 주어집니다. 이때, 검사자의 성격 유형 검사 결과를 지표 번호 순서대로 return 하도록 solution 함수를 완성해주세요.



🧑🏻‍💻 문제 풀이

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

class Solution {
    public String solution(String[] survey, int[] choices) {
        String answer = "";
        HashMap<String,Integer> map = new HashMap<>();
        
        for(int i=0;i<survey.length;i++) {
        	
        	int c = choices[i];
        	String a = survey[i].substring(0, 1);
        	String b = survey[i].substring(1,2);

        	/* getOrDefault(Object key, V DefaultValue) 
        	 * key : 값을 가져와야 하는 요소의 키
        	 * defaultValue : 저장된 키로 매핑된 값이 없는 경우 반환되는 기본값
        	 * map에 key가 존재하면 매핑된 값을 반환하고,
        	 * 그렇지 않으면 매개변수로 받은 디폴트 값을 반환한다.*/
        	if(c<4) {
        		map.put(a, map.getOrDefault(a, 0)+(4-c));
        	} else if(c>4) {
        		map.put(b, map.getOrDefault(b, 0)+(c-4));
        	}
        	
        }
        System.out.println(map);
        
        List<String> list = new ArrayList<>();
        list.add(map.getOrDefault("R",0)>=map.getOrDefault("T", 0)?"R":"T");
        list.add(map.getOrDefault("C",0)>=map.getOrDefault("F", 0)?"C":"F");
        list.add(map.getOrDefault("J",0)>=map.getOrDefault("M", 0)?"J":"M");
        list.add(map.getOrDefault("A",0)>=map.getOrDefault("N", 0)?"A":"N");
        
        for(String str:list) {
        	answer += str;
        }
        
        return answer;
    }
}

📝 회고

정말 많이 헤맸다. 처음엔 int형으로 각 성격유형을 초기화해서 if문으로 점수를 받으려 했다.
그런데 survey[i].substring()과 이름이 같은 int 변수를 매칭시키는 데서 어려움을 겪어 아예 새로운 방식을 찾아야 했다.
이 과정에서 키:값으로 이루어진 Map을 이용하게 되었다.
문제를 풀며 컬렉션의 중요함과 배열의 차이점 및 쓰임새를 제대로 알아두어야겠다는 것을 느꼈다.



🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/118666

💻 참고 블로그

https://kim-oriental.tistory.com/18
https://technote-mezza.tistory.com/99

0개의 댓글