일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- 자바
- 카카오블라인드코딩테스트
- JPA
- SWEA
- Java
- 달빛클럽 1기
- 완전탐색
- 달빛클럽1기
- HashMap
- 알고리즘
- dfs
- 인플레이션에서 살아남기
- 리액트
- BOJ
- Stack
- 백준
- 달빛클럽
- programmers
- React
- 경제공부
- ReactJS로 영화 웹 서비스 만들기
- Algorithm
- 달빛캠퍼스
- Array
- React.js
- 재귀
- 노마드코더
- 프로그래머스
- 노마드코더 강의
- SoftwareExpertAcademy
- Today
- Total
th42500의 TIL
[Java] 2019 KAKAO BLIND RECRUITMENT - 오픈채팅방 본문
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;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[Java] 2019 카카오 개발자 겨울 인턴십 - 크레인 인형뽑기 게임 (0) | 2022.03.24 |
---|---|
[Java] 2021 KAKAO BLIND RECRUITMENT - 메뉴리뉴얼 (0) | 2022.03.22 |
[Java] 해시 - 전화번호 목록 (Lv2) (0) | 2022.03.02 |
[Java] 해시 - 위장 (Lv2) (0) | 2022.03.01 |
[Java] 해시 - 완주하지 못한 선수(Lv1) (0) | 2022.03.01 |