🔗 문제 링크

https://programmers.co.kr/learn/courses/30/lessons/64061


👨🏻‍💻 작성한 코드 (8/25)

실행시간 초과가 나옴

class Solution {
    public String[] solution(String[] record) {
                
        User[] userList = new User[record.length];
        int count = 0;
        int changeCount = 0;
        for (String message: record){
            String[] strArr = message.split(" ");
            // Enter인데 현재 없는 user면 user객체생성
            if (strArr[0].equals("Enter") && !isExist(userList, strArr[1], count)){
                userList[count] = new User(strArr[1], strArr[2]);
                count++;
            }
            // Enter인데 user의 이름이 바껴서 접속한 경우
            else if(strArr[0].equals("Enter") && isExist(userList, strArr[1], count)){
                int userPosition = findUser(userList, strArr[1], count);
                if(userList[userPosition].getName() != strArr[2]){
                    userList[userPosition].setName(strArr[2]);   
                }
            }
            // 현재 존재하는 User이고 enter이면 이름이 같은지 확인 후 이름이다르면 변경
            else if (strArr[0].equals("Change")){
                int userPosition = findUser(userList, strArr[1], count);
                changeCount++;
                if(userList[userPosition].getName() != strArr[2]){
                    userList[userPosition].setName(strArr[2]);   
                }
            }
            
        }
        
        
        String[] answer = new String[record.length-changeCount];
        // String array의 크기는 length를 사용, length()가 아님
        int temp = 0;
        for (String message: record){
            String[] strArr = message.split(" ");
            if (strArr[0].equals("Enter")){          
                int userPosition = findUser(userList, strArr[1], count);
                //System.out.println(userList[userPosition].getName()+"님이 들어왔습니다.");
                answer[temp] = userList[userPosition].getName()+"님이 들어왔습니다.";
                temp++;
            }
            else if (strArr[0].equals("Leave")){          
                int userPosition = findUser(userList, strArr[1], count);
                //System.out.println(userList[userPosition].getName()+"님이 나갔습니다.");
                answer[temp] = userList[userPosition].getName()+"님이 나갔습니다.";
                temp++;
            }
        }
        
        return answer;
    }
    
    public int findUser(User[] userList, String userId, int count){
        for (int i=0; i< count; i++){
            if(userList[i].getUserId().equals(userId))
                return i;
        }
        return -1;
    }
                
    // userId가 리스트에 존재하는지 확인
    public boolean isExist(User[] userList, String userId, int count){
        if (userList[0] != null) {
            for (int i=0; i<count; i++){
                if (userId.equals(userList[i].getUserId())){
                    return true;
                }
            }
        }
        
        return false;
    }
}

// 유저 정보를 보관하는 class
class User {
    private String userId;
    private String name; 
    
    public User(){}
    
    public User(String userId, String name){
        this.userId = userId;
        this.name = name;
    }
    
    public String getUserId(){
        return userId;
    }
    
    public String getName(){
        return name;
    }
    
    public void setName(String name){
        this.name = name;
    }
    
}

😵 결과


📝 8월 25일의 후기

코드를 작성하다보니 쉬운 문제임에도 불구하고 코드의 길이가 길어졌으며 테스트26번부터 32번까지는 런타임 에러가 나오는 상황이다.
질문하기 목록을 보니 나와 같이 26번부터 런타임 오류가 나오는 사람들이 많이 존재하였으며 사람들이 질문하기에 올린 코드들을 보니 Map을 사용하여 코드가 훨씬 간결하였고 연산 수를 줄일 수 있을 것 같았다. Map으로..코드를 처음부터 다시 작성하고 올려보고자 한다...


👨🏻‍💻 작성한 코드 (11/3)

import java.util.StringTokenizer;
import java.util.HashMap;
import java.util.ArrayList;

class Solution {
    public String[] solution(String[] record) {
        HashMap<String, String> userInfo = new HashMap<>();
        int numOfAnswer = 0;
        
        for (String r : record) {
            StringTokenizer st = new StringTokenizer(r);
            String order = st.nextToken();
            
            if (order.charAt(0) == 'E' || order.charAt(0) == 'C') {
                String id = st.nextToken();
            	String name = st.nextToken();
                userInfo.put(id, name);
                numOfAnswer++;
            }
        }
        
        ArrayList<String> result = new ArrayList<>();
        int idx = 0;
        for (String r : record) {
            StringBuilder sb = new StringBuilder();
            StringTokenizer st = new StringTokenizer(r);
            String order = st.nextToken();
            String id = st.nextToken();
            
            
            if (order.charAt(0) == 'E') {
                sb.append(userInfo.get(id));
                sb.append("님이 들어왔습니다.");
                result.add(sb.toString());
            }
            else if (order.charAt(0) == 'C') {
                continue;
            }
            else if (order.charAt(0) == 'L') {
                sb.append(userInfo.get(id));
                sb.append("님이 나갔습니다.");
                result.add(sb.toString());
            }
        }
        
        String[] answer = new String[result.size()];
        result.toArray(answer);
        return answer;
    }
}

📝 정리

8월 25일에 문제 풀이를 하였을 때는 코딩테스트를 공부한지 얼마 안됐으며 자바를 시작한지도 얼마 안되어서 HashMap을 사용하지 못하여 문제를 어렵게 풀이하였던 것 같다.

11월 3일인 오늘 해당 문제를 다시 풀어보니 별 문제 없이 쉽게 구현이 가능하였다.

코테는 꾸준히 노력한 만큼 결과가 나오는것 같다🔥
앞으로 더 노력하여 Level3도 쉽게 풀 수 있을 정도의 실력으로 키워야겠다🔥🔥🔥

profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글