https://school.programmers.co.kr/learn/courses/30/lessons/42888
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
최종적으로 관리자가 보는 메시지는 유저가 들어오고 나간 기록이며, 유저의 최종적인 닉네임만 알면 된다.
따라서 들어오고 나가는 기록을 저장하고, 각 유저 아이디의 최종 닉네임을 저장해야 한다.
1. Enter, leave: 들어오고 나가는 것
Enter : uid, true
leave : uid, false
=> ArrayDeque<Data> inOutRecords: 맨 뒤에서 삽입 연산과, 처음부터 끝까지 순서대로 조회연산을 하므로, 속도와 메모리 측면에서 LinkedList보다 더 효율적인 ArrayDeque 자료구조 사용
Data는 (string, boolean)형 데이터를 저장하는 자료구조
2. change: 닉네임 변경
uid: nickname
=> Map<String, String> 자료구조를 사용하여 각 유저 아이디의 닉네임을 빠르게 조회
코드
import java.util.*;
class Solution {
static class Data {
String uid;
boolean isIn;
public Data(String uid, boolean isIn) {
this.uid = uid;
this.isIn = isIn;
}
}
public String[] solution(String[] record) {
ArrayDeque<Data> inOutRecords = new ArrayDeque<>();
HashMap<String, String> nicknames = new HashMap<>();
for (String r: record) {
String[] words = r.split(" ");
if (words[0].equals("Enter")) {
String uid = words[1];
String nickname = words[2];
inOutRecords.add(new Data(uid, true));
nicknames.put(uid, nickname);
}
else if (words[0].equals("Leave")) {
String uid = words[1];
inOutRecords.add(new Data(uid, false));
}
else if (words[0].equals("Change")) {
String uid = words[1];
String nickname = words[2];
nicknames.put(uid, nickname);
}
}
String[] answer = new String[inOutRecords.size()];
int idx = 0;
while (!inOutRecords.isEmpty()) {
Data data = inOutRecords.poll();
String uid = data.uid;
String message = nicknames.get(uid) + "님이 ";
if (data.isIn) {
message += "들어왔습니다.";
} else {
message += "나갔습니다.";
}
answer[idx++] = message;
}
return answer;
}
}
728x90
'Algorithm 문제 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.2 : [3차] 방금 그 곡 - 자바[Java] (0) | 2023.10.12 |
---|---|
[프로그래머스] Lv.2 : [3차] 파일명 정렬 - 자바[Java] (0) | 2023.10.12 |
[프로그래머스] Lv.1 : 로또의 최고 순위와 최저 순위 - 자바[Java] (0) | 2023.10.01 |
[프로그래머스] Lv.1 : 체육복 - 자바[Java] (0) | 2023.09.30 |
[프로그래머스] Lv.1 : 실패율 - 자바[Java] (0) | 2023.09.30 |