본문 바로가기
Algorithm/Problem_프로그래머스

프로그래머스(캐시, 압축) - Java

by uyoo 2020. 5. 14.

[캐시]

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;
    }
}