[프로그래머스] (lv.2) 캐시 (java)

0

코딩테스트

목록 보기
16/37
post-thumbnail

<문제>

https://school.programmers.co.kr/learn/courses/30/lessons/17680

<나의 풀이>

import java.util.ArrayList;

public class 캐시 {
    public static void main(String[] args) {
        int cacheSize = 2;
        String[] cities = {"Jeju", "Pangyo", "NewYork", "newyork"};

        ArrayList<String> list = new ArrayList<>();
        String[] lowerCities = new String[cities.length];
        int answer = 0;
        // lowerCase 변경
        for (int i = 0; i < cities.length; i++) {
            lowerCities[i] = cities[i].toLowerCase();
        }
        // 2. case 사이즈 체크
        if (cacheSize != 0) {
            for (String city : lowerCities) {
                if (list.size() < cacheSize) {
                    if (list.contains(city)) {
                        answer += 1;
                        list.remove(city);
                        list.add(city);
                    } else {
                        list.add(city);
                        answer += 5;
                    }

                } else {
                    if (list.contains(city)) {
                        answer += 1;
                        list.remove(city);
                        list.add(city);
                    } else {
                        list.remove(0);
                        answer += 5;
                        list.add(city);

                    }
                }
            }
        } else {
            answer = 5 * (cities.length);
        }

        System.out.println(list.toString());

        System.out.println(answer);
    }
}

<리펙토링>

import java.util.ArrayList;
class Solution {
    public int solution(int cacheSize, String[] cities) {
        ArrayList<String > list = new ArrayList<>();
        int answer = 0;

        if (cacheSize != 0) {   // cacheSize 체크
            for (int i = 0; i < cities.length; i++) {
                // 대소문자 구분 X
                cities[i] = cities[i].toLowerCase();
                // cities 포함 여부 확인
                if(list.contains(cities[i])){
                    answer += 1;
                    list.remove(cities[i]);
                    list.add(cities[i]);
                }
                else {
                    answer += 5;
                    if(list.size()<cacheSize) list.add(cities[i]);
                    else {
                        list.remove(0);
                        list.add(cities[i]);
                    }
                }
            }
        } else {
            answer = 5 * (cities.length);
        }
        
        return answer;
    }
}

<다른사람 풀이>

import java.util.ArrayList;

class Solution {
    public static int solution(int cacheSize, String[] cities) {
        int answer = 0;
        ArrayList<String> list = new ArrayList<String>();

        if (cacheSize == 0)
            return cities.length * 5;

        for (int i = 0; i < cities.length; i++) {
            cities[i] = cities[i].toUpperCase();

            if (list.contains(cities[i])) {
                answer++;
                list.remove(cities[i]);
                list.add(cities[i]);
            } else {
                answer += 5;
                if (list.size() == cacheSize) {
                    list.remove(0);
                    list.add(cities[i]);
                }
                else 
                    list.add(cities[i]);
            }
        }
        return answer;
    }
}

<핵심 개념>

캐시 hit, miss, 캐시 교체 알고리즘 LRU(Least Recently Used)을 직접 구현한 경험!

<피드백>

분기문을 몇번을 탄거야..
1) cacheSize 체크
2) ArrayList.contains()는 대소문자 구분 필수
이래서 유효성검사를 하는구나 싶고

리펙토링 해봤는데 다른분의 풀이를 보니 그 분 풀이가 더 깔끔한 것 같다. 먼저 짧은건 위에 짧게 적어주고 길어지는 부분은 아래로 내려야지 가독성이 더 좋은느낌.

그래도 처음으로 스스로 풀어낸 Lv.2다! 뿌듯하다!
분기문 처리 할 때 더 깔끔하게 쓸 수 있는 방법을 생각하며 코드를 짜자. 이 부분이 약한 것 같다.

profile
두둥탁 뉴비등장

1개의 댓글

comment-user-thumbnail
2023년 7월 28일

공감하며 읽었습니다. 좋은 글 감사드립니다.

답글 달기