μ•Œκ³ λ¦¬μ¦˜/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / Programmers Level 3 ] 닀단계 칫솔 판맀

KIMHYEYUN 2021. 9. 20. 14:16
λ°˜μ‘ν˜•

문제


λ―Όν˜ΈλŠ” 닀단계 쑰직을 μ΄μš©ν•˜μ—¬ 칫솔을 νŒλ§€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. νŒλ§€μ›μ΄ 칫솔을 νŒλ§€ν•˜λ©΄ κ·Έ 이읡이 ν”ΌλΌλ―Έλ“œ 쑰직을 타고 μ‘°κΈˆμ”© λΆ„λ°°λ˜λŠ” ν˜•νƒœμ˜ νŒλ§€λ§μž…λ‹ˆλ‹€. μ–΄λŠμ •λ„ νŒλ§€κ°€ 이루어진 ν›„, 쑰직을 μš΄μ˜ν•˜λ˜ λ―Όν˜ΈλŠ” 쑰직 λ‚΄ λˆ„κ°€ μ–Όλ§ˆλ§ŒνΌμ˜ 이득을 κ°€μ Έκ°”λŠ”μ§€κ°€ κΆκΈˆν•΄μ‘ŒμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ―Όν˜Έκ°€ μš΄μ˜ν•˜κ³  μžˆλŠ” 닀단계 칫솔 판맀 쑰직이 μ•„λž˜ κ·Έλ¦Όκ³Ό κ°™λ‹€κ³  ν•©μ‹œλ‹€.

λ―Όν˜ΈλŠ” center이며, νŒŒλž€μƒ‰ λ„€λͺ¨λŠ” μ—¬λŸ λͺ…μ˜ νŒλ§€μ›μ„ ν‘œμ‹œν•œ κ²ƒμž…λ‹ˆλ‹€. 각각은 μžμ‹ μ„ 쑰직에 μ°Έμ—¬μ‹œν‚¨ μΆ”μ²œμΈμ— μ—°κ²°λ˜μ–΄ ν”ΌλΌλ―Έλ“œ μ‹μ˜ ꡬ쑰λ₯Ό 이루고 μžˆμŠ΅λ‹ˆλ‹€. 쑰직의 이읡 λΆ„λ°° κ·œμΉ™μ€ κ°„λ‹¨ν•©λ‹ˆλ‹€. λͺ¨λ“  νŒλ§€μ›μ€ μΉ«μ†”μ˜ νŒλ§€μ— μ˜ν•˜μ—¬ λ°œμƒν•˜λŠ” μ΄μ΅μ—μ„œ 10% λ₯Ό κ³„μ‚°ν•˜μ—¬ μžμ‹ μ„ 쑰직에 μ°Έμ—¬μ‹œν‚¨ μΆ”μ²œμΈμ—κ²Œ λ°°λΆ„ν•˜κ³  λ‚˜λ¨Έμ§€λŠ” μžμ‹ μ΄ κ°€μ§‘λ‹ˆλ‹€. λͺ¨λ“  νŒλ§€μ›μ€ μžμ‹ μ΄ 칫솔 νŒλ§€μ—μ„œ λ°œμƒν•œ 이읡 뿐만 μ•„λ‹ˆλΌ, μžμ‹ μ΄ 쑰직에 μΆ”μ²œν•˜μ—¬ κ°€μž…μ‹œν‚¨ νŒλ§€μ›μ—κ²Œμ„œ λ°œμƒν•˜λŠ” 이읡의 10% κΉŒμ§€ μžμ‹ μ— 이읡이 λ©λ‹ˆλ‹€. μžμ‹ μ—κ²Œ λ°œμƒν•˜λŠ” 이읡 λ˜ν•œ λ§ˆμ°¬κ°€μ§€μ˜ κ·œμΉ™μœΌλ‘œ μžμ‹ μ˜ μΆ”μ²œμΈμ—κ²Œ λΆ„λ°°λ©λ‹ˆλ‹€. 단, 10% λ₯Ό 계산할 λ•Œμ—λŠ” 원 λ‹¨μœ„μ—μ„œ μ ˆμ‚¬ν•˜λ©°, 10%λ₯Ό κ³„μ‚°ν•œ κΈˆμ•‘μ΄ 1 원 미만인 κ²½μš°μ—λŠ” 이득을 λΆ„λ°°ν•˜μ§€ μ•Šκ³  μžμ‹ μ΄ λͺ¨λ‘ κ°€μ§‘λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, μ•„λž˜μ™€ 같은 판맀 기둝이 μžˆλ‹€κ³  κ°€μ •ν•˜κ² μŠ΅λ‹ˆλ‹€. μΉ«μ†”μ˜ νŒλ§€μ—μ„œ λ°œμƒν•˜λŠ” 이읡은 κ°œλ‹Ή 100 μ›μœΌλ‘œ μ •ν•΄μ Έ μžˆμŠ΅λ‹ˆλ‹€.

