Skip to content

Conversation

@9kyo-hwang
Copy link
Member

@9kyo-hwang 9kyo-hwang commented Sep 14, 2024

πŸ”— 문제 링크

할인 행사

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

30λΆ„

✨ μˆ˜λ„ μ½”λ“œ

1. 문제

10일 λ™μ•ˆ νšŒμ› 자격이 λΆ€μ—¬λœλ‹€. νšŒμ›μ€ 맀일 ν•œ κ°€μ§€ μ œν’ˆμ„ 할인받을 수 μžˆλ‹€. μ œν’ˆμ€ ν•˜λ£¨μ— ν•˜λ‚˜λ§Œ ꡬ맀할 수 μžˆλ‹€.
예λ₯Ό λ“€μ–΄, 14일간 [μΉ˜ν‚¨, 사과, 사과, λ°”λ‚˜λ‚˜, μŒ€, 사과, 돼지고기, λ°”λ‚˜λ‚˜, 돼지고기, μŒ€, 냄비, λ°”λ‚˜λ‚˜, 사과, λ°”λ‚˜λ‚˜] μˆœμ„œλŒ€λ‘œ μ œν’ˆμ„ ν• μΈν•œλ‹€κ³  ν•˜μž. λ‚˜λŠ” λ°”λ‚˜λ‚˜ 3개, 사과 2개, μŒ€ 2개, 돼지고기 2개, 냄비 1개λ₯Ό ν• μΈν•΄μ„œ 사고 μ‹Άλ‹€.

  1. 첫째 λ‚ λΆ€ν„° μ—΄ν˜ κ°„μ—λŠ” 냄비가 ν• μΈν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 첫째 λ‚ μ—λŠ” νšŒμ›κ°€μž…μ„ ν•˜μ§€ μ•ŠλŠ”λ‹€.
  2. λ‘˜μ§Έ λ‚ λΆ€ν„° μ—΄ν˜ κ°„μ—λŠ” λ°”λ‚˜λ‚˜λ₯Ό μ›ν•˜λŠ” 만큼 할인ꡬ맀할 수 μ—†κΈ° λ•Œλ¬Έμ— λ‘˜μ§Έ 날에도 νšŒμ›κ°€μž…μ„ ν•˜μ§€ μ•ŠλŠ”λ‹€.
  3. μ…‹μ§Έ λ‚ , λ„·μ§Έ λ‚ , λ‹€μ„―μ§Έ λ‚ λΆ€ν„° 각각 μ—΄ν˜μ€ μ›ν•˜λŠ” μ œν’ˆκ³Ό μˆ˜λŸ‰μ΄ μΌμΉ˜ν•œλ‹€.

μ›ν•˜λŠ” μ œν’ˆμ„ λͺ¨λ‘ 할인 받을 수 μžˆλŠ” λ‚ μ§œλŠ” μ…‹μ§Έ λ‚ , λ„·μ§Έ λ‚ , λ‹€μ„―μ§Έ λ‚ λ‘œ 총 3일이닀.
이와 같이 νšŒμ›λ“±λ‘μ‹œ μ›ν•˜λŠ” μ œν’ˆμ„ λͺ¨λ‘ 할인 받을 수 μžˆλŠ” νšŒμ›λ“±λ‘ λ‚ μ§œμ˜ 총 일수λ₯Ό return ν•˜λŠ” solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ•Ό ν•œλ‹€. κ°€λŠ₯ν•œ 날이 μ—†μœΌλ©΄ 0을 return ν•œλ‹€.

2. μ„€λͺ…

μ£Όμ–΄μ§€λŠ” 총 μ œν’ˆ κ°œμˆ˜κ°€ μ΅œλŒ€ 100,000개이기 λ•Œλ¬Έμ—, 맀번 10일 κ°„ ν• μΈν•˜λŠ” ν’ˆλͺ© μˆ˜λŸ‰μ„ κ³„μ‚°ν•˜κΈ°μ—” μ‹œκ°„μ΄ λ„ˆλ¬΄ 였래 κ±Έλ¦°λ‹€.
할인 기간이 "10일"둜 κ³ μ •λ˜μ–΄ 있기 λ•Œλ¬Έμ—, μ—¬κΈ°μ„œλŠ” μŠ¬λΌμ΄λ”© μœˆλ„μš° 기법을 μ‚¬μš©ν•˜λŠ” 것이 μ μ ˆν•˜λ‹€.
image

