문제
https://school.programmers.co.kr/learn/courses/30/lessons/131127#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
map 자료구조를 활용하여 쉽게 풀 수 있었다.
우선 내가 원하는 값들을 [제품, 개수] 형식으로 초기화 해준다.
다음에는 할인 현황을 담을 map 을 계속 갱신해준다.
하루가 지남에 따라 가장 앞의 값을 제거해주고, 새로운 제품을 추가해준다.
그리고 할인중인 목록에 내 제품이 있으면서, 개수도 다 만족한다면 정답에 값을 추가해주면 된다.
(단, 할인 현황 map에 개수가 10개가 되기전까지는 빼는 로직 없이 더해주기만 하면 된다.)
코드
import java.util.*;
class Solution {
public boolean isPossible(Map<String, Integer> wish, Map<String, Integer> now){
for(String k : wish.keySet()){
// (1) wish 맵 key 값이 now에 존재하는가?
if(now.containsKey(k) == false) return false;
// (2) 존재한다면, wish 의 value 값과 같거나 큰 값을 now가 가지고 있는가?
if(now.get(k) < wish.get(k)) return false;
}
return true;
}
public int solution(String[] want, int[] number, String[] discount) {
int answer = 0;
// 내가 원하는 값 초기화
Map<String, Integer> wish = new HashMap<>();
for(int i=0; i<want.length; i++){
wish.put(want[i], number[i]);
}
Map<String, Integer> now = new HashMap<>();
int count = 0;
int front = 0;
for(int back=0; back<discount.length; back++){
// 10개가 차기 전에는 우선 다 넣어준다.
if(count < 10){
String k = discount[back];
if(now.containsKey(k)){
now.put(k, now.get(k)+1);
} else{
now.put(k, 1);
}
if(this.isPossible(wish, now)) answer++;
count++;
continue;
}
// 가장 앞의 값 삭제
String fk = discount[front];
if(now.get(fk) == 1){
now.remove(fk);
} else{
now.put(fk, now.get(fk)-1);
}
// 새로운 값 추가
String bk = discount[back];
if(now.containsKey(bk)){
now.put(bk, now.get(bk)+1);
} else{
now.put(bk, 1);
}
// 비교하기
if(this.isPossible(wish, now)) answer++;
front++;
}
return answer;
}
}
후기
쉽게 풀었으나, 10개 되기전에 검사하는 로직을 빼먹어서 처음에 틀렸었다.
채점을 안해주는 상황이면 이런 부분에 있어 특히나 섬세할 필요가 있는데 어렵다 ㅠㅠ
'프로그래머스' 카테고리의 다른 글
LV2 프로세스 (Java) (1) | 2023.11.14 |
---|---|
LV2 H-Index (Java) (1) | 2023.11.13 |
LV2 연속 부분 수열 합의 개수 (Java) (0) | 2023.11.12 |
LV2 멀리 뛰기 (Java) (0) | 2023.11.10 |
LV2 N개의 최소공배수 (Java) (0) | 2023.11.10 |