본문 바로가기
PS/Programmers

[자바] 프로그래머스 - 성격 유형 검사하기 (Lv1, Java)

by Nahwasa 2022. 8. 20.

문제 : Programmers-성격 유형 검사하기

문제 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

필요 알고리즘 개념

  • 문자열 파싱
    • survey의 문자열을 파싱해야 점수 체크가 가능하므로 문자열을 파싱할 수 있어야 한다. 
  • HashMap 개념
    • 해시맵 자료구조에 대해 알고 있으면 편하게 풀 수 있다. 이하 풀이에서는 HashMap을 쓰진 않는다.

 

 

  결국 간단하게 보자면, R,T,C,F,J,M,A,N 각각에 대해 점수를 체크하고, R-T, C-F, J-M, A-N의 4쌍을 비교하면서 더 높은 점수를 출력하거나, 동일하다면 사전순으로 앞서는 문자(R, C, J, A)를 출력해주면 되는 문제이다.

 

 

  그럼 R,T,C,...,N 각각에 대해 점수를 어떻게 저장할 것인지가 핵심인 문제이다. 각 문자(char)에 대한 점수(int)를 저장해야 하므로, HashMap<Character, Integer> 형태의 자료구조를 사용하면 된다. 다만 어차피 R,T,C,...,N에서 겹치는 문자가 없고, 각 문자는 아스키코드로 int로 변경할 수 있으므로 대충 'A'~'Z'에 해당하는 26칸짜리 배열을 만들어서 카운팅해도 된다. 내 경우엔 그렇게 풀었다(시간은 당연히 이게 더 효율적이고, 메모리도 TMI로 가보자면 배열쪽이 더 효율적이다. 왜냐면 일반적으로 int는 4바이트로 알고있겠지만, 자바의 Integer는 객체이므로 주소값으로 들어가고 실제로 20바이트다 ㅋㅋ. Chracter도 마찬가지다. 거기에 주소값도 저장해야 하므로 메모리가 훨씬 더 들어간다).

 

 

  choices의 경우엔 0~7로 보면 구간을 나눠줘야해서 귀찮으니 그냥 4를 빼주게 되면, 음수일 경우 survey의 좌측문자에 영향을 끼치고, 0일 경우엔 무시하고, 양수일 경우엔 survey의 우측문자에 영향을 끼친다. 코드에 위 설명을 주석으로 달아보면 아래와 같다.

char a = survey[i].charAt(0);	// survey[i]의 좌측 문자
char b = survey[i].charAt(1);	// survey[i]의 우측 문자
int score = choices[i]-4;	// 얘기한대로 4를 배줌
if (score == 0) continue;	// 0이라면 무시
if (score<0) cnt[a-'A']-=score;	// 음수라면 좌측문자에 영향
else cnt[b-'A']+=score;	// 양수라면 우측문자에 영향

 

 

코드 : github

/**
 * 문제 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
 */
class Solution {
    private static final String[] INDICATORS = {"RT", "CF", "JM", "AN"};
    public String solution(String[] survey, int[] choices) {
        int[] cnt = new int['Z'-'A'+1];
        for (int i = 0; i < survey.length; i++) {
            char a = survey[i].charAt(0);
            char b = survey[i].charAt(1);
            int score = choices[i]-4;
            if (score == 0) continue;
            if (score<0) cnt[a-'A']-=score;
            else cnt[b-'A']+=score;
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < INDICATORS.length; i++) {
            char a = INDICATORS[i].charAt(0);
            char b = INDICATORS[i].charAt(1);
            int cntA = cnt[a-'A'];
            int cntB = cnt[b-'A'];
            if (cntA == cntB) sb.append(a);
            else sb.append(cntA>cntB ? a:b);
        }
        return sb.toString();
    }
}

댓글