-
1/30기록 - 프로그래머스 2019 Kakao level2 - 오픈 채팅방Algorithm 2022. 1. 30. 15:35728x90
오늘은 어제 하루를 쉬었기 때문에 알고리즘 스터디원들과 함께 카카오 2019 level2의 오픈 채팅방 문제를 풀어보기로 했다. 문제가 너무나 긴 관계로 문제는 코딩테스트 연습 - 오픈채팅방 | 프로그래머스 (programmers.co.kr)을 참고하기를 바란다.
주된 포인트는 uid는 그대로이고, 닉네임이 바뀔 수 있다는 점과 세트로 아이디와 닉네임이 움직인다는 점이었다. 세트라면 HashMap을 이용해 key-value쌍으로 표현해 줄 수 있을 것이라고 생각했다.
이처럼 문제를 풀었는데, 하나 하나 뜯어서 보자. 큰 틀은 HashMap과 ArrayList의 활용이었다. Map은 uid와 name을 저장할 Key-value쌍을 나타내고, ArrayList는 출력 형식을 담아주기 위해 필요하다.
먼저 record배열을 split을 사용하여 공백단위로 끊어준다. 그렇게 되면 공백 단위로 끊어진 arr배열의 경우 arr[0]에는 Enter, Change, Leave가 위치하게 되고, arr[1]에는 uid가 arr[2]에는 nickname이 위치하게 된다.
이제 이를 이용해 문자열을 비교해보자. Enter의 경우 삽입하는 것이므로 map의 key에는 uid가 value에는 name을 넣어주고 list에 해당 arr배열을 담아준다. Change의 경우 써진 문구대로 uid에 해당하는 name이 모두 변경되어야 하므로 입입력된 값을 map의 key에 uid, value에 name을 담아준다. Leave의 경우 uid만 입력되고 nickname은 입력되지 않기 때문에 arr[2]인덱스가 없다. 그래서 arr를 list에 담아주기만 하면 된다.
자 이제 문구를 출력할 answer 배열을 선언하고 result라는 새로운 배열에 list를 개선된 for문을 통해 통째로 넣어준다. 여기서 nickname은 map의 key인 result배열 인덱스 1을 get() 해주면 value값인 name을 불러올 수 있으므로 이렇게 설정해준다. 이제 Enter와 Leave의 경우 출력할 문구를 설정해 주고 answer를 return 해주면 끝
처음에 생각은 Map으로 나타내고 list에 담아서 출력하면 끝인 거 아님? 이라고 생각했지만, 실행결과는 나오는데 채점을 하니 계속 0점이 나왔다. 미묘하게 틀린 부분들이 계속 존재했던 것이다. 역시 카카오... ㅠㅠㅠ 답이 나오고 나서도 시간을 줄이기 위해 계속 바꾸다보니 출력부분에서 또 split을 해 주지 않아도 되는 개선된 for문 이용방식이 가장 효율적인 것으로 판단했다.
이렇게 통과했고, level1에 이어 level2를 풀어보면서 HashMap의 사용법과 List를 다시 생각해 볼 수 있는 좋은 기회가 되었다. 어려운 문제를 풀고 계속 바꾸어 보면서 스스로 더 효율적인 방법을 찾는 방법 보다 더 좋은 공부는 없는 것 같다.
1/30 기록 끝!!!!!!!!
728x90'Algorithm' 카테고리의 다른 글
2/1기록 - 백준 11720 (0) 2022.02.01 1/31기록 - 백준 1475 (0) 2022.01.31 1/28기록 - 백준 1094 (0) 2022.01.28 1/27기록 - 프로그래머스 2019 KaKao 코딩테스트(실패율) (2) 2022.01.27 1/26기록 - 백준 1010 (0) 2022.01.26