본문 바로가기
프로그래밍/알고리즘 문제풀이

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

by 노잼인간이라불립니다 2023. 7. 26.

0. 개요

 자료구조/ 알고리즘을 공부하면서 코딩테스트 문제를 푸니 뭔가 시너지가 나는 느낌이다. (아닐수도?) 암튼 자료구조도 선형구조 부터 시작해서 정리해야하고, java도 수업시간에 들은 것들 중에 좀 깊게 정리해야 될 부분이 있지만, 하루하루 버티기는 가능하지만, 뭔가 여유롭게 전부 다 하기는 어려운 느낌이라 귀찬은 건 미뤄두고, 코테 문제 해결이나 꾸준히 작성해보려한다. 이대로라면 정리는 쌓이고 쌓여 산 처럼 되어버리게찌... 쉣..

 그래도 역시 프로그래밍은 하면 할 수록 느는거 같아 성취감을 느낀다. 프로그래밍이 이래서 좋다. 적성에 안 맞으면 해도해도 안 느는것도 있는데.. 이건 늘긴하니까...

 

1.  문제 정의

 오늘의 문제는 다음과 같다.

 mbti와 같은 성격유형 검사를 위해서 각 문항마다 1~7까지 선택할 수 있다. 그리고 각 문항마다 2가지의 성향으로 나뉘어 점수가 매겨진다.

 

ex) "ie" 가 배열로 주어지고, 그에 대한 문항 1~7까지 선택할 수 있다고하면 1번부터 매우동의 ...7번은 매우비동의 까지 점수가 매겨진다

 

 정리하자면 1번,2번,3번을 선택했을 경우 i에 대한 성향 점수가 각각 3점, 2점, 1점씩 추가된다. 그리고 4번은 0점이 추가, 그리고 5번,6번,7번을 선택했을 경우 각각 1점, 2점, 3점이 e에 추가되는 형식이다. 그리고 동일점수일 경우 사전상 앞에 있는 문자가 선택된다.

알파벳은 mbti와 동일하지 않지만 대략적으로는 이런 원리이고, 최종적으로 설문지점수를 통해 최종 mbti를 구하는 문제이다.

 

2. 내가 한 시도

 일단 문제를 보고, if-else문이 많아질 것 같아서 mbti라는 객체를 만들고, 그 안에 설문에 따라 점수를 추가하는 메서드와 mbti score의 상태를 저장했다가, 최종적으로 mbti를 구하는 메서드를 구현하면 좋겠다고 생각했다.

 그리고 설문 문항이 총 1~7번까지 있고, 3,2,1,0,1,2,3 이런식의 점수를 주니까 이 것들을 배열에 넣고 인덱스를 호출하여 점수를 호출하면 좋겠다고 생각하고 구현했다.

 

3. code

/**
 * 프로그래머스 LV1
 * 성격 유형 검사하기
 * 접근 방법: 문제를 보고 mbti에 대한 객체를 만들면 좋겠다고 생각해서 mbti를 객체로 만듬.
 *          그리고 설문 같은 경우에는 점수를 배열로 저장하면 좋겠다고 생각함.
 */
public class Solution {
    public String solution(String[] survey, int[] choices) {

        /*
         * 설문선택: 인덱스 , 설문 점수: 인덱스에 해당하는 값
         */
        int[] score = {0,3,2,1,0,1,2,3};

        /*
         * mbti 클래스 생성
         */
        Mbti mbti = new Mbti();

        /*
         * 해당하는 성격 검사 타입과 선택지를에 따라서 mbti 객체에 스코어를 추가해줌.
         */
        for (int i = 0; i < survey.length; i++) {
            String type = survey[i];
            char[] types = type.toCharArray();
            if(choices[i] < 4){
                mbti.addScore(types[0] , score[choices[i]]);
            }
            if(choices[i] > 4){
                mbti.addScore(types[1] , score[choices[i]]);
            }
        }

        return mbti.getMbti();
    }

    /**
     * 성격 유형 클래스
     */
    public class Mbti{

        private int[] mbtis;

        public Mbti() {
            this.mbtis = new int[8];
        }

        public void addScore(Character type, Integer score){

            if(type.equals('R')) {
                mbtis[0]+=score;
                return;
            }
            if(type.equals('T')) {
                mbtis[1]+=score;
                return;
            }
            if(type.equals('C')) {
                mbtis[2]+=score;
                return;
            }
            if(type.equals('F')) {
                mbtis[3]+=score;
                return;
            }
            if(type.equals('J')) {
                mbtis[4]+=score;
                return;
            }
            if(type.equals('M')) {
                mbtis[5]+=score;
                return;
            }
            if(type.equals('A')) {
                mbtis[6]+=score;
                return;
            }
            if(type.equals('N')) {
                mbtis[7]+=score;
            }
        }

        public String getMbti(){
            String answer = "";
            if(mbtis[0]<mbtis[1]){
                answer+="T";
            }else{
                answer+="R";
            }
            if (mbtis[2]<mbtis[3]) {
                answer+="F";
            }else{
                answer+="C";
            }
            if(mbtis[4]<mbtis[5]){
                answer+="M";
            }else{
                answer+="J";
            }
            if(mbtis[6]<mbtis[7]){
                answer+="N";
            }else{
                answer+="A";
            }
            return answer;
        }

    }
}

 

4. 깨닫거나 알게된 점.

 전반적으로 if-else문이 너무 많아서, 가독성 측면에서는 switch-case문이 좋았을 것 같기도 하지만, 내가 익숙한 if-else문으로 구현했다.그러나 구현하고보니 메서드명이 뉘앙스가 확실해서 그렇게 어려운 코드로 보이지도 않는다.

 그것보다 지금 급한것은 자료구조 알고리즘 파트이다. 아직도 갈길이 멀다.. 빨리 비선형구조로 들어가서 자료구조를 마무리하고 알고리즘을 공부하고싶다..

 
참조

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