πŸ”₯[99클럽 μ½”ν…Œ μŠ€ν„°λ””] 27일차 TIL - 할인 행사

HOONSSACΒ·2024λ…„ 8μ›” 17일
1

99Club Coding Test Study

λͺ©λ‘ 보기
27/41
post-thumbnail
post-custom-banner

⏳문제

XYZ λ§ˆνŠΈλŠ” μΌμ •ν•œ κΈˆμ•‘μ„ μ§€λΆˆν•˜λ©΄ 10일 λ™μ•ˆ νšŒμ› μžκ²©μ„ λΆ€μ—¬ν•©λ‹ˆλ‹€. XYZ λ§ˆνŠΈμ—μ„œλŠ” νšŒμ›μ„ λŒ€μƒμœΌλ‘œ 맀일 ν•œ 가지 μ œν’ˆμ„ ν• μΈν•˜λŠ” 행사λ₯Ό ν•©λ‹ˆλ‹€. ν• μΈν•˜λŠ” μ œν’ˆμ€ ν•˜λ£¨μ— ν•˜λ‚˜μ”©λ§Œ ꡬ맀할 수 μžˆμŠ΅λ‹ˆλ‹€. μ•Œλœ°ν•œ μ •ν˜„μ΄λŠ” μžμ‹ μ΄ μ›ν•˜λŠ” μ œν’ˆκ³Ό μˆ˜λŸ‰μ΄ ν• μΈν•˜λŠ” λ‚ μ§œμ™€ 10일 μ—°μ†μœΌλ‘œ μΌμΉ˜ν•  κ²½μš°μ— λ§žμΆ°μ„œ νšŒμ›κ°€μž…μ„ ν•˜λ € ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, μ •ν˜„μ΄κ°€ μ›ν•˜λŠ” μ œν’ˆμ΄ λ°”λ‚˜λ‚˜ 3개, 사과 2개, μŒ€ 2개, 돼지고기 2개, 냄비 1개이며, XYZ λ§ˆνŠΈμ—μ„œ 14일간 νšŒμ›μ„ λŒ€μƒμœΌλ‘œ ν• μΈν•˜λŠ” μ œν’ˆμ΄ λ‚ μ§œ μˆœμ„œλŒ€λ‘œ μΉ˜ν‚¨, 사과, 사과, λ°”λ‚˜λ‚˜, μŒ€, 사과, 돼지고기, λ°”λ‚˜λ‚˜, 돼지고기, μŒ€, 냄비, λ°”λ‚˜λ‚˜, 사과, λ°”λ‚˜λ‚˜μΈ κ²½μš°μ— λŒ€ν•΄ μ•Œμ•„λ΄…μ‹œλ‹€. 첫째 λ‚ λΆ€ν„° μ—΄ν˜ κ°„μ—λŠ” 냄비가 ν• μΈν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 첫째 λ‚ μ—λŠ” νšŒμ›κ°€μž…μ„ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‘˜μ§Έ λ‚ λΆ€ν„° μ—΄ν˜ κ°„μ—λŠ” λ°”λ‚˜λ‚˜λ₯Ό μ›ν•˜λŠ” 만큼 할인ꡬ맀할 수 μ—†κΈ° λ•Œλ¬Έμ— λ‘˜μ§Έ 날에도 νšŒμ›κ°€μž…μ„ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ…‹μ§Έ λ‚ , λ„·μ§Έ λ‚ , λ‹€μ„―μ§Έ λ‚ λΆ€ν„° 각각 μ—΄ν˜μ€ μ›ν•˜λŠ” μ œν’ˆκ³Ό μˆ˜λŸ‰μ΄ μΌμΉ˜ν•˜κΈ° λ•Œλ¬Έμ— μ…‹ 쀑 ν•˜λ£¨μ— νšŒμ›κ°€μž…μ„ ν•˜λ € ν•©λ‹ˆλ‹€.

μ •ν˜„μ΄κ°€ μ›ν•˜λŠ” μ œν’ˆμ„ λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄ λ°°μ—΄ want와 μ •ν˜„μ΄κ°€ μ›ν•˜λŠ” μ œν’ˆμ˜ μˆ˜λŸ‰μ„ λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ λ°°μ—΄ number, XYZ λ§ˆνŠΈμ—μ„œ ν• μΈν•˜λŠ” μ œν’ˆμ„ λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄ λ°°μ—΄ discountκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, νšŒμ›λ“±λ‘μ‹œ μ •ν˜„μ΄κ°€ μ›ν•˜λŠ” μ œν’ˆμ„ λͺ¨λ‘ 할인 받을 수 μžˆλŠ” νšŒμ›λ“±λ‘ λ‚ μ§œμ˜ 총 일수λ₯Ό return ν•˜λŠ” solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜μ‹œμ˜€. κ°€λŠ₯ν•œ 날이 μ—†μœΌλ©΄ 0을 return ν•©λ‹ˆλ‹€.

πŸš¨μ œν•œ 사항

  • 1 ≀ want의 길이 = number의 길이 ≀ 10
  • 1 ≀ number의 μ›μ†Œ ≀ 10
  • number[i]λŠ” want[i]의 μˆ˜λŸ‰μ„ μ˜λ―Έν•˜λ©°, number의 μ›μ†Œμ˜ 합은 10μž…λ‹ˆλ‹€.
  • 10 ≀ discount의 길이 ≀ 100,000
  • want와 discount의 μ›μ†Œλ“€μ€ μ•ŒνŒŒλ²³ μ†Œλ¬Έμžλ‘œ 이루어진 λ¬Έμžμ—΄μž…λ‹ˆλ‹€.
  • 1 ≀ want의 μ›μ†Œμ˜ 길이, discount의 μ›μ†Œμ˜ 길이 ≀ 12

πŸ“„μž…μΆœλ ₯ 예

wantnumberdiscountresult
["banana", "apple", "rice", "pork", "pot"][3, 2, 2, 2, 1]["chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana"]3
["apple"][10]["banana", "banana", "banana", "banana", "banana", "banana", "banana", "banana", "banana", "banana"]0

πŸ“„μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1

  • 문제 μ˜ˆμ‹œμ™€ κ°™μŠ΅λ‹ˆλ‹€

μž…μΆœλ ₯ 예 #2

  • 사과가 ν• μΈν•˜λŠ” 날이 μ—†μœΌλ―€λ‘œ 0을 return ν•©λ‹ˆλ‹€.

βœοΈν’€μ΄

discount의 맨 μ•ž μš”μ†ŒλΆ€ν„° μΆ”μΆœν•΄ want에 ν¬ν•¨λ˜μ–΄ μžˆλŠ” 지 ν™•μΈν•˜κ³ , λ§Œμ•½ μžˆλ‹€λ©΄ κ·Έ μ œν’ˆμ˜ 개수λ₯Ό νŒŒμ•…ν•΄ ν•˜λ‚˜μ”© 차감해 λ‚˜κ°€λ©΄ 될 것 κ°™μ•˜λ‹€.
μ‚¬κ³ μž ν•˜λŠ” μ œν’ˆμ„ λͺ¨λ‘ μ‚° 경우λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ nowCountλ³€μˆ˜λ₯Ό ν•˜λ‚˜ 생성해, μ‚¬μ•Όν•˜λŠ” 물건의 총 개수둜 μ΄ˆκΈ°ν™”λ₯Ό ν•΄ μ€€ λ’€, μ›ν•˜λŠ” 물건을 ν•˜λ‚˜μ”© μ‚΄ λ•Œλ§ˆλ‹€ 1μ”© κ°μ†Œν•˜λ„λ‘ κ΅¬ν˜„ν•˜μ˜€λ‹€.
그리고, 반볡문의 λμ—μ„œ 이 nowCountκ°€ 0인지λ₯Ό 확인해, μ‚¬κ³ μž ν•˜λŠ” μ œν’ˆμ„ λͺ¨λ‘ μƒ€λŠ” 지에 λŒ€ν•œ μ—¬λΆ€λ₯Ό 확인할 수 μžˆμ—ˆλ‹€.

단, ν˜„μž¬ 할인 쀑인 μ œν’ˆμ΄ want 배열에 ν¬ν•¨λ˜μ–΄ μžˆλŠ” 지 ν™•μΈν•˜λŠ” κ³Όμ •μ—μ„œ for문을 μ‚¬μš©ν•˜λ©΄ μ‹œκ°„ λ³΅μž‘λ„κ°€ 컀질 κ±° κ°™μ•„
μ •ν˜„μ΄κ°€ μ‚¬κ³ μž ν•˜λŠ” μ œν’ˆκ³Ό 개수λ₯Ό key-value둜 κ°€μ§€λŠ” HashMap을 ν•˜λ‚˜ λ§Œλ“€κΈ°λ‘œ ν–ˆλ‹€.

HashMap<String, Integer> wantMap = new HashMap<>();

그리고 λ‚˜μ„œ, discount 배열을 μˆœνšŒν•΄μ•Ό ν•˜λŠ”λ°
μ•Œλœ°ν•œ μ •ν˜„μ΄λŠ” μžμ‹ μ΄ μ›ν•˜λŠ” μ œν’ˆκ³Ό μˆ˜λŸ‰μ΄ ν• μΈν•˜λŠ” λ‚ μ§œμ™€ 10일 μ—°μ†μœΌλ‘œ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€ ν–ˆμœΌλ―€λ‘œ,
μˆœνšŒν•  λ°°μ—΄μ˜ λ²”μœ„λ₯Ό λ‹€μŒκ³Ό 같이 지정해 μ£Όμ—ˆλ‹€.

for (int i = 0; i <= discount.length - totalCount; i++)

μ—¬κΈ°μ„œ totalCountλŠ” ν•„μš”ν•œ μ œν’ˆμ˜ 총 개수인데, discount의 κΈΈμ΄μ—μ„œ 이λ₯Ό λΉΌλ©΄, 연속 10일을 보μž₯ν•˜λŠ” λ²”μœ„ μ•ˆμ—μ„œ μˆœνšŒν•  수 μžˆλ‹€.
예λ₯Ό λ“€μ–΄, discount의 길이가 14이고, μ›ν•˜λŠ” μ œν’ˆμ΄ 10개라면,
discount의 4보닀 큰 μΈλ±μŠ€μ—μ„œλŠ” 10일 μ—°μ†μœΌλ‘œ μ‚΄ 수 μžˆλŠ” 경우의 μˆ˜κ°€ μ—†λ‹€.

λ‹€μŒμœΌλ‘œ, HashMap에 μ‚¬κ³ μž ν•˜λŠ” μ œν’ˆμ˜ 이름과 개수λ₯Ό μ €μž₯ν•΄ μ£Όμ—ˆλ‹€.

for (int k = 0; k < want.length; k++) {
	wantMap.put(want[k], number[k]);
}  

이제, discount의 i번째 μš”μ†ŒλΆ€ν„° 10개의 μš”μ†Œμ— λ°©λ¬Έν•˜λ©΄μ„œ ν˜„μž¬ ν• μΈν•˜λŠ” μ œν’ˆμ΄ wantMap에 μžˆλŠ” 지 확인해 μ£Όμ–΄μ•Ό ν•œλ‹€.
κ·Έλž˜μ„œ 쑰건문을 두 개둜 λΆ„κΈ°ν•΄ μ£Όμ—ˆλ‹€.

  • ν˜„μž¬ ν• μΈν•˜λŠ” μ œν’ˆμ΄ wantMap에 μ‘΄μž¬ν•˜μ§€ μ•Šκ±°λ‚˜, valueκ°’(ν•΄λ‹Ή μ œν’ˆμ˜ ν˜„μž¬ ν•„μš”ν•œ 개수)κ°€ 0μ΄ν•˜μΈ 경우
  • ν˜„μž¬ ν• μΈν•˜λŠ” μ œν’ˆμ΄ wantMap에 μ‘΄μž¬ν•˜κ³ , valueκ°’(ν•΄λ‹Ή μ œν’ˆμ˜ ν˜„μž¬ ν•„μš”ν•œ 개수)κ°€ 1이상인 경우
