공부블로그
[프로그래머스] 성격 유형 검사하기 본문
[문제 설명]
- 점수를 저장하기 위해 Map을 생성한다.
key = 성격 유형 ( 'R', 'T', 'C' ..등)
value = 질문지에 따른 선택지 점수를 저장한다.
성격 유형 계산 시 각 지표에서 점수가 높은 유형을 반환하고,
같은 점수일 경우 사전 순으로 앞의 성격유형을 반환해야 한다.
요소(key: 성격유형, value: 0 초기점수)를 저장할 때 key의 사전 순으로 저장해 놓고
다른 과정은 거치지 않고 바로 반환할 수 있도록 한다.
map은 저장순서 x, 중복(key불가능, value가능)인 특징이 있다.
따라서 저장 순서를 기억하는 LinkedHashMap으로 만든다.
- 점수 저장
foreach문을 이용해 survey의 요소를 하나하나 가져온다.
질문지에 따른 선택지 번호가 4초과 일 경우 두번째 글자 영역에 점수를 누적시키고
4 미만일 경우 첫번째 글자 영역에 누적시킨다.
이때 선택지에 따른 점수 매핑은 scoreCount()로 시켰다.
- 점수 계산
Map의 key, value값을 리스트로 만든다.
for문의 i는 요소를 가리킬 인덱스를 의미.
각 지표 당 성격유형의 개수는 2개로 똑같기 때문에 i의 값은 2씩 증가한다.
각 지표의 유형 점수를 비교해 더 큰값의 인덱스를 c에 저장
변수 c를 이용해 listKey에 접근해 sb에 성격유형을 저장시킨다.
import java.util.*;
class Solution {
public String solution(String[] survey, int[] choices) {
StringBuilder sb = new StringBuilder();
LinkedHashMap<String, Integer> map = new LinkedHashMap<String, Integer>();
map.put("R", 0); //1번 지표
map.put("T", 0);
map.put("C", 0); //2번 지표
map.put("F", 0);
map.put("J", 0); //3번 지표
map.put("M", 0);
map.put("A", 0); //4번 지표
map.put("N", 0);
int idx = 0;
for(String s: survey) {
String first = String.valueOf(s.charAt(0)); //indexOf(char c) c의 위치값 반환!
String second = String.valueOf(s.charAt(1));
int score = scoreCount(choices, idx);
if(choices[idx]<4) //비동의 (첫번째 글자에 점수 저장)
map.put(first, score+map.get(first));
else if(choices[idx]>4) //동의 (두번째 글자에 점수 저장)
map.put(second, score+map.get(second));
idx++;
}//foreach
//점수 계산
List<Integer> listValue = new ArrayList<Integer>(map.values());
List<String> listKey = new ArrayList<String>(map.keySet());
for(int i=0; i<7; i+=2) {
//성격 유형지표의 인덱스를 반환한다.
int c = listValue.get(i)>=listValue.get(i+1)?
i : i+1;
sb.append(listKey.get(c));
}
return sb.toString();
}//solution
static int scoreCount(int[] choices, int idx) {
switch (choices[idx]) {
case 1,7: return 3;
case 2,6: return 2;
case 3,5: return 1;
default: return 0;
}
}
}
[ 개선하면 좋았을 점]
1. 선택지에 따른 점수를 메서드로 매핑시키는 것보다
배열을 사용하는 것이 코드의 실행속도가 더 빠르다.
2. LinkedHashMap가 인덱스를 이용해 요소에 접근이 가능한 줄알고 사용했는데
저장순서를 기억하는 것일 뿐 인덱스로 접근은 불가능한것같다.
그래서 굳이 map이 아니라 점수를 저장하는 용도로 survey길이와 같은 배열을 만들어
작성해도 되었을 것 같음.
'IT > 알고리즘' 카테고리의 다른 글
[프로그래머스] 삼총사 (0) | 2022.10.26 |
---|---|
[프로그래머스] 키패드 누르기 (0) | 2022.10.14 |
[프로그래머스] 최소 직사각형 (2) | 2022.09.30 |
[백준] 1181 (2) | 2022.09.19 |
[백준] 10817 (0) | 2022.09.18 |