마이의 개발 블로그

[프로그래머스] 오픈채팅방 (Java) 본문

코딩테스트/프로그래머스

[프로그래머스] 오픈채팅방 (Java)

개발자마이 2023. 1. 29. 18:12
반응형
 

프로그래머스

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

programmers.co.kr

 

처음에는 메시지를 먼저 만들어주고 나중에 마지막 닉네임으로 전부 교체해주는 식으로 접근하였으나, 시간초과와 런타임 에러가 나서 접근방식을 바꾸고 해결된 문제이다. 

 

- record를 한 바퀴 돌며 id에 해당하는 마지막 닉네임을 map에 저장 (key: 아이디, value: 닉네임)

- 같은 반복문 안에서 Change 명령어를 제외한 Enter, Leave의 경우에만 list에 저장

- list 사이즈만큼 String[] answer 생성

- map.get 메서드로 ID 가져오기 (중요)

- Enter, Leave에 따라 문구추가

 

Note

- 몇 달 전에 코테 문제 풀기 시작했을 때 이 문제를 보고 어떻게 해결해야할지 막막했는데 지금은 일단 손이 먼저 타이핑부터 시작하는 걸 보니 성장을 하고있는건가 싶기도 하다.

- 프로그래머스 질문하기 게시판에 개발자들이 문제 접근방법이나 예외사항에 대한 각자의 팁들을 게시해놓는데, 종종문제와 상관없는 경우를 본다. 이번 문제의 경우에는 특수문자를 걸러야 한다던지 글자수를 체크해야한다는 의견도 있었는데 문제를 잘 읽어보면 잘못된 명령어가 들어오는 경우는 없다고 표기되어있다. 

 

import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        String[] answer = {};
        
        Map<String, String> map = new HashMap<>();
        List<String> list = new ArrayList<>();
        
        for(int i = 0; i < record.length; i++){
            String[] arr = record[i].split(" ");
            
            if(arr[0].equals("Enter") || arr[0].equals("Leave")){
                list.add(record[i]);
            }
            
            if(arr.length > 2){
                map.put(arr[1], arr[2]);
            }
        }
        
        answer = new String[list.size()];
        
        for(int i = 0; i < answer.length; i++){
            String[] arr = list.get(i).split(" ");    
            answer[i] = "" + map.get(arr[1]);
            
            if(arr[0].equals("Enter")){
                answer[i] += "님이 들어왔습니다.";
            }else if(arr[0].equals("Leave")){
                answer[i] += "님이 나갔습니다.";
            }
        }
        
        return answer;
    }
}
반응형
Comments