Seren dev's blog

https://school.programmers.co.kr/learn/courses/30/lessons/42888

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

최종적으로 관리자가 보는 메시지는 유저가 들어오고 나간 기록이며, 유저의 최종적인 닉네임만 알면 된다.

따라서 들어오고 나가는 기록을 저장하고, 각 유저 아이디의 최종 닉네임을 저장해야 한다.

 

1. Enter, leave: 들어오고 나가는 것

Enter : uid, true

leave : uid, false

=> ArrayDeque<Data> inOutRecords:  맨 뒤에서 삽입 연산과, 처음부터 끝까지 순서대로 조회연산을 하므로, 속도와 메모리 측면에서 LinkedList보다 더 효율적인 ArrayDeque 자료구조 사용

Data는 (string, boolean)형 데이터를 저장하는 자료구조

 

2. change: 닉네임 변경

uid: nickname

=> Map<String, String> 자료구조를 사용하여 각 유저 아이디의 닉네임을 빠르게 조회

코드

import java.util.*;

class Solution {
    static class Data {
        String uid;
        boolean isIn;
        public Data(String uid, boolean isIn) {
            this.uid = uid;
            this.isIn = isIn;
        }
    }
    
    public String[] solution(String[] record) {
        ArrayDeque<Data> inOutRecords = new ArrayDeque<>();
        HashMap<String, String> nicknames = new HashMap<>();
        
        for (String r: record) {
            String[] words = r.split(" ");
            if (words[0].equals("Enter")) {
                String uid = words[1];
                String nickname = words[2];
                inOutRecords.add(new Data(uid, true));
                
                nicknames.put(uid, nickname);
            }
            else if (words[0].equals("Leave")) {
                String uid = words[1];
                inOutRecords.add(new Data(uid, false));
            }
            else if (words[0].equals("Change")) {
                String uid = words[1];
                String nickname = words[2];
                nicknames.put(uid, nickname);
            }
        }
        
        String[] answer = new String[inOutRecords.size()];
        int idx = 0;
        while (!inOutRecords.isEmpty()) {
            Data data = inOutRecords.poll();
            String uid = data.uid;
            String message = nicknames.get(uid) + "님이 ";
            
            if (data.isIn) {
                message += "들어왔습니다.";
            } else {
                message += "나갔습니다.";
            }
            
            answer[idx++] = message;
        }
        return answer;
    }
}

 

728x90
profile

Seren dev's blog

@Seren dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!