티스토리 뷰

728x90

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

 

프로그래머스

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

programmers.co.kr

 

2019 KAKAO BLIND RECRUITMENT Level 2 문제다.

 

 

Level 1만큼이나 간단한 문제다.

 

key로 사용자 아이디가 들어가고, value로 닉네임이 저장되는 해시맵을 통해 풀었다.

 

채팅방에 들어온 후 닉네임을 한번도 바꾸지 않거나,

채팅방에 들어온 후 닉네임을 바꾸는 사용자가 있을 수 있으므로

주어진 record의 가장 첫 단어가 Enter이거나 Change인 경우에

map에 (아이디, 닉네임)을 넣어준다.

 

Enter 후 닉네임을 Change 한다면 map의 value가 변경된 닉네임으로 덮어지기 때문에

map의 value는 항상 가장 최신의 닉네임만이 담겨져 있다.

 

 

map에 다 담으면

다시 record를 탐색하며 한글 문자열 형태로 배열에 담는다.

이때 Change를 제외한 Enter, Leave인 경우에만 반환할 문자열 배열에 담기기 때문에 

map에 담을 때 Change인 경우의 갯수를 세고,

record.length - change 를 해주면 반환할 배열의 크기가 된다.

 

사용자 아이디로 map에 있는 닉네임을 가져와서 

Enter인지 Leave인지에 맞게 단순히 문자열을 구성하면 된다.

문자열을 합칠 때는 Stirng += 보다 StringBuilder가 효율적이기 때문에

StringBuilder로 문자열을 구성하고 배열에 넣어줄 때는 sb.toString() 해주었다.

 

 

import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        StringTokenizer st;
        HashMap<String, String> map = new HashMap<>();
        int change = 0;
        
        for(String str : record) {
            st = new StringTokenizer(str);
            String state = st.nextToken();
            
            if(!state.equals("Leave")) {
                if(state.equals("Change"))
                    change++;
                
                String id = st.nextToken();
                String nickname = st.nextToken();
                
                map.put(id, nickname);
            }
        }
        
        String[] ans = new String[record.length - change];
        int idx = 0;
        
        for(String str : record) {
            st = new StringTokenizer(str);
            
            String state = st.nextToken();
            
            if(state.equals("Change"))
                continue;
            
            String id = st.nextToken();
            StringBuilder sb = new StringBuilder();
            
            // 가장 마지막으로 변경한 닉네임
            sb.append(map.get(id));
            
            if(state.equals("Enter")) 
                sb.append("님이 들어왔습니다.");
            else 
                sb.append("님이 나갔습니다.");
            
            ans[idx++] = sb.toString();
        }

        return ans;
    }
}

 

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함