티스토리 뷰
https://programmers.co.kr/learn/courses/30/lessons/17680
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
0. 문제 개요
구현 문제.
캐시 사이즈와 도시 목록이 주어진다.
도시 목록을 차례대로 읽으며 캐시 내 도시 이름이 있는지 확인한다. (LRU) Least Recently Used 알고리즘에 따라 캐시 목록을 업데이트한다. 현재 탐색하는 도시 이름이 캐시 내 존재하면 비용을 +1, 존재하지 않으면 +5만큼 증가시킨다.
도시 목록 탐색이 완료되었을 때 비용을 리턴한다.
1. 문제 해결 아이디어
1-1. 초기 아이디어
캐시 사이즈가 30 밖에 되지 않으므로 캐시 사이즈만큼 배열을 만들어서 방문 history를 기록하고자 했다. 가령 5번째 도시에서 2번 캐시가 방문되었으면 2번 history 배열을 5로 업데이트하는 방식이다.
-> 채점했을 때 2개의 테스트 케이스를 통과하지 못했다...
1-2. 새로운 아이디어
캐시에 저장된 순서에 방문 history를 반영한다. 다시 말해서 캐시 vector에서 가장 앞에 저장된 것일수록 방문한 지 오래된 도시가 된다. 이는 LRU 알고리즘에 따라 가장 먼저 캐시에서 배출되어야 할 대상이다.
(주의) 어떤 도시 이름이 캐시 내 존재할 때에도 해당 도시 이름을 캐시에서 제거하고 다시 캐시 맨 뒤에 위치시켜야 한다. (방문 순서 update)
2. 코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> cache;
int solution(int cacheSize, vector<string> cities) {
int answer = 0;
for (int i = 0; i < cities.size();i++) { //도시이름 소문자화
for (int j = 0; j < cities[i].size();j++) {
if ('A' <= cities[i][j] && cities[i][j] <= 'Z') {
cities[i][j] += 32;
}
}
}
vector<string>::iterator it;
for (string x : cities) {
it = find(cache.begin(), cache.end(), x);
if (cacheSize == 0) {
answer += 5;
}
else {// cacheSize > 0
if (it == cache.end()) { //cache에 없으면
answer += 5;
if (cache.size() < cacheSize) { //cache 자리 남으면
cache.emplace_back(x);
}
else { //cache 자리 없으면
cache.erase(cache.begin()); //맨 앞 노드를 제거한다.
cache.emplace_back(x); //새로운 노드를 맨 뒤에 추가한다.
}
}
else { //cache에 있으면
answer += 1;
cache.erase(it); //해당 노드 삭제
cache.emplace_back(x); //새로운 노드를 맨 뒤에 추가한다.(방문 순서 업데이트)
}
}
}
return answer;
}
|
'PS' 카테고리의 다른 글
블록 이동하기 (C++) 2020 KAKAO BLIND RECRUITMENT (0) | 2020.08.18 |
---|---|
기둥과 보 설치 (C++) 2020 KAKAO BLIND RECRUITMENT (0) | 2020.08.18 |
BOJ 11866 요세푸스 문제 0 (0) | 2020.04.05 |
BOJ 2629 양팔저울 (0) | 2020.04.03 |
BOJ 2210 숫자판 점프 (0) | 2020.03.26 |
- Total
- Today
- Yesterday
- SOLID
- BOJ
- provider
- 객체지향
- 디자인패턴
- 템플릿콜백
- 예외처리
- OOP
- 토비의봄TV
- c++
- gracefulshutdown
- 백기선
- 프록시패턴
- 카카오
- 자바
- 코테
- 메서드레퍼런스
- 김영한
- AOP
- 서비스추상화
- java
- 프록시
- 스프링
- 데코레이터패턴
- 코딩테스트
- 토비
- ec2
- 프로그래머스
- 자바스터디
- 토비의스프링
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |