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;
}
}
'[ 다먹살 ] > - Coding' 카테고리의 다른 글
[프로그래머스] 레벨0 분수의 덧셈 (0) | 2022.10.20 |
---|---|
[프로그래머스] 레벨2 피로도 (0) | 2022.10.19 |
[프로그래머스] 레벨1 숫자 짝꿍 (0) | 2022.10.18 |
[프로그래머스] 레벨1 삼총사 (0) | 2022.10.18 |
[프로그래머스] 레벨1 성격 유형 검사하기 (0) | 2022.10.17 |
댓글