단, μ—¬κΈ°μ„œλŠ” λ¬Έμžμ—΄ μ›μ†Œλ₯Ό μΉ΄μš΄νŒ…ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— map 자료ꡬ쑰λ₯Ό μ‚¬μš©ν•΄ μ‘μš©ν•œλ‹€.

int solution(vector<string> InWants, vector<int> InNumbers, vector<string> InDiscounts) 
{
    unordered_map<string, int> NumberbyWants;
    for(int i = 0; i < 9; ++i)
    {
        NumberbyWants[InDiscounts[i]]++;  // 9μΌκΉŒμ§€μ˜ ν• μΈλ˜λŠ” μ œν’ˆλ“€μ˜ 개수λ₯Ό μΉ΄μš΄νŒ…ν•œλ‹€.
    }

    ...
}

string, 즉 μ œν’ˆ λ¬Έμžμ—΄μ„ key둜 ν•΄μ„œ 각각의 μ œν’ˆλ“€μ΄ λͺ‡ 개 할인 쀑인지 κΈ°λ‘ν•˜λŠ” NumberbyWantsλ₯Ό μ„ μ–Έν•œλ‹€.
νšŒμ› 자격이 μ—΄ν˜ μœ μ§€λ˜κΈ° λ•Œλ¬Έμ—, μš°μ„  졜초의 9일 할인 μ œν’ˆλ“€μ„ κΈ°λ‘ν•œλ‹€.

    int Answer = 0;
    for(int i = 9; i < InDiscounts.size(); ++i)
    {
        NumberbyWants[InDiscounts[i]]++;  // ν˜„μž¬ 할인 ν’ˆλͺ© map에 기둝(right pointer++)
        bool Flag = true;
        
        for(int j = 0; j < InWants.size(); ++j)  // Wants 배열을 μˆœνšŒν•˜λ©°
        {
            if(NumberbyWants[InWants[j]] != InNumbers[j])  // Wants ν•­λͺ©μ˜ μˆ˜λŸ‰(Number)와 μΌμΉ˜ν•˜μ§€ μ•Šλ‹€λ©΄ 이 기간은 쑰건 뢈좩쑱
            {
                Flag = false;
                break;
            }
        }
        
        Answer += Flag;
        NumberbyWants[InDiscounts[i - 9]]--;  // 첫째 λ‚  할인 ν’ˆλͺ© μ œμ™Έ(left pointer++)
    }

    return Answer;

이제 10일째뢀터 μŠ¬λΌμ΄λ”© μœˆλ„μš° 기법을 μ μš©ν•œλ‹€.

  • ν˜„μž¬ λ‚ μ§œμ˜ 할인 μ œν’ˆμ„ map에 μΉ΄μš΄νŒ…ν•œλ‹€.
  • map을 μˆœνšŒν•˜λ©° λ‚΄κ°€ μ›ν•˜λŠ” ν’ˆλͺ©μ˜ κ°œμˆ˜μ™€ ν•˜λ‚˜λΌλ„ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ Flagλ₯Ό false둜 ν•˜κ³  순회λ₯Ό μ€‘λ‹¨ν•œλ‹€.
  • λ§Œμ•½ 반볡문이 μ’…λ£ŒλλŠ”λ°λ„ Flagκ°€ true라면 μ§€κΈˆκΉŒμ§€μ˜ μ—΄ν˜μ€ λ‚˜μ˜ 쑰건을 μΆ©μ‘±ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ Answer += 1을 ν•œλ‹€.
  • λ§ˆμ§€λ§‰μœΌλ‘œ 첫째 λ‚  ν• μΈν•˜λŠ” ν’ˆλͺ©μ„ mapμ—μ„œ μ œκ±°ν•œλ‹€.
전체 μ½”λ“œ

#include <string>
#include <vector>
#include <unordered_map>

using namespace std;

