본문 바로가기
문제풀이/프로그래머스

오픈채팅방 / 프로그래머스 연습문제 / programmers / level2 / Java

by RUCKUS 2021. 8. 6.

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

 

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

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

programmers.co.kr


이번문제는 복잡한 것 같지만 원리는 간단한? 문제이다.

오픈채팅방의 로그를 단순히 반복하는 코드만으로는 시간초과로 풀기 어려울 것이다.

따라서, List/Set/Map 같은 걸 익혀 두고 풀어보는 것이 좋다.

가볍게 정리하자면,

 

List : 순서가 있다. 데이터가 중복이 가능하다.

Set : 순서가 없다. 데이터 중복이 불가능하다.

Map : Key=Value의 형태로 저장된다. Key는 중복이 불가능하고, Value는 중복이 가능하다.

 

하여 난 List와 Map을 이용해 풀어보기로 했다.

 

[알고리즘 Flow]

1. 오픈채팅방 record의 길이만큼 반복한다.

2. 반복하면서 List에는 유저ID와 Command를 Map에는 유저ID와 닉네임을 저장한다.

3. 단, List에는 Change일때는 저장하지 않는다. (로그를 보여줄 필요가 없기 때문)

4. 반대로 Map에는 Leave일때 저장하지 않는다. (나갈때는 닉네임이 없기 때문)

5. List의 사이즈만큼 반복한다.

6. List의 유저ID를 키값으로 Map에서 닉네임을 가져온다.

7. List의 Command에 따라서 닉네임과 같이 출력한다.

 

[작성코드]

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class OpenChat {

	public static void main(String[] args) {
		OpenChat oc = new OpenChat();
		oc.solution(new String[] {"Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"});
	}
	
	public String[] solution(String[] record) {
		System.out.println(record[0].contains("Enter"));
		
		Map<String, String> userNicks = new HashMap<String, String>();
		List<String []> logs = new ArrayList<String []>();
		String[] log = null; 
		String command = null; 
		String uid = null; 
		String nickname = null;
		for (int i = 0; i < record.length; i++) {
			log = record[i].split(" ");
			command = log[0];
			uid = log[1];
			if (command.equals("Enter")) {
				nickname = log[2];
				userNicks.put(uid, nickname);
				logs.add(new String []{uid, command});
			} else if (command.equals("Change")) {
				nickname = log[2];
				userNicks.put(uid, nickname);
			} else {
				logs.add(new String []{uid, command});
			}
			
		}
		String answer [] = new String[logs.size()];
		String lastnick = null;
		for (int i = 0; i < logs.size(); i++) {
			uid = logs.get(i)[0];
			command = logs.get(i)[1];
			lastnick = userNicks.get(uid);

			if (command.equals("Enter")) {
				answer[i] = lastnick + "님이 들어왔습니다.";
			} else {
				answer[i] = lastnick + "님이 나갔습니다.";
			}
			
		}
		
		
		return answer;
	}

}

회사에서 짬짬히 할때는 집중이 안되서, 바로 안풀렸는데 집에서 집중하니까 금방 풀었다.


[깃허브링크]

https://github.com/RUCKUSJERRY/practiceOfAlgorithm/blob/main/Prs_Pratice/src/com/level02/OpenChat.java

 

GitHub - RUCKUSJERRY/practiceOfAlgorithm

Contribute to RUCKUSJERRY/practiceOfAlgorithm development by creating an account on GitHub.

github.com