Algorithm/Algorithm Test
[프로그래머스] 보석 쇼핑 (Java)
MarrRang
2020. 9. 22. 12:34
카테고리
탐색, 이분탐색(?)
나만의 카테고리
전체 포함하는 최적해 찾기, 리스트, 맵
문제 링크
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를 계산했더니 효율성 테스트를 통과할 수 없었습니다.
따라서 연산을 필요할 때만 할 수 있게 해서 리펙토링 했습니다.
반응형