Algorithm
[프로그래머스] 할인 행사
쑤야.
2023. 12. 18. 13:36
https://school.programmers.co.kr/learn/courses/30/lessons/131127?language=python3
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근
- 회원 자격 10일 → 슬라이딩 윈도우 활용
- 제품 구매 수량을 카운팅 → 딕셔너리 활용
로직
- 구매해야 하는 상품과, 앞으로 구매해야 하는 개수를 담은 제품 카운팅 딕셔너리를 생성 후, 초기화한다.
- 0부터 9까지 처음 10개에 대해서 카운팅을 갱신한다.
- 인덱스 10부터 discount의 길이 + 10까지 반복문을 시작한다.
- 10을 모두 고려하지 않고, 9일 또는 8일 등에 대해서도 조건을 충족할 수 있기 때문이다.
- 반복문에서 각각의 상품이 앞으로 구매해야 하는 개수가 모두 0이하라면, 조건을 충족한 것이므로 result를 1 더해준다.
- 10일 전 날짜에 대한 할인 상품의 구매는 취소하고, 지금의 날짜에 대한 할인 상품은 구매한다.
주의점
- 개수를 늘리고 줄일 때, 양수 값으로만 변경 제한을 걸면 실패한다. 즉, 음수로 값이 변경되어도 된다.
코드
def solution(want, number, discount):
wantMap = {}
for (i, w) in enumerate(want):
wantMap[w] = number[i]
for i in discount[0:10]:
if i in want:
wantMap[i] -= 1
result = 0
for i in range(10, len(discount)+10):
if all(x <= 0 for x in wantMap.values()):
result += 1
if i < len(discount) and discount[i] in wantMap:
wantMap[discount[i]] -= 1
if discount[i-10] in wantMap:
wantMap[discount[i-10]] += 1
return result
func solution(_ want:[String], _ number:[Int], _ discount:[String]) -> Int {
var map = [String:Int]()
for (i, w) in want.enumerated() {
map[w] = number[i]
}
for i in discount[0..<10] {
if map[i] != nil {
map[i]! -= 1
}
}
var result = 0
for i in 10..<discount.count+10{
//가입 가능 날짜인지 점검
if map.allSatisfy({ $0.value <= 0 }) {
result += 1
}
//날짜 슬라이딩 윈도우
if i < discount.count && map[discount[i]] != nil {
map[discount[i]]! -= 1
}
if map[discount[i-10]] != nil {
map[discount[i-10]]! += 1
}
}
return result
}