반응형
관련글
ArrayList 직접 구현 관련 포스팅은 여기를 참조
Map 관련 포스팅은 여기(1번, 2번)를 참조
1. 개요
문제의 링크는 여기를 참조
문제의 내용은 아래의 더보기를 클릭하여 참조
채팅방에 입장 / 퇴장 시에 출력되는 문자들을 문자열 배열로 추가하여 반환하는 문제(닉네임 변경 시, 이전 문자열의 닉네임도 변경된다.)
2. 풀이
우선 다음과 같이 정리 된다.
① 채팅방에 문자열이 출력되는 경우
- 채팅방에 입장했을 때("OOO님이 들어왔습니다.")
- 채팅방을 퇴장했을 때("OOO님이 나갔습니다.")
② 닉네임이 변경되는 경우
- 채팅방에서 변경 시(Change)
- 퇴장 후, 재 입장할 때(Leave - Enter)
여기서 주의할 점은 A가 입장 시 OOO으로 들어왔고, 퇴장 후 다시 입장했을 때 닉네임이 XXX였다면, 기존 "OOO님이 들어왔습니다." 라는 문구 또한 "XXX님이 들어왔습니다." 로 바뀌어야 한다는 것이다.
따라서, 여기서 다음과 같은 2가지 자료구조를 사용하였다.
① Map(HashMap)
- 입장한 모든 인원과 닉네임을 매칭시키는 키-데이터 자료 구조
- 라이브러리 사용
② ArrayList
- 입장 / 퇴장 명령어 리스트를 저장함. 이후 닉네임과 매칭시켜 출력될 문자열을 저장함
- 직접 구현함
3. 코드
아래의 코드를 통해 정답을 알아보자.
import java.util.*;
class Solution {
public String[] solution(String[] record) {
MyList list = new MyList(); // 직접 구현한 ArrayList
Map<String, String> map = new HashMap<>(); // 유저 - 닉네임 매칭 저장을 위한 Map
for(String s : record){
String[] sr = s.split(" ");
if(sr[0].equals("Enter") || sr[0].equals("Leave")) list.add(sr[0] + " " + sr[1]); // 명령 별도로 인입
if(sr[0].equals("Enter") || sr[0].equals("Change")) map.put(sr[1], sr[2]); // 이름 변경
}
// 입장 / 퇴장 이력만 사용하여 결과 값 저장
String[] eff_record = list.toArray();
String[] answer = new String[eff_record.length];
int idx = 0;
for(String rec : eff_record){
String[] sr = rec.split(" ");
if(sr[0].equals("Enter")) answer[idx] = map.get(sr[1]) + "님이 들어왔습니다.";
else answer[idx] = map.get(sr[1]) + "님이 나갔습니다.";
idx++;
}
return answer;
}
}
// 직접 구현한 ArrayList
class MyList{
String[] arr = new String[16];
int size = 0;
public void add(String s){
if(arr.length == size+1) makeDouble();
arr[size++] = s;
}
public void makeDouble(){
String[] tmp = new String[size];
System.arraycopy(arr, 0, tmp, 0, size);
arr = new String[size*2];
System.arraycopy(tmp, 0, arr, 0, size);
}
public String[] toArray(){
String[] ret = new String[size];
for(int i=0; i < size; i++){
ret[i] = arr[i];
}
return ret;
}
}
읽어주셔서 감사합니다. 오류가 있으면 지적해주시면 반영하겠습니다.
반응형
'알고리즘 풀이(Problem Solving) > 자료구조' 카테고리의 다른 글
알고리즘 풀이 - 프로그래머스(뉴스 클러스터링(Lv 2), 맵) (0) | 2021.07.13 |
---|---|
알고리즘 풀이 - 프로그래머스(K번째 수(Lv 1), 정렬) (0) | 2021.06.26 |
알고리즘 풀이 - 프로그래머스(크레인 인형뽑기(Lv 1), 스택) (0) | 2021.06.24 |
알고리즘 풀이 - 프로그래머스(프린터, 큐) (0) | 2020.08.02 |
알고리즘 풀이 - 프로그래머스(다리를 지나는 트럭, 큐) (0) | 2020.08.02 |