[Lv1] 2022카카였 > μ„±κ²©μœ ν˜• κ²€μ‚¬ν•˜κΈ°

2022. 8. 23. 12:18γ†κ°œλ°œ/μ½”λ”©ν…ŒμŠ€νŠΈ

2022 KAKAO TECH INTERNSHIP > 성격 μœ ν˜• κ²€μ‚¬ν•˜κΈ°

λ‚˜λ§Œμ˜ 카카였 성격 μœ ν˜• 검사지λ₯Ό λ§Œλ“€λ €κ³  ν•©λ‹ˆλ‹€.
성격 μœ ν˜• κ²€μ‚¬λŠ” λ‹€μŒκ³Ό 같은 4개 μ§€ν‘œλ‘œ 성격 μœ ν˜•μ„ κ΅¬λΆ„ν•©λ‹ˆλ‹€. 성격은 각 μ§€ν‘œμ—μ„œ 두 μœ ν˜• 쀑 ν•˜λ‚˜λ‘œ κ²°μ •λ©λ‹ˆλ‹€.

1번 μ§€ν‘œλΌμ΄μ–Έν˜•(R), νŠœλΈŒν˜•(T)
2번 μ§€ν‘œμ½˜ν˜•(C), ν”„λ‘œλ„ν˜•(F)
3번 μ§€ν‘œμ œμ΄μ§€ν˜•(J), λ¬΄μ§€ν˜•(M)
4번 μ§€ν‘œμ–΄ν”ΌμΉ˜ν˜•(A), λ„€μ˜€ν˜•(N)

4개의 μ§€ν‘œκ°€ μžˆμœΌλ―€λ‘œ 성격 μœ ν˜•μ€ 총 16(=2 x 2 x 2 x 2)κ°€μ§€κ°€ λ‚˜μ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, "RFMN"μ΄λ‚˜ "TCMA"와 같은 성격 μœ ν˜•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

(μ€‘λž΅)

검사 κ²°κ³ΌλŠ” λͺ¨λ“  질문의 성격 μœ ν˜• 점수λ₯Ό λ”ν•˜μ—¬ 각 μ§€ν‘œμ—μ„œ 더 높은 점수λ₯Ό 받은 성격 μœ ν˜•μ΄ κ²€μ‚¬μžμ˜ 성격 μœ ν˜•μ΄λΌκ³  νŒλ‹¨ν•©λ‹ˆλ‹€. 단, ν•˜λ‚˜μ˜ μ§€ν‘œμ—μ„œ 각 성격 μœ ν˜• μ μˆ˜κ°€ κ°™μœΌλ©΄, 두 성격 μœ ν˜• 쀑 사전 순으둜 λΉ λ₯Έ 성격 μœ ν˜•μ„ κ²€μ‚¬μžμ˜ 성격 μœ ν˜•μ΄λΌκ³  νŒλ‹¨ν•©λ‹ˆλ‹€.
μ§ˆλ¬Έλ§ˆλ‹€ νŒλ‹¨ν•˜λŠ” μ§€ν‘œλ₯Ό 담은 1차원 λ¬Έμžμ—΄ λ°°μ—΄ survey와 κ²€μ‚¬μžκ°€ 각 μ§ˆλ¬Έλ§ˆλ‹€ μ„ νƒν•œ 선택지λ₯Ό 담은 1차원 μ •μˆ˜ λ°°μ—΄ choicesκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. μ΄λ•Œ, κ²€μ‚¬μžμ˜ 성격 μœ ν˜• 검사 κ²°κ³Όλ₯Ό μ§€ν‘œ 번호 μˆœμ„œλŒ€λ‘œ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

(ν›„λž΅)

 

λ‚΄ λ‹΅λ³€

 
function solution(survey, choices) {
    const types = ['RT', 'CF', 'JM', 'AN'];
    const map = new Map([['R',0],['T',0],['C',0],['F',0],
                       ['J',0],['M',0],['A',0],['N',0]]);

    choices.forEach((choice, i) => {
        if(choice === 4) return;
        const selectedType = choice < 4 ? survey[i].charAt(0) : survey[i].charAt(1);
        const count = map.get(selectedType);
        const addedCount = Math.abs(choice - 4);
        map.set(selectedType, count + addedCount);
    });

    return types.map(type => {
        const type1 = type.charAt(0);
        const type2 = type.charAt(1);
        const count1 = map.get(type1);
        const count2 = map.get(type2);
        return count1 >= count2 ? type1 : type2;
    }).join('');

}

πŸ‘‰ O(n)의 풀이이닀. λ™μ μœΌλ‘œ map.get(selectedType) || 0 μ΄λŸ°μ‹μœΌλ‘œ κ°€μ§€κ³  μ˜¬κΉŒν•˜λ‹€κ°€, μ„±κ²©μœ ν˜•μ΄ μ •ν•΄μ ΈμžˆμœΌλ―€λ‘œ Map을 μ΄ˆκΈ°ν™”ν•  λ•Œ μ•„μ˜ˆ κΈ°λ³Έκ°’μœΌλ‘œ μ„ΈνŒ…μ„ ν•΄μ£ΌλŠ”κ²Œ 가독성이 쒋을 것 κ°™μ•„μ„œ κ·Έλ ‡κ²Œ ν•΄μ£Όμ—ˆλ‹€.

 

πŸ₯² μ•„μ‰¬μš΄μ 

- 지문을 꼼꼼히 읽지 μ•Šμ•„μ„œ ν‘ΈλŠ”λ° ν•˜λ£¨κ°€ κ±Έλ Έλ‹€..

choice의 값이 1이면 μ μˆ˜λŠ” 3점이 μΆ”κ°€κ°€ λ˜μ–΄μ•Ό ν•˜λŠ”λ° κ·ΈλŒ€λ‘œ 1점을 μΆ”κ°€ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ†“κ³  μ™œ μ•ˆλ˜μ§€ ν•˜κ³  μ—„μ²­ κ³ λ―Όν–ˆλ‹€.

ν’€λ•ŒλŠ” 이게 μ™œ 죽어도 μ•ˆλ³΄μ΄λŠ”μ§€..

μ°¨λΆ„ν•˜κ²Œ ν‘ΈλŠ” μ—°μŠ΅μ„ 계속 ν•΄μ•Όν•  것 κ°™λ‹€. μ •μ‹ μ°¨λ¦¬μž!

// λ§žλŠ” 방식
const addedCount = Math.abs(choice - 4);

// 헀맨 방식
const addedCount = choice < 4 ? choice : choice - 4;