문제
https://school.programmers.co.kr/learn/courses/30/lessons/118666
나의 풀이
import java.util.HashMap;
class Solution {
public String solution(String[] survey, int[] choices) {
String answer = "";
String[] types = { "RT", "CF", "JM", "AN" };
HashMap<String, Integer> map = new HashMap<>();
for (String type : types) {
map.put(type, 0);
}
for (int i = 0; i < survey.length; i++) {
if (map.containsKey(survey[i])) {
if (choices[i] < 4) {
map.put(survey[i], map.get(survey[i]) + (4 - choices[i]));
} else if (choices[i] > 4) {
map.put(survey[i], map.get(survey[i]) - (choices[i] - 4));
}
} else {
String key = survey[i].substring(1, 2) + survey[i].substring(0, 1);
if (choices[i] < 4) {
map.put(key, map.get(key) - (4 - choices[i]));
} else if (choices[i] > 4) {
map.put(key, map.get(key) + (choices[i] - 4));
}
}
}
for (String type : types) {
char a = type.charAt(0);
char b = type.charAt(1);
if (map.get(type) > 0) {
answer += a;
} else if (map.get(type) == 0) {
answer += a < b ? a : b;
} else {
answer += b;
}
}
return answer;
}
}
해당 타입의 점수를 매기기 위해 HashMap 객체를 생성하여 types 배열에 있는 요소들을 넣는다. 여기서 types의 길이만큼 반복하므로 선형이라고 생각할 수 있다. 하지만 types는 항상 4개로 고정되어있기 때문에 평균을 내면 4의 크기로 증가 차수는 상수이다. (맞는지 잘 모르겠음;)
survey의 길이 n만큼 순회하며 타입에 따라 containsKey로 존재여부를 먼저 검사[O(1)]하고 점수를 4점이상이면 +, 미만이면 -를 해준다. 존재하지 않으면 앞뒤 글자를 바꿔서 점수 채점을 한다. 증가 차수는 survey길이가 변하므로 선형이다.
type별로 점수 총합이 +이면 앞의 타입, -이면 뒤의 타입으로 하여 성격 유형을 추려낸다. 여기서도 types의 길이만큼 순회하지만 마찬가지로 길이가 고정되어 있으므로 증가차수가 선형이 아니라 상수이다.
따라서 이 풀이는 증가 차수가 선형이다. O(n)
'알고리즘 & 문제 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 숫자 문자열과 영단어(java) (0) | 2023.02.02 |
---|---|
[프로그래머스] 신고 결과 받기(java) (0) | 2023.02.02 |
[프로그래머스] 햄버거 만들기(java) (0) | 2023.02.02 |
[프로그래머스] 문자열 나누기(java) (0) | 2023.02.02 |
[프로그래머스] 가장 가까운 같은 글자(java) (0) | 2023.02.02 |