CodingTest/Java

Lv.2 : λ‰΄μŠ€ ν΄λŸ¬μŠ€ν„°λ§

Soom_1n 2023. 11. 7. 10:43

πŸ‘‰ 문제링크

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr



πŸ”Έ 문제 뢄석 πŸ”Έ

  • μžμΉ΄λ“œ μœ μ‚¬λ„λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ ꡐ집합과 합집합을 κ΅¬ν˜„ν•˜λŠ” λ¬Έμ œμ΄λ‹€.
  • μ£Όμ–΄μ§„ 두 λ¬Έμžμ—΄μ˜ νŒŒμ‹±μ΄ ν•„μš”ν•˜λ‹€.

πŸ”Έ 문제 풀이 πŸ”Έ

  • 두 λ¬Έμžμ—΄μ˜ λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, λŒ€λ¬Έμž ν˜Ήμ€ μ†Œλ¬Έμžλ‘œ μΌμΉ˜μ‹œν‚¨λ‹€.
  • 2λ¬Έμžμ”© μž˜λΌμ„œ μ›μ†Œλ‘œ μ‚¬μš©ν•˜λŠ”λ°, λ„μ–΄μ“°κΈ°λ‚˜ 특수문자 λ“± μ•ŒνŒŒλ²³μ΄ μ•„λ‹Œ λ¬Έμžκ°€ ν¬ν•¨λ˜μ–΄μžˆμœΌλ©΄ λ°°μ œν•œλ‹€.
    • μ—¬κΈ°μ„œ 주의 ν•  점은 μ•ŒνŒŒλ²³μ΄ μ•„λ‹Œ λ¬Έμžλ“€μ„ μ œκ±°ν•˜κ³  2λ¬Έμžμ”© 자λ₯΄λŠ”κ²Œ μ•„λ‹Œ, λ¨Όμ € 자λ₯Έλ‹€μŒ 필터링 ν•˜λŠ” μˆœμ„œμ΄λ‹€.
  • 쀑볡을 ν—ˆμš©ν•˜λŠ” 닀쀑 집합이기 λ•Œλ¬Έμ— Map에 κ°œμˆ˜μ™€ ν•¨κ»˜ μ €μž₯ν•œλ‹€.
  • ꡐ집합은 두 집합에 곡톡 μ›μ†Œλ₯Ό μ°Ύκ³ , 두 값쀑 μ΅œμ†Œκ°’μ„ ꡐ집합 κ°œμˆ˜μ— λ”ν•œλ‹€.
  • 합집합은 두 집합에 곡톡 μ›μ†Œμ˜ 두 κ°’μ—μ„œλŠ” μ΅œλŒ€κ°’μ„ λ”ν•˜κ³ , κ²ΉμΉ˜μ§€ μ•ŠλŠ” μ›μ†Œ 값도 더해쀀닀.
  • ꡐ집합 / ν•©μ§‘ν•© * 65536 을 λ°˜ν™˜ν•œλ‹€.

πŸ”Έ μ½”λ“œ πŸ”Έ

import java.util.Map;
import java.util.HashMap;

class Solution {
    public int solution(String str1, String str2) {
        // Input
        str1 = str1.toUpperCase();
        str2 = str2.toUpperCase();

        Map<String, Integer> map1 = new HashMap<>();
        Map<String, Integer> map2 = new HashMap<>();

        for (int i = 0; i < str1.length() - 1; i++) {
            String temp = str1.substring(i, i + 2).replaceAll("[^a-zA-Z]", "");

            if (temp.length() != 2)
                continue;

            if (!map1.containsKey(temp))
                map1.put(temp, 1);
            else
                map1.put(temp, map1.get(temp) + 1);
        }

        for (int i = 0; i < str2.length() - 1; i++) {
            String temp = str2.substring(i, i + 2).replaceAll("[^a-zA-Z]", "");

            if (temp.length() != 2)
                continue;

            if (!map2.containsKey(temp))
                map2.put(temp, 1);
            else
                map2.put(temp, map2.get(temp) + 1);
        }

        if (map1.isEmpty() && map2.isEmpty())
            return 65536;

        // ꡐ집합
        double cnt1 = 0;

        for (Map.Entry<String, Integer> entry : map1.entrySet()) {

            if (map2.containsKey(entry.getKey()) && map2.get(entry.getKey()) > 0) {
                cnt1 += Math.min(entry.getValue(), map2.get(entry.getKey()));
            }
        }

        // ν•©μ§‘ν•©
        double cnt2 = 0;

        for (Map.Entry<String, Integer> entry : map1.entrySet()) {

            if (map2.containsKey(entry.getKey())) {
                cnt2 += Math.max(entry.getValue(), map2.get(entry.getKey()));
                map2.remove(entry.getKey());
            } else {
                cnt2 += entry.getValue();
            }
        }

        for (Map.Entry<String, Integer> entry : map2.entrySet()) {
            cnt2 += entry.getValue();
        }

        return (int)(cnt1 / cnt2 * 65536);
    }
}

πŸ”Έ μ½”λ“œ 해석 πŸ”Έ

  • λŒ€μ†Œλ¬Έμž ꡬ뢄이 μ—†μœΌλ―€λ‘œ, μ£Όμ–΄μ§„ str1와 str2λ₯Ό λŒ€λ¬Έμžλ‘œ λ³€ν™˜ν•΄μ„œ ν†΅μΌν•œλ‹€.
  • 두 μ§‘ν•©μ˜ μ›μ†Œλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ Map을 2개 λ§Œλ“ λ‹€.
    • 각각 2λ¬Έμžμ”© 자λ₯΄κ³  μ•ŒνŒŒλ²³μ„ μ œμ™Έν•œ λ¬ΈμžλŠ” μ œκ±°ν•΄μ„œ 길이가 2이면 집합에 ν¬ν•¨ν•œλ‹€.
    • 집합에 처음 λ„£λŠ” μ›μ†Œλ©΄ 값을 1, 처음이 μ•„λ‹ˆλ©΄ κΈ°μ‘΄κ°’+1 둜 μ €μž₯ν•œλ‹€.
    • λ§Œμ•½ 두 μ§‘ν•©μ˜ μ›μ†Œ κ°œμˆ˜κ°€ λͺ¨λ‘ 0이라면, ν•©μ§‘ν•©μ˜ κ°œμˆ˜κ°€ 0이 λ‚˜μ˜¨λ‹€. λ¬Έμ œμ—μ„œ 1둜 κ°œμ‚°ν•˜λΌ ν–ˆμœΌλ―€λ‘œ, 1 * 65536 을 λ°˜ν™˜ν•œλ‹€.
  • ꡐ집합은 κ²ΉμΉ˜λŠ” μ›μ†Œλ₯Ό μ°Ύκ³ , μ €μž₯된 두 값쀑 μ΅œμ†Œκ°’μ„ ꡐ집합 κ°œμˆ˜μ— λ”ν•œλ‹€.
  • 합집합은 κ²ΉμΉ˜λŠ” μ›μ†Œλ₯Ό μ°Ύκ³ , μ €μž₯된 두 값쀑 μ΅œλŒ€κ°’μ„ ν•©μ§‘ν•© κ°œμˆ˜μ— λ”ν•œλ‹€.
    • μΆ”κ°€λ‘œ κ²ΉμΉ˜μ§€ μ•Šμ€ μ›μ†Œμ˜ 값도 ν•©μ§‘ν•© κ°œμˆ˜μ— λ”ν•œλ‹€.
  • ꡐ집합 / ν•©μ§‘ν•© * 65536을 λ°˜ν™˜ν•œλ‹€.

πŸ”Έ end πŸ”Έ

  • 카카였 λ¬Έμ œλΌμ„œ κ·ΈλŸ°μ§€ 2레벨 μΉ˜κ³ λŠ” κ½€ λ³΅μž‘ν–ˆλ˜ 것 κ°™λ‹€. ν•˜μ§€λ§Œ λ‹€μ‹œλ³΄λ‹ˆ κ·Έλƒ₯ λ¬Έμžμ—΄ μ²˜λ¦¬μ™€ ꡐ집합, ν•©μ§‘ν•© κ΅¬ν•˜κΈ°μ—¬μ„œ κ·Έλ ‡κ²Œ μ–΄λ ΅μ§€λŠ” μ•Šμ€ 것 κ°™λ‹€.
  • μ²˜μŒμ—” μ•ŒνŒŒλ²³μ΄ μ•„λ‹Œ 문자λ₯Ό μ œκ±°ν•œ λ’€ 2λ¬Έμžμ”© 자λ₯΄λŠ” 거둜 μ΄ν•΄ν–ˆλŠ”λ°, 자λ₯Έ λ‹€μŒ μ œκ±°ν•˜λŠ” κ²ƒμ΄μ—ˆλ‹€.
    • 예제 3λ²ˆμ—μ„œ λ””λ²„κΉ…ν•΄μ€˜μ„œ μ•Œ 수 μžˆμ—ˆλ‹€.
    • 예제 4λ²ˆμ€ 두 집합이 λͺ¨λ‘ 0인 경우λ₯Ό λ””λ²„κΉ…ν•΄μ€˜μ„œ 또 μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•  수 μžˆμ—ˆλ‹€.
    • 예제만 λ§žμΆ”λ©΄ ν†΅κ³Όλ˜λ„λ‘ ν•΄λ‘¬μ„œ 2레벨인 것 같기도 ν•˜λ‹€.
  • 2018 KAKAO BLIND RECRUITMENT의 5번 문제인데, 쀑급 λ‚œμ΄λ„μ΄κ³  μ •λ‹΅λ₯ μ€ 41.84%이닀.
    • 닀쀑 μ§‘ν•©μ—μ„œ ν•©μ§‘ν•©, ꡐ집합을 κ΅¬ν˜„ν•˜λŠ”κ²Œ 핡심인 것 같은데, 닀쀑 집합을 κ΅¬ν•˜μ§€ μ•Šλ”λΌλ„, 병합정렬을 톡해 κ΅¬ν˜„ν•  수 μžˆλ‹€κ³  ν•œλ‹€.
  • λ‹€μŒμ€ 문제 해섀이닀.
이 λ¬Έμ œλŠ” μžμΉ΄λ“œ μœ μ‚¬λ„λ₯Ό μ„€λͺ…ν•΄μ£Όκ³  μžμΉ΄λ“œ μœ μ‚¬λ„λ₯Ό 직접 κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€. μžμΉ΄λ“œ μœ μ‚¬λ„λŠ” μ‹€λ¬΄μ—μ„œλ„ μœ μ‚¬ν•œ λ¬Έμ„œλ₯Ό νŒλ³„ν•  λ•Œ 주둜 μ“°μ΄λŠ”λ°μš”, λͺ°λžλ”라도 λ¬Έμ œμ—μ„œ μžμ„Ένžˆ μ„€λͺ…ν•΄μ£ΌκΈ° λ•Œλ¬Έμ— μ΄ν•΄ν•˜λŠ”λ° 어렀움은 μ—†μ—ˆμ„ κ±° κ°™μŠ΅λ‹ˆλ‹€. 곡식은 맀우 κ°„λ‹¨ν•œλ°μš”, ꡐ집합을 ν•©μ§‘ν•©μœΌλ‘œ λ‚˜λˆˆ μˆ˜μž…λ‹ˆλ‹€. λ‹€λ§Œ, 이 값은 0μ—μ„œ 1 μ‚¬μ΄μ˜ μ‹€μˆ˜κ°€ λ˜λŠ”λ°, μ—¬κΈ°μ„œλŠ” 이λ₯Ό 닀루기 쉽도둝 65536을 κ³±ν•œ ν›„ μ†Œμˆ˜μ  μ•„λž˜λ₯Ό 버리고 μ •μˆ˜λΆ€λ§Œ μ·¨ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

문제 μ„€λͺ…은 μ›μ†Œμ˜ 쀑볡을 ν—ˆμš©ν•˜λŠ” 닀쀑집합multiset으둜 λ˜μ–΄ μžˆλŠ”λ°, 자주 μ ‘ν•˜λŠ” μžλ£Œκ΅¬μ‘°κ°€ μ•„λ‹ˆκ³ , 일뢀 μ–Έμ–΄μ—μ„œλŠ” 기본으둜 μ œκ³΅ν•˜λŠ” μžλ£Œκ΅¬μ‘°κ°€ μ•„λ‹ˆλΌ μ–΄λ €μ›Œν•˜λŠ” 뢄듀이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 닀쀑집합 자료ꡬ쑰λ₯Ό μ“°μ§€ μ•Šλ”λΌλ„, 각 μ›μ†Œλ₯Ό μ •λ ¬λœ 배열에 넣은 ν›„ 병합 μ •λ ¬Merge sortμ—μ„œ λ°°μ› λ˜ μ½”λ“œλ₯Ό μ‘μš©, μ–΄λ ΅μ§€ μ•Šκ²Œ ν•©μ§‘ν•©κ³Ό ꡐ집합 ν•¨μˆ˜λ₯Ό 직접 κ΅¬ν˜„ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μ€‘μ§‘ν•©μ˜ ꡐ집합, ν•©μ§‘ν•©λ§Œ 잘 ꡬ해낸닀면 이 λ¬Έμ œλŠ” μ–΄λ ΅μ§€ μ•Šκ²Œ ν’€ 수 있으며, λ‹€λ§Œ μ§‘ν•© A와 Bκ°€ λͺ¨λ‘ 곡집합일 κ²½μš°μ—λŠ” λ‚˜λˆ—μ…ˆμ΄ μ •μ˜λ˜μ§€ μ•ŠμœΌλ―€λ‘œdivision by zero λ”°λ‘œ J(A,B) = 1둜 μ •μ˜ν•©λ‹ˆλ‹€. 즉, 65536을 κ³±ν•˜λ©΄ 이 경우 1 * 65536 = 65536이 정닡이 λ©λ‹ˆλ‹€. 예제 μž…μΆœλ ₯에도 합집합이 곡집합인 κ²½μš°κ°€ ν¬ν•¨λ˜μ–΄ μžˆμœΌλ―€λ‘œ 이 경우만 μ£Όμ˜ν•œλ‹€λ©΄ μ‰½κ²Œ ν’€ 수 μžˆλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

이 문제의 μ •λ‹΅λ₯ μ€ 41.84%μž…λ‹ˆλ‹€.

728x90