[ 알고리즘 ] LeetCode 2199. Finding the Topic of Each Post

이주 weekwith.me·2022년 6월 21일
0

알고리즘

목록 보기
19/73
post-thumbnail

블로그를 이전 중이라 완료되기 전까지는 벨로그에 작성할 계획입니다.
이후 모든 글은 https://weekwith.me 에 작성 예정이니 다른 글이 궁금하시다면 해당 링크를 통해 방문해주세요.

본 글은 [ LeetCode ] 2199. Finding the Topic of Each Post를 풀고 작성한 글입니다.

문제

테이블

Table: Keywords

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| topic_id    | int     |
| word        | varchar |
+-------------+---------+
(topic_id, word) is the primary key for this table.
Each row of this table contains the id of a topic and a word that is used to express this topic.
There may be more than one word to express the same topic and one word may be used to express multiple topics.

Table: Posts

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| post_id     | int     |
| content     | varchar |
+-------------+---------+
post_id is the primary key for this table.
Each row of this table contains the ID of a post and its content.
Content will consist only of English letters and spaces.

요구사항

Leetcode has collected some posts from its social media website and is interested in finding the topics of each post. Each topic can be expressed by one or more keywords. If a keyword of a certain topic exists in the content of a post (case insensitive) then the post has this topic.

Write an SQL query to find the topics of each post according to the following rules:

  • If the post does not have keywords from any topic, its topic should be "Ambiguous!" .
  • If the post has at least one keyword of any topic, its topic should be a string of the IDs of its topics sorted in ascending order and separated by commas ',' . The string should not contain duplicate IDs.

Return the result table in any order.

The query result format is in the following example.

풀이

접근법

LIKECONCAT 함수를 활용해 해당 단어가 포함되었는 지 여부를 판단할 수 있다. 이때 예시처럼 WarningWar 는 다른 단어이기 때문에 단어의 구분이 되는 공백을 활용해야 한다.

이후 여러 행으로 이루어진 단어를 한 행으로 묶어서 나타내기 위해서는 GROUP_CONCAT 함수를 사용한다. GROUP CONCAT 함수의 경우 그 표현 방법은 GROUP_CONCAT(DISTINCT column ORDER BY column SEPARATOR expression) 과 같다. 문제에서 topic_id 필드를 기준으로 오름차순 정렬하고 콤마( , )를 기준으로 구분하게 요구했기 때문에 ORDER BY 구 부분에는 topic_id 필드를 사용하고 SEPARATOR 구에는 기본 값이 곧 콤마( , )이기 때문에 그대로 둬도 된다.

나의 풀이

접근법을 토대로 문제를 해결하면 아래와 같다.

SELECT
    Posts.post_id,
    IFNULL(GROUP_CONCAT(DISTINCT Keywords.topic_id ORDER BY Keywords.topic_id), 'Ambiguous!') AS topic
FROM Posts
LEFT JOIN Keywords
ON (
    Posts.content LIKE Keywords.word
    OR
    Posts.content LIKE CONCAT('% ', Keywords.word)
    OR
    Posts.content LIKE CONCAT('% ', Keywords.word, ' %')
    OR
    Posts.content LIKE CONCAT(Keywords.word, ' %')
)
GROUP BY Posts.post_id;
profile
Be Happy 😆

0개의 댓글