할인 행사

NJW·2023년 4월 27일
0

코테

목록 보기
153/170

문제 설명

10일 간 정현이가 원하는 할인 제품과 수량이 마트에서 진행하는 할인 이벤트와 같은지 확인하는 문제다.

문제 풀이

첫 번째 접근

일단 처음에는 마트 할인에서 10일을 잡아서 확인해준 다음에 한 칸씩 뒤로 옮기면 될 거라고 생각했다. 효율성 문제가 걸리긴 했지만 일단 해보자는 마음으로 코드를 작성했고 실제로 통과가 됐다..! 완전 통과는 아니고 11번 하나 빼고.

도대체 뭐가 문제인가? 싶었더니 바로 10일에 있었다. 만일 마트의 할인일이 9일밖애 없다고 하자. 그러면 정현이의 10일을 완전히 체울 수 없다. 그러므로 이 때는 검사를 하면 안 되는 것이다. 때문에 위의 상황을 고려해줘야 한다.

두 번째 접근

첫 번째 접근에서 고려한 사항들을 가지고 다시 코드를 짰다. 이번에는 두 번째 날짜부터 검사를 할때 기간을 전체 discount에서 10 빼준 값으로 한정해줬다. 이렇게 하면 마지막 날짜에도 총 10일을 검사 할 수 있게 된다.

코드

java

import java.util.*;

class Solution {
    public static Map<String, Integer> original;
    public static Map<String, Integer> map;
    
    public int solution(String[] want, int[] number, String[] discount) {
        int answer = 0;
        original = new HashMap<>();
        map = new HashMap<>();
        
        // 일단 want에서 map으로
        for(int i=0; i<want.length; i++){
            original.put(want[i], number[i]);
        }
        
        //초반 10개
        for(int i=0; i<10; i++){
            map.put(discount[i], map.getOrDefault(discount[i], 0)+1);
        }
        
        if(check() == true){
            answer++;
        }
        
        
        for(int i=1; i<= discount.length - 10; i++){
            map.put(discount[i-1], map.get(discount[i-1])-1);
            
            map.put(discount[i+10-1], map.getOrDefault(discount[i+10-1], 0)+1);
            
            if(check() == true){
                answer++;
            }
        }
        return answer;
    }
    
    public static boolean check(){
        for(String key : original.keySet()){
            if(map.containsKey(key) == false){
                return false;
            }else{
                if(map.get(key) != original.get(key)){
                    return false;
                }
            }
        }
        
        return true;
    }
}

Python

파이썬은 좀 더 간단하게 풀 수 있다. 일단 zip을 이용해 want와 number을 묶어주고 Collections에 있는 Counter 클래스로 총 열 개의 값의 횟수를 구해서 비교해주면 된다.

딕셔너리 값을 그냥 비교해도 되는 게 좀 놀랍다.

from collections import Counter

def solution(want, number, discount):
    answer = 0
    original = {}
    
    for index, count in zip(want, number):
        original[index] = count
        
    
    for i in range(0, len(discount)-9):
        # Counter 각 원소가 몇 번 나오는지 세서 딕셔너리를 만들어 줌.
        c = Counter(discount[i:i+10])
        
        if c == original:
            answer += 1
            
    return answer

여담

정처기 실기와 중간고서가 겹쳐서 한동안 코테를 준비하지 못했다. 이제 둘 다 끝났으니 다시 준비해야지. 으아~~~ 정처기 실기 한 번에 합격하게 해주세요. 가채점 결과는 합격인데 그래도 결과 나오기 전에는 모르는 거니까...

profile
https://jiwonna52.tistory.com/

0개의 댓글