th42500의 TIL

[Java] 2019 KAKAO BLIND RECRUITMENT - 오픈채팅방 본문

Algorithm/Programmers

[Java] 2019 KAKAO BLIND RECRUITMENT - 오픈채팅방

th42500 2022. 3. 17. 23:09

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

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

 

✔ 입출력 예시

오픈채팅방 예시

 

 

💡 포인트

1️⃣ nickName이 바뀔 수 있는 경우는 나가서 nickName을 변경하여 다시 들어오는 경우채팅창 내에서 nickName을

    변경하는 경우

2️⃣ Leave일 때에는 닉네임에 대한 정보가 없음 

3️⃣ 최대한 실행 시간을 줄여 코드의 효율성을 높이자

 

 

1️⃣ 첫번째 시도

❓ 풀이과정

   👉 User 클래스를 생성해서 record의 각 정보를 담고, User 클래스인 List에 넣어 기록을 넣어준다. 이때, Enter

       Change 일 때에는 만약 이전 기록에 일치하는 id에 대한 기록이 있다면 nickName을 현재 nickName으로 변경해

       주고 이번 기록 또한 List에 넣어준다.

❗ 결과

   👉 기본 예제는 맞았지만, 채점 결과 총 32개의 테스트 중 25~32번 테스트케이스에서 시간초과

 

✔ 소스코드

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

public class Solution { // 오픈채팅방

	public static void main(String[] args) {
		String[] record = { "Enter uid1234 Muzi", "Enter uid4567 Prodo", "Leave uid1234", "Enter uid1234 Prodo", "Change uid4567 Ryan" };
		System.out.println(Arrays.toString(solution(record)));
	}

	static class User{
		String command;
		String id;
		String nickName;
		public User(String command, String id, String nickName) {
			super();
			this.command = command;
			this.id = id;
			this.nickName = nickName;
		}
		@Override
		public String toString() {
			return "User [command=" + command + ", id=" + id + ", nickName=" + nickName + "]";
		}
		
	}
	
	private static String[] solution(String[] record) {
		List<User> list = new ArrayList<>();
		for (int i = 0; i < record.length; i++) {
			StringTokenizer st = new StringTokenizer(record[i]);  // 각 인덱스의 문자열을 token단위로 자르기
			String command = st.nextToken();
			String id = st.nextToken();
			String nickName;
			if(!command.equals("Leave")) {
				nickName = st.nextToken();
			}else {
				nickName = null;
			}
			
			User user = new User(command, id, nickName);
			
			// 기록 추가
			if(user.command.equals("Enter")) {
				for (int j = 0; j < list.size(); j++) {
					if(user.id.equals(list.get(j).id)) {
						list.get(j).nickName = user.nickName;
					}
				}
				list.add(user);
			}else if(user.command.equals("Leave")) {
				list.add(user);
				for (int j = 0; j < list.size(); j++) {
					if(user.id.equals(list.get(j).id)) {
						user.nickName = list.get(j).nickName;
					}
				}
			}else {
				for (int j = 0; j < list.size(); j++) {
					if(user.id.equals(list.get(j).id)) {
						list.get(j).nickName = user.nickName;
					}
				}
			}
		}
		
		// 확인
//		for (User user : list) {
//			System.out.println(user);
//		}
		
		String[] answer = new String[list.size()];
		
		for (int i = 0; i < answer.length; i++) {
			if(list.get(i).command.equals("Enter")) {
				answer[i] = list.get(i).nickName+"님이 들어왔습니다.";
			}else {
				answer[i] = list.get(i).nickName+"님이 나갔습니다.";
			}
		}
		return answer;
	}

}

 

2️⃣ 두번째 시도

❓ 풀이과정

   👉 시간초과를 줄이기 위해 List 대신 HashMap을 사용하여 원하는 Data에 한번에 접근할 수 있도록 바꿔보았다.

        record 배열에 담긴 문자열을 탐색하며 유저의 id와 Enter, Change에 의해 변경된 최종 nickName을 저장하고

        List를 만들어 List에 기록 문자열을 담는다. 이때, map의 id와 일치하는 id일 경우 nickName을 map에 저장해둔

        id의 nickName으로 변경하여 문자열을 저장한다. 그리고 이를 다시 answer 배열에 담아서 return 한다.        

❗ 결과

   👉 테스트 통과

 

✔ 소스코드

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

public class Solution { // 오픈채팅방

	public static void main(String[] args) {
		String[] record = { "Enter uid1234 Muzi", "Enter uid4567 Prodo", "Leave uid1234", "Enter uid1234 Prodo", "Change uid4567 Ryan" };
		System.out.println(Arrays.toString(solution(record)));
	}
	
	private static String[] solution(String[] record) {
		HashMap<String, String>map = new HashMap<>();
		for (int i = 0; i < record.length; i++) {
			StringTokenizer st  = new StringTokenizer(record[i]);
			String command = st.nextToken();
			String id = st.nextToken();
			String nickName;
			if(!command.equals("Leave")) {
				nickName = st.nextToken();
			} else {
				nickName = null;
			}
			
			if(command.equals("Enter")) {
				map.put(id, nickName);
			} else if(command.equals("Change")) {
				map.put(id, nickName); 
			}
		}
		
		List<String> tmp = new ArrayList<>();
		
		for (int i = 0; i < record.length; i++) {
			StringTokenizer st  = new StringTokenizer(record[i]);
			String command = st.nextToken();
			String id = st.nextToken();
			
			if(command.equals("Enter")) {
				tmp.add(map.get(id) + "님이 들어왔습니다.");
			}else if(command.equals("Leave")){
				tmp.add(map.get(id)+ "님이 나갔습니다.");
			}
		}
		
		String[] answer = new String[tmp.size()];
		for (int i = 0; i < answer.length; i++) {
			answer[i] = tmp.get(i).toString();
		}
		
		return answer;
	}

}

 

Comments