[Study] 프로그래머스 lv.1 성격 유형 검사하기 (46%)

ayboori·2023년 7월 10일
0

Java Study

목록 보기
12/34

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

문제 설명

Untitled

Untitled

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

풀이 로직

  1. 클래스 내에 지역 변수로 int 타입의 R,T,C,F,J,M,A,N 을 선언
  2. choices[] = servey[] 크기 만큼 루프를 돌며 내부 원소를 검사, scoring() 실시
  3. result() 를 통해 결과 리턴

scoring()

  1. choice 의 값이 4 이상이면 1번째 char에 해당하는 변수에 + choice-4
  2. choice 의 값이 4 이하면 1번째 char에 해당하는 변수에 + 4-choice

덧셈 연산은 oneElement()에서 수행

oneElement()

switch - case 문을 통해 연산 수행

result()

R / T 변수의 값들을 비교해 answer에 append

이때 >= 을 사용해서 값이 동일할 경우 사전 상 앞에 있는 글자를 사용함

💡 MBTI 값들을 객체로 만들까 했었는데, 실제 검사할 경우를 생각해보면 한 검사 당 solution 객체가 1개 생성된다. > 클래스 내에서는 공유해도 되겠다! > 지역 변수로 선언

나의 풀이

class Solution {
    int R,T,C,F,J,M,A,N = 0; // 성격 유형 변수들 
    
    public String solution(String[] survey, int[] choices) {        
        for (int i = 0 ; i<choices.length ; i++){ 
            scoring(survey[i],choices[i]); // 루프를 돌며 연산 수행
        }
        return result(); // 결과 리턴
    }
    
    public void scoring(String survey, int choice){
        if(choice > 4){ // 동의 관련 선택지 > 1번째 char에 가산
            oneElement(survey.charAt(1),choice-4);
        }else if(choice < 4){ // 비동의 관련 선택지 > 0번째 char에 가산
            oneElement(survey.charAt(0),4-choice);
        }
    }
    
    public void oneElement(char c, int plus){ // char 값에 따라 해당 변수에 +
        switch (c){
            case 'R':
                 R += plus;
                break;
            case 'T':
                 T += plus;
                break;
            case 'C':
                 C += plus;
                break;
            case 'F':
                 F += plus;
                break;
            case 'J':
                 J += plus;
                break;
            case 'M':
                 M += plus;
                break;
            case 'A':
                 A += plus;
                break;
            case 'N':
                 N += plus;
                break;
        }
    }
    
        public String result(){ // 결과 값 리턴을 위해 변수 비교, answer에 append
            StringBuilder answer = new StringBuilder();
            answer.append(R >= T ? "R" : "T");
            answer.append(C >= F ? "C" : "F");
            answer.append(J >= M ? "J" : "M");
            answer.append(A >= N ? "A" : "N");
            return answer.toString();
         }
    
}

실행 시간

0.03ms ~ 0.31ms

테스트 1 〉통과 (0.05ms, 75.3MB)
테스트 2 〉통과 (0.04ms, 76.8MB)
테스트 3 〉통과 (0.03ms, 75.8MB)
테스트 4 〉통과 (0.03ms, 70.1MB)
테스트 5 〉통과 (0.05ms, 73.7MB)
테스트 6 〉통과 (0.05ms, 74.3MB)
테스트 7 〉통과 (0.05ms, 75.3MB)
테스트 8 〉통과 (0.04ms, 77.2MB)
테스트 9 〉통과 (0.06ms, 71.7MB)
테스트 10 〉통과 (0.06ms, 78MB)
테스트 11 〉통과 (0.05ms, 74.7MB)
테스트 12 〉통과 (0.09ms, 72.2MB)
테스트 13 〉통과 (0.17ms, 70.8MB)
테스트 14 〉통과 (0.20ms, 75.4MB)
테스트 15 〉통과 (0.22ms, 74.3MB)
테스트 16 〉통과 (0.31ms, 88.8MB)
테스트 17 〉통과 (0.27ms, 76.8MB)
테스트 18 〉통과 (0.30ms, 75.3MB)
테스트 19 〉통과 (0.25ms, 85.5MB)
테스트 20 〉통과 (0.24ms, 80MB)

다른 사람의 풀이

import java.util.HashMap;

class Solution {
    public String solution(String[] survey, int[] choices) {
        String answer = "";
				//2차원 배열로 문자 선언
        char [][] type = {{'R', 'T'}, {'C', 'F'}, {'J', 'M'}, {'A', 'N'}};
				// 가중치 선언
        int [] score = {0, 3, 2, 1, 0, 1, 2, 3};
				// MBTI 문자 - 가중치 쌍의 HashMap 선ㅅ언
        HashMap<Character, Integer> point = new HashMap<Character, Integer>();

        // 점수 기록할 hashMap 초기화 
        for (char[] t : type) {
            point.put(t[0], 0);
            point.put(t[1], 0);
        }

        // 점수 기록 
        for (int idx = 0; idx < choices.length; idx++){
            if(choices[idx] > 4){
                point.put(survey[idx].charAt(1), point.get(survey[idx].charAt(1)) + score[choices[idx]]);
            } else {
                point.put(survey[idx].charAt(0), point.get(survey[idx].charAt(0)) + score[choices[idx]]);
            }
        }

        // 지표 별 점수 비교 후 유형 기입
        for (char[] t : type) {
            answer += (point.get(t[1]) <= point.get(t[0])) ? t[0] : t[1];
        }

        return answer;
    }
}

HashMap을 이용해 문자 - 값의 쌍을 만든 점이 인상 깊었다.

문자열을 배열로 선언해서 switch문 검사하는 코드를 줄일 수 있었다.

profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

0개의 댓글