문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/17680
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
▼ ▼ ▼
▲ ▲ ▲
내 풀이 (오답)
로직
- ArrayList를 활용해 이를 구현해보자.
- cities 배열을 모두 도는 확장 for문을 사용한다.
- 대소문자의 구분이 없다고 했으므로, str에 toLowerCase()를 적용한다.
- str과 cache에 대한 조건문에 따라 코드를 수행해준다.
- 만약 cache가 str를 포함하고 있다면,
- cache hit이므로
answer++
을 해준다. - str을 cache에서 remove 해주고, 가장 나중의 index에 다시 추가해준다.
- cache hit이므로
- 위 조건에는 해당하지 않으나,
cache.size()
가 cacheSize를 넘어선다면- cache miss에 해당하므로
answer+=5
를 해준다. - 0번째 인덱스의 자료를 지워준다. (가장 오래 전 사용된 것이므로)
- str을 add 해준다.
- cache miss에 해당하므로
- 위 두 조건 모두에 해당하지 않으면
- cache miss에 해당하므로
answer+=5
를 해주고, - str을 add 해준다.
- cache miss에 해당하므로
- 만약 cache가 str를 포함하고 있다면,
코드
import java.util.*;
class Solution {
public int solution(int cacheSize, String[] cities) {
int answer = 0;
List<String> cache = new ArrayList<>();
for(String str : cities) {
str = str.toLowerCase();
if(cache.contains(str)) { // cache hit
answer++;
cache.remove(str);
cache.add(str);
} else if(cache.size()>cacheSize) { // cache miss
answer += 5;
cache.remove(0);
cache.add(str);
} else { // cache miss
answer += 5;
cache.add(str);
}
}
return answer;
}
}
채점 결과
정확성 테스트
테스트 1 〉 통과 (0.06ms, 74.7MB)
테스트 2 〉 통과 (0.06ms, 76.1MB)
테스트 3 〉 통과 (0.08ms, 78.6MB)
테스트 4 〉 통과 (0.05ms, 74.7MB)
테스트 5 〉 통과 (0.04ms, 73.9MB)
테스트 6 〉 통과 (0.04ms, 77.2MB)
테스트 7 〉 실패 (0.12ms, 77.1MB)
테스트 8 〉 통과 (0.10ms, 75.4MB)
테스트 9 〉 통과 (0.06ms, 73.3MB)
테스트 10 〉 통과 (0.23ms, 74.3MB)
테스트 11 〉 실패 (36.74ms, 120MB)
테스트 12 〉 실패 (0.20ms, 81.1MB)
테스트 13 〉 실패 (0.64ms, 78.8MB)
테스트 14 〉 실패 (1.23ms, 71.9MB)
테스트 15 〉 실패 (1.17ms, 77.1MB)
테스트 16 〉 실패 (1.37ms, 85.2MB)
테스트 17 〉 실패 (1.56ms, 87.3MB)
테스트 18 〉 실패 (1.61ms, 84.9MB)
테스트 19 〉 실패 (1.60ms, 74.7MB)
테스트 20 〉 실패 (2.01ms, 79.9MB)
채점 결과
정확성: 45.0
합계: 45.0 / 100.0
내 풀이 (정답)
로직
cache.size()가 cacheSize와 같을 때
가장 처음에 위치한 자료를 없애고 str을 추가해야한다.
코드
import java.util.*;
class Solution {
public int solution(int cacheSize, String[] cities) {
int answer = 0;
if(cacheSize==0) return cities.length*5;
List<String> cache = new ArrayList<>();
for(String str : cities) {
str = str.toLowerCase();
if(cache.remove(str)) { // cache hit
answer++;
cache.add(str);
} else if(cache.size()==cacheSize) { // cache miss
answer += 5;
cache.remove(0);
cache.add(str);
} else { // cache miss
answer += 5;
cache.add(str);
}
}
return answer;
}
}
채점 결과
정확성 테스트
테스트 1 〉 통과 (0.05ms, 78.7MB)
테스트 2 〉 통과 (0.06ms, 88.4MB)
테스트 3 〉 통과 (0.05ms, 76.6MB)
테스트 4 〉 통과 (0.08ms, 68MB)
테스트 5 〉 통과 (0.06ms, 66.3MB)
테스트 6 〉 통과 (0.02ms, 77.1MB)
테스트 7 〉 통과 (0.02ms, 77.9MB)
테스트 8 〉 통과 (0.07ms, 83.2MB)
테스트 9 〉 통과 (0.06ms, 74.6MB)
테스트 10 〉 통과 (0.32ms, 76.2MB)
테스트 11 〉 통과 (36.79ms, 123MB)
테스트 12 〉 통과 (0.26ms, 74MB)
테스트 13 〉 통과 (0.70ms, 78MB)
테스트 14 〉 통과 (0.82ms, 91.2MB)
테스트 15 〉 통과 (1.38ms, 75.9MB)
테스트 16 〉 통과 (1.20ms, 73.9MB)
테스트 17 〉 통과 (0.02ms, 85.6MB)
테스트 18 〉 통과 (1.64ms, 73.7MB)
테스트 19 〉 통과 (1.68ms, 76.9MB)
테스트 20 〉 통과 (1.87ms, 77.2MB)
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
좋은 풀이
wonho , 조현지 , 최광순 님의 풀이
import java.util.LinkedHashMap;
import java.util.Map;
class Solution {
public int solution(int cacheSize, String[] cities) {
int answer = 0;
LRU<String, String> clsTemp = LRU.newInstance(cacheSize);
for (int i = 0; i < cities.length; i++) {
String sTemp = cities[i].toUpperCase();
if(clsTemp.containsKey(sTemp)) {
answer++;
}else {
answer +=5;
}
clsTemp.put(sTemp, sTemp);
}
return answer;
}
}
class LRU<K, V> extends LinkedHashMap<K, V> {
private int size;
private LRU(int size) {
super(size, 0.75f, true);
this.size = size;
}
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > size;
}
public static <K,V> LRU<K,V> newInstance(int size) {
return new LRU<K,V>(size);
}
}
배운 점
- LRU (Least Recently Used) 캐시 알고리즘
- LinkedHashMap
'코딩테스트 - 프로그래머스 > JAVA' 카테고리의 다른 글
[프로그래머스 / 스택/큐 / 자바(JAVA)] 기능 개발 (0) | 2024.04.22 |
---|---|
[프로그래머스 / 해시 / 자바(JAVA)] 의상 (0) | 2024.04.19 |
[프로그래머스 / 연습문제 / 자바(JAVA)] 행렬의 곱셈 (0) | 2024.04.15 |
[프로그래머스 / 월간 코드 챌린지 시즌3 / 자바(JAVA)] n^2 배열 자르기 (0) | 2024.04.11 |
[프로그래머스 / 정렬 / 자바(JAVA)] H-Index (0) | 2024.04.09 |