Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags more
Archives
Today
Total
관리 메뉴

공부블로그

[프로그래머스] 성격 유형 검사하기 본문

IT/알고리즘

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

So1_b 2022. 10. 7. 15:47

[문제 설명]

 

- 점수를 저장하기 위해 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
Comments