본문 바로가기
[ 다먹살 ]/- Coding

[프로그래머스] 레벨2 할인 행사

by 엉망으로살기 2022. 10. 18.
반응형

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

사람마다 다양한 풀이법이 있겠지만 나는 이 문제를 HashMap을 이용해서 풀었다. 아무래도 이 문제처럼 순서가 중요하지 않은 경우에는 Map을 활용하는 게 꽤 유용하다고 생각된다.

 

1. Map형태의 buy 변수에 각 항목별로 구매해야 할 갯수를 저장한다.

  1-1. 이 때 day 변수에 전체 구매할 날짜를 구해 저장한다.

2. discount 배열를 순회하면서 구매해야 할 일수(=day)만큼 범위를 잘라 Map형태의 market 변수에 항목별로 갯수를 저장한다.

  2-1. 저장된 모든 데이터 중 항목을 key로 선택해서 같은 구매물품이 buy와 market에 똑같은 갯수가 필요한 지 체크하며 항목 자체가 없거나, 항목이 있어도 갯수가 하나라도 다를 경우 바로 break를 걸어 반복문을 종료시킨다.

  2-2. 결국 break에 걸리지 않은 날짜는 문제의 조건을 만족하는 날짜이므로 이 때 answer에 +1 증가시키며, 전체 반복문을 종료한 후 answer를 리턴한다.

 


문제 및 입출력


코드

import java.util.HashMap;
import java.util.Map.Entry;

class Solution
{
    public int solution(String[] want, int[] number, String[] discount)
    {
        int answer = 0;
        HashMap<String, Integer> buy = new HashMap<String, Integer>();
        HashMap<String, Integer> market = new HashMap<String, Integer>();
        int day = 0;
        boolean chk = true;
        
        for(Integer i : number)
        {
            day += i;
        }
        for(int i=0; i<want.length; i++)
        {
            buy.put(want[i],number[i]);
        }
        for(int i=0; i<=discount.length-day; i++)
        {
            market.clear();
            chk = true;
            
            for(int j=i; j<i+day; j++)
            {
                if(market.containsKey(discount[j]))
                {
                    market.put(discount[j], market.get(discount[j])+1);
                }
                else
                {
                    market.put(discount[j], 1);
                }
            }
            for(Entry<String, Integer> e : buy.entrySet())
            {
                if(!market.containsKey(e.getKey()))
                {
                    chk = false;
                    break;
                }
                else
                {
                    if(market.get(e.getKey())!=buy.get(e.getKey()))
                    {
                        chk = false;
                        break;
                    }
                }
            }
            if(chk)
            {
                answer++;
            }
        }
        
        return answer;
    }
}

반응형

댓글