Algorithm/Problem_프로그래머스
프로그래머스(캐시, 압축) - Java
uyoo
2020. 5. 14. 14:33
[캐시]
https://programmers.co.kr/learn/courses/30/lessons/17680
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
* 로직
- 만약 캐시 사이즈가 0이라면 -> cities의 개수 * 5를 리턴
- 1개 이상이라면 로직을 진행한다
- 우선 도시들을 소문자로 변환한다
- 캐시 사이즈만큼 도시를 담을 수 있는 list를 생성한다
- cities를 차례대로 꺼내어
- 만약 해당 도시가 이미 존재한다면
- 기존에 있던 해당 도시를 제거하고 가장 최신으로 갱신
- answer += 1
- 존재하지 않는다면
- list가 캐시 사이즈보다 같거나 크다면 -> 가장 오래된 부분을 제거, 해당 도시를 맨 앞으로 추가
- 그 반대라면 -> 가장 앞으로 해당 도시를 추가
- answer += 5
- 만약 해당 도시가 이미 존재한다면
import java.util.LinkedList;
class Solution {
public int solution(int cacheSize, String[] cities) {
int answer = 0;
LinkedList<String> list = new LinkedList<>();
if(cacheSize == 0) {
answer = cities.length * 5;
}
else {
for(String city : cities) {
city = city.toLowerCase();
// 만약 해당 도시가 이미 존재한다면 -> 캐싱: 해당 도시를 가장 최신으로 갱신
if(list.contains(city)) {
list.remove(city);
list.addFirst(city);
answer+=1;
}
// 존재하지 않는다면
else {
// 리스트가 캐시 사이즈를 넘어갔다면 -> 가장 오래된 부분을 제거하고, 해당 도시 맨 앞으로 추가
if(list.size() >= cacheSize) {
list.removeLast();
list.addFirst(city);
}
// 넘지 않았다면 -> 가장 앞으로 추가
else {
list.addFirst(city);
}
answer+=5;
}
}
}
return answer;
}
}
[압축]
https://programmers.co.kr/learn/courses/30/lessons/17684
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
* 로직
- A ~ Z까지 알파벳 한 글자에 대한 색인 번호를 HashMap에 미리 추가해놓는다
- msg의 길이만큼 탐색을 진행한다
- 첫 번째 글자를 꺼내어 해당 글자가 이미 존재하는지 판단한다
- 만약 존재한다면
- 현재 구할 수 있는 색인 번호를 담아둔다(index)
- 그리고 다음 글자와 합친다
- 존재하지 않는다면
- 현재 만들어진 단어를 사전에 추가한다(27부터)
- 반복 종료
- 위 과정이 한 번 끝나면 구할 수 있는 색인 번호(index)를 답 리스트(results)에 추가한다
- 위 과정을 반복한다
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
public int[] solution(String msg) {
int[] answer = {};
// 알파벳 한글자에 대한 사전 입력
HashMap<String, Integer> hashMap = new HashMap<>();
for(int i=65; i<=90; ++i) {
char ch = (char) (i);
hashMap.put(Character.toString(ch), (i-64));
}
// 진행
ArrayList<Integer> results = new ArrayList<>();
int dictionaryIdx = 26;
int s=0;
while (s < msg.length()) {
// 현재입력
String currWord = msg.substring(s, s+1);
int index = 0;
int i=s;
while (true) {
// 현재 글자가 이미 존재한다면 -> index를 저장하고 -> 다음 문자와 붙였을 때 경우 고려
if(hashMap.containsKey(currWord)) {
index = hashMap.get(currWord);
i++;
// 마지막 글자인 경우
if(i >= msg.length()) {
s = i;
break;
}
currWord += msg.substring(i, i+1);
}
// 더이상 존재하지 않는다면 -> 만들어진 단어 사전 추가, 출력할 index 리스트에 보관
else {
hashMap.put(currWord, ++dictionaryIdx);
s = i;
break;
}
}
results.add(index);
}
answer = new int[results.size()];
for(int i=0; i<answer.length; ++i) {
answer[i] = results.get(i);
}
return answer;
}
}