카테고리
탐색, 이분탐색(?)
나만의 카테고리
전체 포함하는 최적해 찾기, 리스트, 맵
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/67258
요점
- Set, Map, LinkedList 등을 활용할 수 있어야 한다.
- 자바 유틸 클래스에서 제공하는 sort 혹은 Collections의 min, max를 사용할 때는 효율 문제를 염두에 둬야한다
참고 지식
- Set 사용법(Java)
- Map 사용법(Java)
- Collections 메소드
풀이 (Java)
import java.util.*;
class Solution {
public int[] solution(String[] gems) {
HashSet<String> gemSet = new HashSet<>();
for (String gem : gems) {
gemSet.add(gem);
}
int gemSetSize = gemSet.size();
if (gemSetSize == 1) {
return new int[]{1, 1};
}
HashMap<String, Integer> gemMap = new HashMap<>();
int maxTerm = 0;
int answerEnd = 1;
int answerStart = 1;
int minGemValue = 0;
boolean isMinValue = true;
for (int i = 0; i < gems.length; i++) {
int beforeGemValue = gemMap.get(gems[i]) != null ? gemMap.get(gems[i]) : 0;
minFlag = minGemValue == beforeGemValue ? true : false;
gemMap.put(gems[i], i);
if (gemMap.size() == gemSetSize) {
if (isMinValue) {
minGemValue = Collections.min(gemMap.values());
}
int maxGemValue = i;
if (maxTerm == 0 || maxTerm > maxGemValue - minGemValue) {
answerEnd = maxGemValue;
answerStart = minGemValue;
maxTerm = maxGemValue - minGemValue;
}
}
}
return new int[]{answerStart + 1, answerEnd + 1};
}
}
풀이가 깔끔하진 않습니다. isMinValue같은 state를 활용하는 방식을 선호하지는 않지만 코드를 작성하고 나서 효율성 테스트를 통과하려 급하게 생각해낸 방법이였습니다.
기존에는 Collections.min, max를 둘 다 사용해서 maxGemValue, minGemValue를 계산했더니 효율성 테스트를 통과할 수 없었습니다.
따라서 연산을 필요할 때만 할 수 있게 해서 리펙토링 했습니다.
반응형
'Algorithm > Algorithm Test' 카테고리의 다른 글
[프로그래머스] 뉴스 클러스터링 (Java) (0) | 2020.10.05 |
---|---|
[프로그래머스] 야근 지수 (Java) (0) | 2020.09.29 |
[프로그래머스] 최고의 집합 (Java) (0) | 2020.09.24 |
[프로그래머스] 소수 찾기 (Java) (0) | 2020.09.24 |
[프로그래머스] 등굣길 (C++, Java, Python) (0) | 2020.09.15 |