문제 출처: 프로그래머스 코딩 테스트 연습, 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();
}
}
'PS > Programmers' 카테고리의 다른 글
[자바] 프로그래머스 - 크레인 인형뽑기 게임 (Lv1, Java) (0) | 2022.09.17 |
---|---|
[자바] 프로그래머스 - 두 큐 합 같게 만들기 (Lv2, Java) (0) | 2022.08.28 |
[자바] 프로그래머스 - 행렬과 연산 (Lv4, Java) (2) | 2022.08.20 |
[자바] 프로그래머스 - 프린터 (programmers java) (0) | 2022.05.04 |
[자바] 프로그래머스 - 신고 결과 받기 (programmers java) (0) | 2022.05.01 |
댓글