프로그래머스
2019 KAKAO BLIND RECRUITMENT
프로그래머스
코드 중의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[3차] 오픈채팅
문제 정리
1. 채팅방에 들어오거나 나갈 경우 메시지를 출력한다.
2. 닉네임이 변경될 경우 기존 채팅방에 출력되어 있던 메시지의 닉네임도 전부 변경한다.
3. 중복 닉네임을 허용하지만 유저 아이디는 중복을 허용하지 않는다.
4. 입장 퇴장에 관한 메시지를 배열에 저장하여 최종 채티방을 개설한 사람이 보게 되는 메시지를 문자열 배열로 return
시작하기 전 접근 방법
1. 미리 구해야 하는 문자 t개와 참가자 m 명이 존재하기 때문에 진법을 구해야 할 수를 t*m번 반복할 for문을 만든다.
2. n진수로 바꿀 Integer.toString(바꿀 숫자, n진법)을 이용한다 → String형반환
3. 반환한 String에서 튜브 차례를 구하고 해당 차례에 숫자를 subString을 이용하여 1개 가져온다.
4. 구해야 하는 String 길이가 t가 되면 반복문 종료 / 아니면 튜브 차례를 찾기 위해 튜브 순서에서 인원수만큼 플러스한다.

1. 매개값으로 주워지는 record 배열에서 띄어쓰기 기준으로 분류하여 저장할 배열을 만든다.
String[][] group = new String[record.length][3];
for (int i = 0; i < record.length; i++) {
group[i] = record[i].split(" ");
}
[x,0] = 첫단어(입장,퇴장,수정) / [x,1] = 유저 아이디 / [x,2] = 닉네임 이런 느낌으로 배열 생성하여 나눴다.
2. 유저 아이디와 닉네임을 쌍으로 이루어져 있기 때문에 HashMap을 이용해서 key=유저 아이디, value=닉네임(유저 아이디를 key로 설정한 이유는 유저 아이디는 중복을 허용하지 않기 때문에 같은 key에 다른 value가 들어오면 닉네임이 업데이트되는 형식으로 만들기 위해서 이다.)
[x,0]을 확인해서 유저 행동 여부를 확인해서 입장하였을 때 유저 정보를 map에 저장하며 Leave일 경우에는 유저에 상태정보가 변경되지 않기 때문에 넘긴다.
Enter와 Leave가 아닌 다른 update가 들어오면 value값을 수정하여 map에 저장하고 index값을 증가시킨다.
index을 설정한 이유는 결괏값에 배열 길이를 계산할 때 update 같은 경우는 유저가 입장, 퇴장이 아니기 때문에 해당 index만큼 배열을 만들 필요가 없기 때문이다.
HashMap<String, String> map = new HashMap<>();
for (int i = 0; i < group.length; i++) {
if (group[i][0].equals("Enter")) {
map.put(group[i][1], group[i][2]);
} else if (group[i][0].equals("Leave")) {
continue;
} else {
map.put(group[i][1], group[i][2]);
index++;
}
}
3. 입장과 퇴장에 대한 상태를 answer배열에 저장하면 되기 때문에 매개변수로 주어지는 배열길이에서 입장과 퇴장 말고 다른 값인 index값만큼 뺀 answer 배열을 만든다.
4. split로 문자를 나눈 배열에서 [x,0] 값에 Enter, Leave에 따라서 [x,1]에 해당하는 유저 아이디 정보를 가져와 해당 아이디에 value값으로 문장을 만들어 배열에 저장한다.
String[] answer = new String[record.length - index];
int idx = 0;
for (int i = 0; i < group.length; i++) {
if (group[i][0].equals("Enter")) {
answer[idx++] = map.get(group[i][1]) + "님이 들어왔습니다.";
} else if (group[i][0].equals("Leave")) {
answer[idx++] = map.get(group[i][1]) + "님이 나갔습니다.";
}
}
최종 코드
더보기
import java.util.*;
class Solution {
public String[] solution(String[] record) {
HashMap<String, String> map = new HashMap<>();
String[][] group = new String[record.length][3];
for (int i = 0; i < record.length; i++) {
group[i] = record[i].split(" ");
}
int index = 0;
for (int i = 0; i < group.length; i++) {
if (group[i][0].equals("Enter")) {
map.put(group[i][1], group[i][2]);
} else if (group[i][0].equals("Leave")) {
continue;
} else {
map.put(group[i][1], group[i][2]);
index++;
}
}
String[] answer = new String[record.length - index];
int idx = 0;
for (int i = 0; i < group.length; i++) {
if (group[i][0].equals("Enter")) {
answer[idx++] = map.get(group[i][1]) + "님이 들어왔습니다.";
} else if (group[i][0].equals("Leave")) {
answer[idx++] = map.get(group[i][1]) + "님이 나갔습니다.";
}
}
return answer;
}
}
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 두 큐 합 같게 만들기 (0) | 2024.01.25 |
|---|---|
| [프로그래머스] 크레인 인형뽑기 게임 (0) | 2024.01.25 |
| [프로그래머스] 파일명 정렬 (0) | 2024.01.23 |
| [프로그래머스] n진수 게임 (0) | 2024.01.23 |
| [프로그래머스] 압축 (2) | 2024.01.23 |