for (int j = i; j < i + 10; j++) {
	if (wantMap.containsKey(discount[j]) == false || wantMap.get(discount[j]) <= 0) {
		break;
	}
	else {
		wantMap.put(discount[j], wantMap.get(discount[j]) - 1);
		nowCount--;
	}
}

첫 번째 쑰건의 κ²½μš°μ—λŠ” ν•΄λ‹Ή μ œν’ˆμ„ ꡬ맀할 ν•„μš”κ°€ μ—†κ³ , 10일 연속 ꡬ맀가 μ ˆλŒ€ λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ—,
λ°˜λ³΅λ¬Έμ„ λ°”λ‘œ λΉ μ Έλ‚˜μ˜€λ„λ‘ ν•΄μ£Όμ—ˆλ‹€.

두 번째 쑰건의 κ²½μš°μ—λŠ” ν•΄λ‹Ή μ œν’ˆμ„ ꡬ맀할 ν•„μš”κ°€ μžˆλŠ” 경우이기 λ•Œλ¬Έμ—, wantMapμ—μ„œ ν•΄λ‹Ή μ œν’ˆμ˜ valueκ°’(ν•„μš”ν•œ 개수)에 1을 λΉΌμ£Όκ³ , nowCount에도 1을 빼쀌으둜써, ν•΄λ‹Ή μ œν’ˆμ„ κ΅¬λ§€ν–ˆλ‹€λŠ” 정보λ₯Ό μ—…λ°μ΄νŠΈ ν•΄μ£Όμ—ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ, nowCountκ°€ 0이면, 즉 사야 ν•˜λŠ” μ œν’ˆμ„ λͺ¨λ‘ κ΅¬λ§€ν–ˆλ‹€λ©΄, μ΅œμ’… answer에 1을 λ”ν•΄μ€ŒμœΌλ‘œμ¨,
10일 μ—°μ†μœΌλ‘œ ν• μΈν•œ μ œν’ˆμ„ κ΅¬λ§€ν•œ 경우의 수λ₯Ό μ¦κ°€μ‹œμΌœμ£Όμ—ˆλ‹€.

if (nowCount == 0) {
	answer++;
}

πŸ‘Ύμ΅œμ’… μ½”λ“œ

import java.util.HashMap;

class Solution {
    public int solution(String[] want, int[] number, String[] discount) {
        int answer = 0;
        int totalCount = 0;
        int nowCount = 0;
        HashMap<String, Integer> wantMap = new HashMap<>();

        // ν•„μš”ν•œ 물건의 총 개수
        for (int num : number) {
            totalCount += num;
        }
        

        for (int i = 0; i <= discount.length - totalCount; i++) {
            // hashMap μž…λ ₯
            for (int k = 0; k < want.length; k++) {
                wantMap.put(want[k], number[k]);
            }  
            nowCount = 10;


            for (int j = i; j < i + 10; j++) {
                if (wantMap.containsKey(discount[j]) == false || wantMap.get(discount[j]) <= 0) {
                    break;
                }
                else {
                    wantMap.put(discount[j], wantMap.get(discount[j]) - 1);
                    nowCount--;
                }
            }
            if (nowCount == 0) {
                answer++;
            }
        }

        return answer;
    }
}


πŸ”—λ¬Έμ œ 링크
πŸ’»Repository

profile
ν›ˆμ‹Ήμ˜ κ°œλ°œμ—¬ν–‰
post-custom-banner

2개의 λŒ“κΈ€

comment-user-thumbnail
2024λ…„ 8μ›” 17일

곡돌 κ·Έλ‘œλ°‹~

1개의 λ‹΅κΈ€