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

반응형

프로그래머스 programmers Level1 성격 유형 검사하기 - java 자바

[문제]

2022 KAKAO TECH INTERNSHIP

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

[풀이]

survey 배열에 주어진 성격유형에 질문에  choices  배열에 선택한 선택지에 따라 점수가 배분된다.

입출력 예 #1 에 따르면

 survey[0]  = AN ,  choices[0]  = 5 이므로

왼쪽부터 5번째이므로 네오형(N) 의 점수가 1점 늘어난다.

즉, 점수 배치는 3, 2, 1, 0, 1, 2, 3 이며 0을 기준으로 왼쪽의 점수는  survey  배열 원소의 왼쪽(A)가 취득하게되며 오른쪽의 점수는  survey  배열 원소의 오른쪽(N)이 취득하게된다.

  • 제한 사항 참고 : 1 ≤  choices 의 원소 ≤ 7

따라서 점수표를 배열로 생각해서 코드로 작성하면 다음과 같다.
Integer[] scores = {0, 3, 2, 1, 0, 1, 2, 3};

 

다음으로 해야할 일은 각 성격유형이 취득하는 점수를 취합해야한다.

문제에 주어진 지표는 다음과 같다.

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

제한사항에 따르면,  survey  의 값이 꼭 지표의 순서대로 RT, CF, JM, AN 만 있는 것이 아니다. 

  • 제한사항 참고 :  survey  의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나입니다.

그래서 Map을 이용해서 저장하는 방법을 택했다.

key = 성격유형, value = 취득점수

Map<String, Integer> typeScore = new HashMap()<>;

맵을 생성하고, 맵의 getOrDefault() 메소드를 이용하여 점수를 얻을때마다 더해주었다.

(참고) getOrDefault() 사용법 링크

 

점수를 모두 Map에 넣어준 후 지표에 따라 어떤 점수가 더 큰지 확인 후 answer 에 넣어주었다.

참고로 문제에 점수가 동점이면 사전순으로 빠른 성격 유형으로 판단한다고 되어있다. 

  • 문제 참고 : 단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.

이는 4가지 성격유형 타입을 아래와같이 미리 사전순으로 배열에 넣어두었기때문에 정렬은 따로 하지 않았다.

String[] types = {"RT", "CF", "JM", "AN"};

 

[java 코드]

/**
 * 성격 유형 검사하기
 * @param survey 질문마다 판단하는 지표를 담은 1차원 문자열 배열
 * @param choices 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열
 * @return 검사자의 성격 유형 검사 결과를 지표 번호 순서대로, 동점이면 사전순으로 빠른 알파벳으로 정해짐
 */
public String solution4(String[] survey, int[] choices) {
    String answer = "";
    StringBuilder sb = new StringBuilder();
    Integer[] scores = {0, 3, 2, 1, 0, 1, 2, 3}; // 점수 인덱스화
    String[] types = {"RT", "CF", "JM", "AN"}; // 4가지 타입
    Map<String, Integer> typeScore = createTypeScore(types); // 점수표 생성
    for (int i = 0; i < survey.length; i++) {
        String[] s = survey[i].split("");
        Integer score = scores[choices[i]];
        if (choices[i] < 4) {
            // score의 왼쪽 3개는 s[0] 왼쪽타입에 점수를 더해준다.
            typeScore.put(s[0], typeScore.getOrDefault(s[0], 0) + score);
        } else {
            // score 의 오른쪽 3개는 s[1] 오른쪽타입에 점수를 더해준다.
            typeScore.put(s[1], typeScore.getOrDefault(s[1], 0) + score);
        }
    }
    for (String type : types) {
        String[] tp = type.split("");
        if (typeScore.get(tp[0]) >= typeScore.get(tp[1])) {
            sb.append(tp[0]);
        } else {
            sb.append(tp[1]);
        }
    }
    answer = sb.toString();
    return answer;
}

/**
 * 점수표 생성
 */
private Map<String, Integer> createTypeScore(String[] types){
    Map<String, Integer> result = new HashMap<>();
    for (String type : types) {
        String[] splitType = type.split("");
        result.put(splitType[0], 0);
        result.put(splitType[1], 0);
    }
    return result;
}
반응형