int solution(vector<string> InWants, vector<int> InNumbers, vector<string> InDiscounts) 
{
    unordered_map<string, int> NumberbyWants;
    for(int i = 0; i < 9; ++i)
    {
        NumberbyWants[InDiscounts[i]]++;
    }
    
    int Answer = 0;
    for(int i = 9; i < InDiscounts.size(); ++i)
    {
        NumberbyWants[InDiscounts[i]]++;
        bool Flag = true;
        
        for(int j = 0; j < InWants.size(); ++j)
        {
            if(NumberbyWants[InWants[j]] != InNumbers[j])
            {
                Flag = false;
                break;
            }
        }
        
        Answer += Flag;
        NumberbyWants[InDiscounts[i - 9]]--;
    }
    
    return Answer;
}

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

사싀 처음 ν’€μ—ˆμ„ 땐 λˆ„μ ν•© 방식을 μ¨μ„œ 개수λ₯Ό κ΅¬ν–ˆλŠ”λ°, μƒκ°ν•΄λ³΄λ‹ˆ μŠ¬λΌμ΄λ”© μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ 개수 μ„ΈλŠ” κ±Έ μ‹€μ‹œκ°„μœΌλ‘œ λΉ λ₯΄κ²Œ ν•  수 μžˆμ„ 것 κ°™μ•„ μ½”λ“œλ₯Ό μˆ˜μ •ν–ˆλ‹€.

Copy link
Collaborator

@mjj111 mjj111 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

λ”•μ…”λ„ˆλ¦¬λž‘ μŠ¬λΌμ΄λ”©μœˆλ„μš° 같이 ν‘ΈλŠ” 문제라 μž¬λ°Œλ„€μš”!!!!

import collections

def can_membership(foods, want):
    for food in want:
        if foods[food] > 0:  
            return False
    return True

def solution(want, number, discount):
    foods = collections.defaultdict(int)
    
    for food, count in zip(want, number):
        foods[food] = count

    n = len(discount)
    
    for food in discount[:10]:
        foods[food] -= 1

    answer = 0
    start = 0
    end = 9
    
    while True:
        if can_membership(foods, want):
            answer += 1
        
        if end + 1 == n:  
            break
        foods[discount[start]] += 1 
        
        start += 1
        end += 1
        foods[discount[end]] -= 1 
        
    return answer

Copy link
Member

@gjsk132 gjsk132 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ν• μΈν•˜λŠ” λ¬Όν’ˆκ³Ό μ›ν•˜λŠ” λ¬Όν’ˆμ˜ μˆ˜λŸ‰μ„ 일일히 ν•˜μ§€ μ•Šκ³ , sum으둜 ν•œ λ²ˆμ— λ”ν•˜μ—¬ μ²˜λ¦¬ν•œ 것 λ§κ³ λŠ” λ™μΌν•œ λ°©λ²•μœΌλ‘œ ν’€μ΄ν–ˆμŠ΅λ‹ˆλ‹€!

μ§€κΈˆ 생각해보면, μ œκ°€ μ§  전체 μˆœν™˜ν•˜μ—¬ λ”ν•˜λŠ” μ½”λ“œλ³΄λ‹€
μ„ λ°°λ“€μ²˜λŸΌ 쑰건문으둜 아닐 λ•Œ λ°”λ‘œ κ·Έλ§Œλ‘λŠ”κ²Œ 더 λ‚˜μ„ 것 κ°™λ„€μš”πŸ« 

def solution(want, number, discount):
    left_shopping_list = {x : y for x, y in zip(want, number)}

    can_sign_up = 0

    for day, dc in enumerate(discount):
        if dc in want:        
            left_shopping_list[dc] -= 1

        if day < 9:
            continue
        elif not day == 9:
            finish_dc = discount[day-10]

            if finish_dc in want:
                left_shopping_list[finish_dc] += 1
        
        left_cnt = sum([max(cnt, 0) for cnt in left_shopping_list.values()])

        if left_cnt == 0:
            can_sign_up += 1

    return can_sign_up

@9kyo-hwang 9kyo-hwang merged commit 9e88cda into main Apr 30, 2025
2 checks passed
@9kyo-hwang 9kyo-hwang deleted the 66-9kyo-hwang branch April 30, 2025 06:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants