CodingTest/Java

Lv.2 : μ˜€ν”ˆμ±„νŒ…λ°©

Soom_1n 2023. 11. 23. 16:51

πŸ‘‰ 문제링크

 

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

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

programmers.co.kr



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

  • μ˜€ν”ˆμ±„νŒ…λ°©μ—μ„œ μž…μž₯, 퇴μž₯, λ‹‰λ„€μž„ λ³€κ²½ μ„Έ κ°€μ§€ κΈ°λŠ₯의 기둝이 μ£Όμ–΄μ§„λ‹€.
  • μ‚¬μš©μžλŠ” μœ μ € μ•„μ΄λ””λ‘œ κ΅¬λΆ„λ˜λŠ”λ°, μž…μž₯ λ•Œμ˜ λ‹‰λ„€μž„μ΄λ‚˜ λ‹‰λ„€μž„ λ³€κ²½ μ‹œ λ‹‰λ„€μž„μ΄ λ³€κ²½ 될 수 μžˆλ‹€.
  • μ‚¬μš©μžκ°€ λ“€μ–΄μ˜€κ³  λ‚˜κ°„ 기둝을 λ¬Έμžμ—΄ λ°°μ—΄λ‘œ λ°˜ν™˜ν•˜λŠ”λ°, μ΅œμ’… λ³€κ²½ 된 λ‹‰λ„€μž„μœΌλ‘œ λ‚˜νƒ€λ‚΄μ•Όν•œλ‹€.

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

  • μ‚¬μš©μž 아이디에 λ”°λ₯Έ λ‹‰λ„€μž„μ„ 맡으둜 κΈ°λ‘ν•˜κ³ , μ΅œμ’… λ°˜ν™˜ μ „ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œλ‹€.

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

import java.util.Map;
import java.util.HashMap;
import java.util.Queue;
import java.util.ArrayDeque;

class Solution {
    public String[] solution(String[] records) {

        Map<String, String> nick = new HashMap<>();
        Queue<String> history = new ArrayDeque<>();

        for (String record: records) {
            String[] recordStr = record.split(" ");

            switch (recordStr[0].charAt(0)) {
                case 'L':
                    history.add(recordStr[1]);
                    history.add("λ‹˜μ΄ λ‚˜κ°”μŠ΅λ‹ˆλ‹€.");
                    break;
                case 'E':
                    history.add(recordStr[1]);
                    history.add("λ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.");
                default:
                    nick.put(recordStr[1], recordStr[2]);
            }
        }

        String[] answer = new String[history.size()/2];

        for (int i = 0; i < answer.length; i++) {
            answer[i] = nick.get(history.poll()) + history.poll();
        }

        return answer;
    }
}

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

  • μ‚¬μš©μž 아이디에 λ”°λ₯Έ λ‹‰λ„€μž„ 은 ν•΄μ‹œλ§΅ nick에 μ €μž₯ν•œλ‹€.
  • 이용 기둝에 λ”°λΌμ„œ μž…μž₯/퇴μž₯/λ‹‰λ„€μž„ 변경에 따라 λ‹€λ₯΄κ²Œ μ²˜λ¦¬ν•œλ‹€.
    • μž…μž₯/퇴μž₯ μ‹œ, 아이디와 λ©”μ„Έμ§€λ₯Ό history에 κΈ°λ‘ν•œλ‹€.
    • μž…μž₯/λ³€κ²½ μ‹œ, λ§΅ nick에 μ €μž₯ 된 ν•΄λ‹Ή μ•„μ΄λ””μ˜ λ‹‰λ„€μž„μ„ λ³€κ²½ν•œλ‹€. 
  • historyλŠ” ν•œ λͺ…령에 λŒ€ν•΄μ„œ μ‚¬μš©μž 아이디 + λ©”μ„Έμ§€ 2κ°€μ§€λ‘œ λ‚˜λˆ  μ €μž₯λ˜μ—ˆμœΌλ―€λ‘œ, 정닡은 κ·Έ 크기의 절반만큼 배열을 λ§Œλ“ λ‹€.
    • μ •λ‹΅ λ°°μ—΄ answer에 아이디에 λ”°λ₯Έ λ‹‰λ„€μž„κ³Ό λ©”μ„Έμ§€λ₯Ό 합쳐 μ €μž₯ ν›„ λ°˜ν™˜ν•œλ‹€.

πŸ”Έ end πŸ”Έ

  • 아이디λ₯Ό 맡으둜 μ μš©ν•˜λŠ” λΆ€λΆ„λ§Œ μƒκ°ν•œλ‹€λ©΄ μ‰½κ²Œ 풀이할 수 있던 λ¬Έμ œμ˜€λ‹€.
    • λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€, λ‚˜κ°”μŠ΅λ‹ˆλ‹€ ν•˜λŠ” λ©”μ„Έμ§€κ°€ μ€‘λ³΅μœΌλ‘œ μ €μž₯ λ˜λŠ”κ²Œ λ©”λͺ¨λ¦¬λ₯Ό 많이 μ°¨μ§€ν•˜μ§€ μ•Šμ„κΉŒ ν–ˆμ§€λ§Œ, λ¬Έμžμ—΄μ΄λΌμ„œ μ–΄μ°¨ν”Ό μ£Όμ†Œλ‘œ μ €μž₯λ˜μ—ˆμ„ν…Œλ‹ˆ 크게 λ¬Έμ œλ˜μ§€ μ•Šμ•˜μ„ 것이닀.
    • 쒀더 효율적으둜 ν•˜κ³ μž 아이디 λ°°μ—΄, λ©”μ„Έμ§€ λ°°μ—΄ λ”°λ‘œ μ €μž₯ν•˜μ§€ μ•Šκ³ , 큐에 λ„£μ–΄λ³΄μ•˜λŠ”λ° μ„±λŠ₯ λΉ„κ΅λŠ” 해보지 μ•Šμ•„μ„œ 잘 λͺ¨λ₯΄κ² μ§€λ§Œ, 배열을 인덱슀둜 μ°Έμ‘°ν•΄μ„œ μ§€μ†μ μœΌλ‘œ μ„ ν˜• 탐색이 λ°œμƒν•˜λŠ” 것 λ³΄λ‹€λŠ” μ•ž μ›μ†Œλ₯Ό μ œκ±°ν•΄λ‚˜κ°€λŠ” 방식이 더 λΉ¨λžμ„ κ²ƒμœΌλ‘œ μ˜ˆμƒν•œλ‹€.
  • λ‹€λ₯Έ 풀이λ₯Ό λ³΄λ‹ˆ 객체지ν–₯으둜 κ΅¬ν˜„ν•œ κ±Έ λ΄€λŠ”λ°, ν™•μ‹€νžˆ ν™•μž₯성이 μΆ©λΆ„νžˆ μ’‹μ•„λ³΄μ˜€μ§€λ§Œ 맡만 μ“°λ©΄ λ˜λŠ” λ¬Έμ œμ—μ„œ μ’€ κ³Όν•œ 풀이 κ°™μ•˜λ‹€. κ·Έλƒ₯ μ½”ν…Œμš© 풀이와 객체지ν–₯ 적용 λŠ₯λ ₯을 λ³΄λŠ” 과제 ν’€μ΄λŠ” 이런 차이가 μžˆμ„ 것 κ°™λ‹€.
  • 2019 KAKAO RECRUITMENT의 1번 문제이고 μ •λ‹΅λ₯ μ€ 59.91%둜 λ‚œμ΄λ„μ— λΉ„ν•΄μ„œ μ˜€λ‹΅λ₯ μ΄ λ†’μ•˜λ˜ 것 κ°™λ‹€. νš¨μœ¨μ„± 평가가 λ“€μ–΄κ°”λ‹€κ³  ν•˜λŠ”λ°, λ§΅ 자료ꡬ쑰λ₯Ό μ„ νƒν•˜μ§€ μ•Šμ•˜μœΌλ©΄ ν†΅κ³Όλ˜μ§€ μ•Šμ•˜λ˜ 것 κ°™λ‹€.
첫 번째 λ¬Έμ œλ‹΅κ²Œ 큰 κ³ λ―Ό 없이 μ—°κ΄€ λ°°μ—΄(λ§΅)을 μ΄μš©ν•΄μ„œ μ‰½κ²Œ ν’€ 수 μžˆμŠ΅λ‹ˆλ‹€.
record λ₯Ό 순회 ν•˜λ©΄μ„œ
Enter, Leave 인 경우 μœ μ € 아이디와 ν•¨κ»˜ 정닡에 좜λ ₯될 λ©”μ‹œμ§€μ˜ μ’…λ₯˜λ₯Ό 기둝을 ν•΄λ‘‘λ‹ˆλ‹€. μ΄λ ‡κ²Œ 기둝해둔 것을 events λΌκ³  ν•©μ‹œλ‹€.Enter, Change 인 경우 μ—°κ΄€ 배열을 μ΄μš©ν•˜μ—¬ 각 μœ μ € 아이디λ₯Ό ν‚€λ‘œ, λ‹‰λ„€μž„μ„ κ°’μœΌλ‘œ μ €μž₯ν•΄ λ‘‘λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•΄μ„œ μ΅œμ’… λ‹‰λ„€μž„μ„ μœ μ € μ•„μ΄λ””λ³„λ‘œ μœ μ§€ν•©λ‹ˆλ‹€.
이제 events λ₯Ό μˆœνšŒν•˜λ©΄μ„œ μ±„νŒ…λ°©μ— 좜λ ₯ν•  λ©”μ‹œμ§€λ₯Ό 생성할 λ•Œ, μ—°κ΄€ 배열에 μ €μž₯된 아이디별 μ΅œμ’… λ‹‰λ„€μž„μ„ μ΄μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

728x90