Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

66-9kyo-hwang #225

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open

66-9kyo-hwang #225

wants to merge 9 commits into from

Conversation

9kyo-hwang
Copy link
Collaborator

@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

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.

2 participants