2022 우테코에서 진행하는 공개된 사전과제 코딩테스트 문제 입니다.
https://github.com/Backcoder-June/java-onboarding
GitHub - Backcoder-June/java-onboarding: 온보딩 미션을 진행하는 저장소
온보딩 미션을 진행하는 저장소. Contribute to Backcoder-June/java-onboarding development by creating an account on GitHub.
github.com
( 상세한 문제 설명은 링크를 타고 들어가서 확인해주세요! )
Problem 7
SNS 추천친구 기능을 구현해 보는 문제였다. 내 친구의 친구이면 +10, 내 피드를 방문했으면 +1 스코어를 주는 방식으로, 점수가 높은 친구 5명을 점수 순으로, 동점일 경우 알파벳 순으로 정렬해서 리턴한다.
=> 전체적인 기능 요구 사항을 순차적으로 구현할 수 있는가
=> 객체 지향적, 메소드화를 통한 구현
=> TreeMap, sort, stream.sorted 등을 활용 해 자료구조를 정렬할 수 있는가
(1) 나의 친구를 구하고 => 내 친구의 친구를 구해야 한다.
이런 기능들은, 충분히 재활용의 가능성이 높기도 하고, 나의 경우 구현하는 과정에서 코드도 길게 구현이 됬기 때문에,
객체화, 메소드화 해서 구현하라는 무언의 압박을 받은 느낌이기도 했다.
=> 반복문으로 내 친구, 내 친구의 친구 List 를 리턴하는 메소드를 정의한다. ( 개선의 여지가 많아보인다. )
(2) 내 친구의 친구에게는 +10, 방문자에게는 +1 점을 주고, 친구의 이름과 점수를 map 으로 리턴하는 메소드를 정의했다.
=> 이 후에, 점수에 따라, 알파벳에 따라 정렬을 해줘야 하기 때문에, 이름과 점수 두 값이 모두 필요했고, map 을 택했다.
=> Key = 이름 / value = 아는 친구 수에 따라 +10, 방문수에 따라 +1 을 넣어주는데,
Integer 타입이므로 초기값이 없을 경우 0 을 주었고,
재귀를 사용해야 하므로, key 값으로 불러온 value 값에 스코어를 더해주는 방식을 사용했다.
(3) 정렬
정렬하는 데, 가장 많은 시간이 잡아먹혔다.
map 구조로, 해당하는 추천친구목록이 key=이름 / value=점수 까지는 리턴이 됬지만
여기서 점수로 정렬을 시키고 난 뒤, 동일 점수에 대해 알파벳 순 정렬을 하는 부분이 생각보다 까다로웠다.
- map 의 점수 부분만을 List 로 받아와서 sort 시킨 뒤, reverse 해서 역순으로 정렬 ( 희망하는 정렬 순서 )
- 정렬된 점수를 순서대로 불러오며, 해당하는 점수를 가진 문자열을 새로운 List 에 담는다.
- map 을 HashMap 으로 할 경우, 문자열에 대한 정렬이 따로 구현되어야 한다.
=> **TreeMap 은 기본적으로 정렬된 순서로 값이 들어가기 때문에, 문자열에 대한 정렬이 자동으로 되어있다.
즉, 알파벳 순으로 정렬된 이름을 가지고 순서대로 자료처리가 이루어졌기 때문에, list 에도 기본적으로 알파벳 순서로 들어가게 되고, 점수에 대한 정렬만 적용되었다.
- TreeMap, LinkedHashMap, stream.sorted, 람다식을 이용한 방법등 map정렬에는 다양한 방식이 있었다.
public class Problem7 {
public static List<String> getFriends(List<List<String>> friends, String user) {
List<String> userFriend = new ArrayList<>();
for (int i = 0; i < friends.size(); i++) {
if (friends.get(i).get(0).equals(user)) {
userFriend.add(friends.get(i).get(1));
}
if (friends.get(i).get(1).equals(user)) {
userFriend.add(friends.get(i).get(0));
}
}
return userFriend;
}
public static List<String> getSharedFriends(List<List<String>> friends, List<String> myfriends, String user) {
List<String> sharedFriends = new ArrayList<>();
for (int i = 0; i < friends.size(); i++) {
for (int j = 0; j < myfriends.size(); j++) {
if (friends.get(i).get(0).equals(myfriends.get(j)) && !friends.get(i).get(1).equals(user)) {
sharedFriends.add(friends.get(i).get(1));
}
if (friends.get(i).get(1).equals(myfriends.get(j)) && !friends.get(i).get(1).equals(user)) {
sharedFriends.add(friends.get(i).get(0));
}
}
}
return sharedFriends;
}
public static Map<String, Integer> getScoreBoard(List<String> sharedFriends, List<String> myfriends, List<String> visitors) {
Map<String, Integer> scoreBoard = new TreeMap<>();
for (String oneFriend : sharedFriends
) {
if (scoreBoard.get(oneFriend) == null) {
scoreBoard.put(oneFriend, 0);
}
scoreBoard.put(oneFriend, scoreBoard.get(oneFriend) + 10);
}
for (String visitFriend : visitors
) {
if (!myfriends.contains(visitFriend)) {
if (scoreBoard.get(visitFriend) == null) {
scoreBoard.put(visitFriend, 0);
}
scoreBoard.put(visitFriend, scoreBoard.get(visitFriend) + 1);
}
}
return scoreBoard;
}
public static List<String> solution(String user, List<List<String>> friends, List<String> visitors) {
List<String> myfriends = getFriends(friends, user);
List<String> sharedFriends = getSharedFriends(friends, myfriends, user);
Map<String, Integer> scoreBoard = getScoreBoard(sharedFriends, myfriends, visitors);
List<Integer> scoreArray = new ArrayList<>();
for (Integer score: scoreBoard.values()) {
scoreArray.add(score);
}
Collections.sort(scoreArray);
Collections.reverse(scoreArray);
List<String> recommendedFriends = new ArrayList<>();
for (int i = 0; i < scoreArray.size(); i++) {
for (String target:scoreBoard.keySet()
) {
if (scoreBoard.get(target) == scoreArray.get(i) && !recommendedFriends.contains(target) && recommendedFriends.size()<5) {
recommendedFriends.add(target);
}
}
}
return recommendedFriends;
}
}
'Coding Test' 카테고리의 다른 글
2022 우테코 4th Week java-bridge 리뷰 (2) | 2022.11.18 |
---|---|
2022 우테코 3rd Week java-Lotto 리뷰 (0) | 2022.11.11 |
2022 우테코 onboarding 5~6번 리뷰 (0) | 2022.11.09 |
2022 우테코 onboarding 3~4번 리뷰 (0) | 2022.11.08 |
2022 우테코 onboarding 1~2번 리뷰 (0) | 2022.11.08 |