더밸코리아
 
 
카다로그
 

230728 X JAPAN 8년만의 신곡 'ANGEL' 릴리즈 (+ Twitter Japan이 X Japan이 된다고?)

페이지 정보

작성자 Mulan 댓글 0건 조회 1회

본문

Can twitter you solve this real interview question? Design Twitter - Design a simplified version of Twitter where users can post tweets, follow/unfollow another user, and is able to see the 10 most recent tweets in the user's news feed. Implement the Twitter class: * Twitter() Initializes your twitter objec...​​이번 문제는 알고리즘 보다는 어떻게 이걸 구현해야할지에 관해서 생각해볼만한 문제를 가져왔습니다.​이번 문제는 우리가 트위터를 디자인 할 twitter 것인데 다음과 같은 기능을 구현해야합니다.Twitter()Twitter 객체를 초기화합니다.void postTweet(int userId, int tweetId)tweetId와 userId를 조합하여 트윗을 하나 생성합니다. tweetId는 unique하게 주어져야합니다.ListgetNewsFeed(int userId)userId의 유저에 대해 뉴스피드를 불러옵니다. 이 때, userId가 팔로우한 모든 유저 아이디에 대해 최신순으로 가져와야합니다. 최대 10개의 트윗을 가져옵니다.void follow(int followerId, int followeeId)followerId에 해당하는 유저가 followeeId에 해당하는 유저를 팔로우 합니다.void unfollow(int followerId, int followeeId)followerId에 해당하는 유저가 followeeId에 해당하는 유저를 언팔로우합니다.​구현해야할 것은 굉장히 심플합니다. 저는 twitter 이 getNewsFeed(int)를 어떻게 작업해야할지 생각해보았습니다.팔로우한 모든 유저 아이디에 대해 최신순으로 가져와야하므로 저는 우선 Posts 클래스를 만들어서 거기에 priority와 tweetId를 달아두었습니다. 이 때, priority는 timestamp와 같다고 보아도 무방합니다.그 다음 저는 포스트를 유저ID를 key로 하고 value는 ArrayDeque;인 자료구조에 저장했습니다. 그렇게 저는 postTweet()을 구현했습니다.그 다음 팔로우를 할 때, 유저 ID를 key로 하는 follow 맵을 만들어서 그곳에서 팔로워를 관리하도록 하였습니다. 이 때, 팔로우 요청이 두 번 오더라도 twitter 중복으로 팔로우하면 안되므로 검사를 했습니다.그러므로 저의 getNewsFeed() 함수는 팔로워를 따로 관리하고 그 팔로워마다 게시물이 있으며, 뉴스피드를 불러올 때는 유저아이디가 팔로우하는 모든 팔로워들의 게시물들을 방문하여 그 게시물들과 자신의 게시물을 시간순으로 가져옵니다.시간순으로 나열하는 것은 그냥 Posts의 priority를 보고 하면 되므로 쉽게 해결할 수 있습니다.​사실 구현하는 것은 어렵지 않았습니다. 하지만 구현하는 방식이 이것만 있는 것은 아닙니다. 다음과 같은 방식은 어떨까요?postTweet()을 수행할 때, 자신을 팔로우한 모든 팔로워들의 twitter 뉴스피드에 트윗을 넣어주는 겁니다.이게 저는 처음에 비효율적으로 보였습니다. 왜냐하면 unfollow를 할 때 일일이 찾아가서 뉴스피드를 cleanup을 진행해야 했기 때문입니다.하지만 이것 역시도 굉장히 효율적인 방법입니다. 왜냐하면 만약 제가 팔로우하고 있는 사람이 1억개의 트윗을 가지고 있다면 어떨까요? 그러면 그 1억개의 트윗을 모두 메모리에 로드해야하니 굉장히 무거운 작업이 될 것입니다. 하지만 이 방법은 트윗이 아무리 많아도 상위 10개만 찾아서 메모리에 로드하면 되기 때문에 그런 걱정을 할 twitter 필요가 없습니다.​미숙하기는 하지만 제가 구현한 방식이 facebook에서 사용하는 방법으로, 이를 pull 모델이라고 합니다. 뉴스피드를 가져올 때 다른 팔로워들로부터 트윗을 당겨오기 때문입니다.반면에 두 번째로 소개드린 방법이 twitter에서 사용하는 push 모델이라고 합니다. 제가 tweet을 날리면 각 뉴스피드에 트윗을 밀어넣기 때문입니다.​pull 모델은 공간을 아끼는 대신에 시간을 지불합니다. 일일이 트윗을 시간순으로 찾아야하므로 거기서 오는 시간이 시간복잡도를 상승시킵니다. facebook과 twitter 모두 쓰기 요청보다 읽기 요청이 압도적으로 많습니다. 생각해보면 twitter 우리가 페이스북에 글을 쓰는 것은 기껏해야 하루에 한 두개 이지만 보는 것은 수백개에서 수천개가 될 수 있습니다. 이런 경우, 읽기 요청(getNewsFeed())을 할 때에 복잡한 알고리즘을 사용하는 것이 좋지는 않을 수 있겠지만 이 때문에 페이스북에서는 팔로워 수를 제한합니다.​반면에 push 모델은 시간 대신 공간을 지불합니다. 트윗의 복제본이 팔로워들에게 모두 있기 때문입니다. 이는 트위터의 경우 140자 제한의 매우 작은 메세지 모델을 갖고 있어서 그럴 수도 있겠습니다. twitter 특히 트위터는 팔로워 수를 제한하지 않습니다.​그래서 현대에서는 대부분 두 모델을 섞어서 사용합니다.페이스북의 경우는 알림에 대해서는 push notification을 사용합니다. 알림같은 데이터는 굉장히 작은 데이터이므로 push를 사용하더라도 공간복잡도를 크게 올리지는 않을 것입니다. 반면 평범한 피드 탐색에는 pull 매커니즘을 사용합니다.트위터의 경우는 실시간 트윗에 대해서는 push를 사용합니다. 실시간성이 중요한 경우에는 시간이 공간복잡도보다 중요하므로 합리적인 사용일 것입니다. 반면에 사용자 추천에 대해서는 pull 모델을 사용합니다.​​Contribute to RaonPark/baekjoon-solution development by twitter creating an account on GitHub.​

댓글목록

등록된 댓글이 없습니다.