티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/17680#
컴퓨터 공학적인 문제처럼 보이지만 카카오는 코테에서 검색이 가능하기에 LRU알고리즘정도는 검색하고나서 구현하면 된다.
1트
검색이 가능하고, 순차적 저장이 가능한 데이터타입을 사용해야한다.
데이터 타입을 HashSet과 LinkedList중에 고민하였으나 HashSet은 삭제에서 비효율적일듯해 List로 결정
import java.util.*;
class Solution {
public int solution(int cacheSize, String[] cities) {
if(cacheSize == 0){
return cities.length * 5;
}
int answer = 0;
// 순서가 있어야하고, 검색이 가능한 자료 구조 (처음엔 hashset을 생각함)
LinkedList<String> cache = new LinkedList<>();
for(int i=0; i<cacheSize; i++){
cache.add(cities[i].toUpperCase());
answer+= 5;
}
// 투포인터?
for(int j=cacheSize; j<cities.length; j++){
for(int k=0; k<cacheSize; k++){
if(cache.get(k).equals(cities[j].toUpperCase())){
answer+=1;
cache.remove(0);
cache.add(cities[j].toUpperCase());
break;
}else if(k == cacheSize-1){
cache.remove(0);
cache.add(cities[j].toUpperCase());
answer+= 5;
}
}
}
return answer;
}
}
2트
처음짠 로직으론 커버가 안되는 반례가 많았다.
입력값 〉 5, ["a", "b", "c", "b", "a"]
기댓값 〉 17
이런 케이스
import java.util.*;
class Solution {
public int solution(int cacheSize, String[] cities) {
if(cacheSize == 0){
return cities.length * 5;
}
int answer = 0;
// 순서가 있어야하고(인덱스 조회), 검색이 가능한 자료 구조 (처음엔 hashset을 생각함)
LinkedList<String> cache = new LinkedList<>();
for(int i=0; i<cacheSize; i++){
if(cache.contains(cities[i].toUpperCase()) == true){
// System.out.println("중복 저장");
answer+= 1;
}else{
cache.add(cities[i].toUpperCase());
answer+= 5;
}
}
// System.out.println();
// 투포인터?
for(int j=cacheSize; j<cities.length; j++){
for(int k=0; k<cacheSize; k++){
if(cache.get(k).equals(cities[j].toUpperCase())){
answer+=1;
cache.remove(0);
cache.add(cities[j].toUpperCase());
break;
}else if(k == cacheSize-1){
cache.remove(0);
cache.add(cities[j].toUpperCase());
answer+= 5;
}
}
}
return answer;
}
}
이렇게해도 9, 11, 15, 16,18,19,20번에서 뭔가 자꾸 틀리길래 모범답안과 비교하여 GPT에게 뭘 개선해야하냐고 물어봤다
|
이렇게 최종 코드
2중 for문을 contains 메소드를 사용해 정리하였다.
public int solution(int cacheSize, String[] cities) {
if (cacheSize == 0) {
return cities.length * 5;
}
int answer = 0;
LinkedList<String> cache = new LinkedList<>();
for (String city : cities) {
String formattedCity = city.toLowerCase(); // 도시 이름을 소문자로 변환
// 캐시에 도시가 이미 존재하는 경우
if (cache.contains(formattedCity)) {
cache.remove(formattedCity); // 캐시에서 해당 도시 삭제
cache.addLast(formattedCity); // 캐시의 끝에 다시 추가
answer += 1; // 캐시 히트
} else {
// 캐시가 가득 차 있을 경우, 가장 오래된 요소를 삭제
if (cache.size() == cacheSize) {
cache.removeFirst();
}
cache.addLast(formattedCity); // 새 도시를 캐시의 끝에 추가
answer += 5; // 캐시 미스
}
}
return answer;
}
LRU 알고리즘이란?
https://dailylifeofdeveloper.tistory.com/355
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 실시간클락
- 조회수기능
- 조회수기능개발
- 구글클라우드스토리지
- 지도데이터
- 시간어떻게
- 구글
- 항해커톤
- redisTemplate
- redis
- 알고있
- PC시간어떻게
- 주피터랩
- ChatGPT
- redis-py
- 빈해쉬맵
- crudrepository
- jupyterlab
- 스마트렌즈
- 네이버이미지검색
- 항해해커톤
- 소숫점잘림
- visionAPI
- 데이터잘림
- mockserver
- 이미지검색
- 해커톤
- 모의서버
- 목서버
- 실시간클록
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
글 보관함