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

John·2022년 10월 30일
1

코테 메모🌼

목록 보기
2/28
post-thumbnail

문제 설명

레벨 : 1

나만의 카카오 성격 유형 검사지를 만들려고 합니다.
성격 유형 검사는 다음과 같은 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 함수를 완성해주세요.


제한 사항

1 ≤ survey의 길이 ( = n) ≤ 1,000

  • survey의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나입니다.
  • survey[i]의 첫 번째 캐릭터는 i+1번 질문의 비동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
  • survey[i]의 두 번째 캐릭터는 i+1번 질문의 동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.

choices의 길이 = survey의 길이

  • choices[i]는 검사자가 선택한 i+1번째 질문의 선택지를 의미합니다.
    1 ≤ choices의 원소 ≤ 7

풀이

package Programmers;

import java.util.Arrays;
import java.util.HashMap;

public class 성격유형검사하기 {

	public static void main(String[] args) {
		// 결과 'TCMA' 나와야 정답
		String[] survey = {"AN", "CF", "MJ", "RT", "NA"};
		int[] choices = {5, 3, 2, 7, 5};
		System.out.println(solution(survey, choices));
	}

	/**
	 * @date 2022-10-29
	 * 성격 유형 검사하기 lv.1
	 *
	 * @param survey 질문마다 판단하는 지표를 담은 1차원 문자열 배열
	 * @param choices 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열
	 *
	 * @return 성격 유형 검사 결과를 지표 번호 순서대로 리턴
	 */
	public static String solution(String[] survey, int[] choices) {
		// 각 유형별 점수 (key : 유형, value : 점수)
		HashMap<Character, Integer> score = new HashMap<>();

		// 성격 유형 검사 실제 점수
		int realScore = 0;

		for(int i=0; i<survey.length; i++) {
			int choice = choices[i];
			// ScoreOfOption.NEITHER_DISAGREE_NOR_AGREE.getChoice() + 1 : 실제점수 0점 기준으로 작성
			Character type = choice < ScoreOfOption.NEITHER_DISAGREE_NOR_AGREE.getChoice() + 1 ? survey[i].charAt(0) : survey[i].charAt(1);

			ScoreOfOption scoreOfOption = ScoreOfOption.valueOfCode(choice);
			realScore = scoreOfOption.getScore();

			score.put(type, score.getOrDefault(type, 0) + realScore);
		}

		StringBuilder sb = new StringBuilder();
		sb.append(score.getOrDefault('R', 0) >= score.getOrDefault('T', 0) ? 'R' : 'T');
		sb.append(score.getOrDefault('C', 0) >= score.getOrDefault('F', 0) ? 'C' : 'F');
		sb.append(score.getOrDefault('J', 0) >= score.getOrDefault('M', 0) ? 'J' : 'M');
		sb.append(score.getOrDefault('A', 0) >= score.getOrDefault('N', 0) ? 'A' : 'N');

		return sb.toString();
	}

	enum ScoreOfOption {
		VERY_DISAGREE("매우 비동의", 1, 3)
		, DISAGREE("비동의", 2, 2)
		, LITTLE_DISAGREE("약간 비동의", 3, 1)
		, NEITHER_DISAGREE_NOR_AGREE("모르겠음", 4, 0)
		, LITTLE_AGREE("약간 동의", 5, 1)
		, AGREE("동의", 6, 2)
		, VERY_AGREE("매우 동의", 7, 3)
		;

		ScoreOfOption(String option, int choice, int score) {
			this.option = option;
			this.choice = choice;
			this.score = score;
		}

		private String option;  // 선택지
		private int choice;     // 점수
		private int score;      // 실제 점수

		public int getChoice() {
			return choice;
		}
		
		public int getScore() {
			return score;
		}

		public static ScoreOfOption valueOfCode(int ch) {
			return Arrays.stream(values())
					.filter(value -> value.choice == ch)
					.findAny()
					.orElse(null);
		}
	}
}

끄적끄적

Map의 getOrDefault() 함수 기억!(처음 써봤는데 자주 쓸듯!)
enum 공부하면서 같이 적용해보기..(점수표, 항목이 바뀔수도..있자나..그치..?)


결과


느낀점

설문조사에서 이후에 선택지를 가져오는 기능이 추가 되거나 점수의 변경이 있을 수 있기 때문에 enum으로 작성해봤습니다..! 하하하
(뻘짓인가..!?)

profile
기록을 습관으로

0개의 댓글