νŒλ§€μ›νŒλ§€ μˆ˜λŸ‰μ΄μ΅κΈˆ

young 12 1,200 원
john 4 400 원
tod 2 200 원
emily 5 500 원
mary 10 1,000 원

νŒλ§€μ› young 에 μ˜ν•˜μ—¬ 1,200 μ›μ˜ 이읡이 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. young 은 이 쀑 10% 에 ν•΄λ‹Ήν•˜λŠ” 120 원을, μžμ‹ μ„ 쑰직에 μ°Έμ—¬μ‹œν‚¨ μΆ”μ²œμΈμΈ edward μ—κ²Œ λ°°λΆ„ν•˜κ³  μžμ‹ μ€ λ‚˜λ¨Έμ§€μΈ 1,080 원을 κ°€μ§‘λ‹ˆλ‹€. edward λŠ” young μ—κ²Œμ„œ 받은 120 원 쀑 10% 인 12 원을 mary μ—κ²Œ λ°°λΆ„ν•˜κ³  μžμ‹ μ€ λ‚˜λ¨Έμ§€μΈ 108 원을 κ°€μ§‘λ‹ˆλ‹€. 12 원을 edward λ‘œλΆ€ν„° 받은 mary λŠ” 10% 인 1 원을 센터에 (즉, λ―Όν˜Έμ—κ²Œ) λ°°λΆ„ν•˜κ³  μžμ‹ μ€ λ‚˜λ¨Έμ§€μΈ 11 원을 κ°€μ§‘λ‹ˆλ‹€. 이 μƒνƒœλ₯Ό 그림으둜 λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

κ·Έ ν›„, νŒλ§€μ› john 에 μ˜ν•˜μ—¬ 400 μ›μ˜ 이읡이 λ°œμƒν•©λ‹ˆλ‹€. john 은 10% 인 40 원을 센터에 λ°°λΆ„ν•˜κ³  μžμ‹ μ΄ λ‚˜λ¨Έμ§€μΈ 360 원을 κ°€μ§‘λ‹ˆλ‹€. 이 μƒνƒœλ₯Ό 그림으둜 λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

또 κ·Έ ν›„μ—λŠ” νŒλ§€μ› tod 에 μ˜ν•˜μ—¬ 200 원 이읡이 λ°œμƒν•˜λŠ”λ°, tod μžμ‹ μ΄ 180 원을, μΆ”μ²œμΈμΈ jaimie κ°€ κ·Έ 쀑 10% 인 20 원을 λ°›μ•„μ„œ 18 원을 κ°€μ§€κ³ , jaimie 의 μΆ”μ²œμΈμΈ mary λŠ” 2 원을 λ°›μ§€λ§Œ μ΄κ²ƒμ˜ 10% λŠ” 원 λ‹¨μœ„μ—μ„œ μ ˆμ‚¬ν•˜λ©΄ λ°°λΆ„ν•  κΈˆμ•‘μ΄ μ—†κΈ° λ•Œλ¬Έμ— mary λŠ” 2 원을 λͺ¨λ‘ κ°€μ§‘λ‹ˆλ‹€. 이 μƒνƒœλ₯Ό 그림으둜 λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

κ·Έ λ‹€μŒμœΌλ‘œ emily κ°€ 칫솔 판맀λ₯Ό ν†΅ν•˜μ—¬ 얻은 이읡 500 원은 λ§ˆμ°¬κ°€μ§€μ˜ κ·œμΉ™μ— 따라 emily μ—κ²Œ 450 원, mary μ—κ²Œ 45 원, 그리고 센터에 5 μ›μœΌλ‘œ λΆ„λ°°λ©λ‹ˆλ‹€. 이 μƒνƒœλ₯Ό 그림으둜 λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ, νŒλ§€μ› mary λŠ” 1,000 μ›μ˜ 이읡을 λ‹¬μ„±ν•˜κ³ , 이 쀑 10% 인 100 원을 센터에 λ°°λΆ„ν•œ ν›„ κ·Έ λ‚˜λ¨Έμ§€μΈ 900 원을 μžμ‹ μ΄ κ°€μ§‘λ‹ˆλ‹€. 이 μƒνƒœλ₯Ό 그림으둜 λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

μœ„μ™€ 같이 ν•˜μ—¬ λͺ¨λ“  쑰직 κ΅¬μ„±μ›λ“€μ˜ 이읡 달성 ν˜„ν™© 집계가 λλ‚¬μŠ΅λ‹ˆλ‹€. μ§€κΈˆκΉŒμ§€ 얻은 이읡을 λͺ¨λ‘ ν•©ν•œ κ²°κ³Όλ₯Ό 그림으둜 λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

이 κ²°κ³Όκ°€ λ―Όν˜Έκ°€ νŒŒμ•…ν•˜κ³ μž ν•˜λŠ” 이읡 λ°°λΆ„ ν˜„ν™©μž…λ‹ˆλ‹€. 

각 νŒλ§€μ›μ˜ 이름을 담은 λ°°μ—΄ enroll, 각 νŒλ§€μ›μ„ 닀단계 쑰직에 μ°Έμ—¬μ‹œν‚¨ λ‹€λ₯Έ νŒλ§€μ›μ˜ 이름을 담은 λ°°μ—΄ referral, νŒλ§€λŸ‰ 집계 λ°μ΄ν„°μ˜ νŒλ§€μ› 이름을 λ‚˜μ—΄ν•œ λ°°μ—΄ seller, νŒλ§€λŸ‰ 집계 λ°μ΄ν„°μ˜ 판맀 μˆ˜λŸ‰μ„ λ‚˜μ—΄ν•œ λ°°μ—΄ amountκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 각 νŒλ§€μ›μ΄ λ“ν•œ μ΄μ΅κΈˆμ„ λ‚˜μ—΄ν•œ 배열을 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”. νŒλ§€μ›μ—κ²Œ λ°°λΆ„λœ 이읡금의 총합을 κ³„μ‚°ν•˜μ—¬(μ •μˆ˜ν˜•μœΌλ‘œ), μž…λ ₯으둜 μ£Όμ–΄μ§„ enroll에 이름이 ν¬ν•¨λœ μˆœμ„œμ— 따라 λ‚˜μ—΄ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

μ œν•œ 사항


 

  • enroll의 κΈΈμ΄λŠ” 1 이상 10,000 μ΄ν•˜μž…λ‹ˆλ‹€.
    • enroll에 민호의 이름은 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ enroll의 κΈΈμ΄λŠ” 민호λ₯Ό μ œμ™Έν•œ 쑰직 κ΅¬μ„±μ›μ˜ 총 μˆ˜μž…λ‹ˆλ‹€.
  • referral의 κΈΈμ΄λŠ” enroll의 길이와 κ°™μŠ΅λ‹ˆλ‹€.
    • referral λ‚΄μ—μ„œ i λ²ˆμ§Έμ— μžˆλŠ” 이름은 λ°°μ—΄ enroll λ‚΄μ—μ„œ i λ²ˆμ§Έμ— μžˆλŠ” νŒλ§€μ›μ„ 쑰직에 μ°Έμ—¬μ‹œν‚¨ μ‚¬λžŒμ˜ μ΄λ¦„μž…λ‹ˆλ‹€.
    • μ–΄λŠ λˆ„κ΅¬μ˜ μΆ”μ²œλ„ 없이 쑰직에 μ°Έμ—¬ν•œ μ‚¬λžŒμ— λŒ€ν•΄μ„œλŠ” referral λ°°μ—΄ 내에 μΆ”μ²œμΈμ˜ 이름이 κΈ°μž…λ˜μ§€ μ•Šκ³  “-“ κ°€ κΈ°μž…λ©λ‹ˆλ‹€. μœ„ μ˜ˆμ œμ—μ„œλŠ” john κ³Ό mary κ°€ μ΄λŸ¬ν•œ μ˜ˆμ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.
    • enroll 에 λ“±μž₯ν•˜λŠ” 이름은 쑰직에 μ°Έμ—¬ν•œ μˆœμ„œμ— λ”°λ¦…λ‹ˆλ‹€. 
    • 즉, μ–΄λŠ νŒλ§€μ›μ˜ 이름이 enroll 의 i λ²ˆμ§Έμ— λ“±μž₯ν•œλ‹€λ©΄, 이 νŒλ§€μ›μ„ 쑰직에 μ°Έμ—¬μ‹œν‚¨ μ‚¬λžŒμ˜ 이름, 즉 referral 의 i 번째 μ›μ†ŒλŠ” 이미 λ°°μ—΄ enroll 의 j 번째 (j < i) 에 λ“±μž₯ν–ˆμŒμ΄ 보μž₯λ©λ‹ˆλ‹€.
  • seller의 κΈΈμ΄λŠ” 1 이상 100,000 μ΄ν•˜μž…λ‹ˆλ‹€.
    • seller λ‚΄μ˜ i λ²ˆμ§Έμ— μžˆλŠ” 이름은 i 번째 판맀 집계 데이터가 μ–΄λŠ νŒλ§€μ›μ— μ˜ν•œ 것인지λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • seller μ—λŠ” 같은 이름이 μ€‘λ³΅ν•΄μ„œ λ“€μ–΄μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • amount의 κΈΈμ΄λŠ” seller의 길이와 κ°™μŠ΅λ‹ˆλ‹€.
    • amount λ‚΄μ˜ i λ²ˆμ§Έμ— μžˆλŠ” μˆ˜λŠ” i 번째 판맀 집계 λ°μ΄ν„°μ˜ νŒλ§€λŸ‰μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • νŒλ§€λŸ‰μ˜ λ²”μœ„, 즉 amount 의 μ›μ†Œλ“€μ˜ λ²”μœ„λŠ” 1 이상 100 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • 칫솔 ν•œ 개λ₯Ό νŒλ§€ν•˜μ—¬ μ–»μ–΄μ§€λŠ” 이읡은 100 μ›μœΌλ‘œ μ •ν•΄μ Έ μžˆμŠ΅λ‹ˆλ‹€.
  • λͺ¨λ“  쑰직 κ΅¬μ„±μ›λ“€μ˜ 이름은 10 κΈ€μž μ΄λ‚΄μ˜ 영문 μ•ŒνŒŒλ²³ μ†Œλ¬Έμžλ“€λ‘œλ§Œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

풀이


두 개의 ν•΄μ‹œλ§΅μ„ μ΄μš©ν•΄μ„œ ν’€μ—ˆλ‹€. 

 

처음, μžμ‹-λΆ€λͺ¨ 맡을 μ‚¬μš©ν•˜μ§€ μ•Šκ³ , 본인의 enroll λ°°μ—΄μ—μ„œμ˜ 인덱슀만 κ°€μ§„ ν•΄μ‹œλ§΅μ„ 이용 πŸ‘‰ μ‹œκ°„μ΄ˆκ³ΌλŠ” λ‚˜μ§€μ•Šμ•˜μœΌλ‚˜, 느림

μžμ‹ - λΆ€λͺ¨ λ§΅κ³Ό 인덱슀 λ§΅ 두 κ°€μ§€λ₯Ό 같이 μ‚¬μš© πŸ‘‰ 빠름

 

μ–΄λ ΅μ§€λŠ” μ•Šμ•˜λŠ”λ°, μ²˜μŒμ— 문제λ₯Ό 잘λͺ» μ΄ν•΄ν•΄μ„œ μžμ‹μœΌλ‘œ λΆ€ν„° 받은 이읡은 λΆ€λͺ¨μ—κ²Œ μ£Όμ§€ μ•ŠλŠ”λ‹€κ³  μƒκ°ν•΄μ„œ

λ‹€μ‹œ μ°ΎλŠ”λ° μ‹œκ°„μ΄ μ’€ 걸렸음 🀦‍♀️

μ½”λ“œ


- HashMap을 인덱슀 μ €μž₯으둜만 μ‚¬μš©ν•œ μ½”λ“œ πŸ‘‰ λŠλ¦Όβ€ΌοΈ

 public static int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        int[] answer = new int[enroll.length];

        int price = 100;
        Map<String, Integer> indexMap = new HashMap<>();    // 본인 μžμ‹ μ˜ index -> enroll 순으둜 answer 받아야함

        for(int i = 0 ; i <enroll.length ;i++){
            indexMap.put(enroll[i], i);
        }

        for(int i = 0 ; i < seller.length ;i++){
            String curSeller = seller[i];
            int profit = price * amount[i];

            while(!curSeller.equals("-")){
                int profitForParent = profit / 10;
                int profitForMe = profit - profitForParent;

                answer[indexMap.get(curSeller)] += profitForMe;
                
                curSeller = referral[indexMap.get(curSeller)];
                profit /= 10;

                if(profitForParent < 1)
                    break;
            }

        }

        return answer;
    }

 

- referral λ°°μ—΄λ‘œ λΆ€λͺ¨λ₯Ό μ°Ύμ§€μ•Šκ³  HashMap에 μ €μž₯

    public static int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        int[] answer = new int[enroll.length];

        int price = 100;
        Map<String, String> parentMap = new HashMap<>();    // 본인 - λΆ€λͺ¨
        Map<String, Integer> indexMap = new HashMap<>();    // 본인 μžμ‹ μ˜ index -> enroll 순으둜 answer 받아야함

        for(int i = 0 ; i <enroll.length ;i++){
            parentMap.put(enroll[i], referral[i]);
            indexMap.put(enroll[i], i);
        }

        for(int i = 0 ; i < seller.length ;i++){
            String curSeller = seller[i];
            int profit = price * amount[i];

            while(!curSeller.equals("-")){
                int profitForParent = profit / 10;
                int profitForMe = profit - profitForParent;

                answer[indexMap.get(curSeller)] += profitForMe;
                
                curSeller = parentMap.get(curSeller);
                profit /= 10;

                if(profitForParent < 1)
                    break;
            }

        }

        return answer;
    }
728x90
λ°˜μ‘ν˜•