Camp/T.I.L.

[TIL #28] Investments in 2016

BVM 2024. 10. 23. 20:11

https://leetcode.com/problems/investments-in-2016/description/

 

질문이 바로 이해가 가지 않아, 질문 이해에 약간의 시간이 더 투자된 문제.

 

  • 같은 ``tiv_2015``의 값을 공유하는 레코드가 2개 이상 존재하는 레코드
  • 위도와 경도가 같지 않은(같은 위치가 아니고 고유한) 레코드
  • 이 레코드들을 찾아서 각각의 ``tiv_2016``값을 더해서 소수점 2자리까지 반올림

진짜 이런 요구 사항이 실제로 존재할진 모르겠지만...

 

문제도 잘 다가오지 않고, 힌트도 이런 상황이다.

당연한 걸 힌트랍시고 준 걸 보면, 너무 간단한 문제라고 생각했나 보다.

 

처음엔 문제를 제대로 이해하지 못해 "윈도우 함수로 밀면서 같고 다른 걸 체크해야 하나?" 같은,

이상한 의문에 빠져있었다.

아무리 생각해도 이런 걸 원하는 건 아닌 거 같다는 생각이 들어 계속 문제를 재확인했다.

 

다른 사람은 이 문제에 대해 어떻게 생각하는지 궁금하기도 하여 ``Discussion``을 봤다.

사람 생각은 비슷한 것 같더군.

꽤 괜찮은 힌트도 얻을 수 있었기에 적용해 보기로 했다.

 

각 요구조건에 대해 카운팅을 통해 걸러내기만 하면 문제없을 것 같았다.

``tiv_2015``는 고유하면 안 되고, ``[lat, lon]``은 고유해야 한다.

 

SELECT tiv_2015
FROM Insurance
GROUP BY tiv_2015
HAVING COUNT(pid) > 1

 

SELECT lat, lon
FROM Insurance
GROUP BY lat, lon
HAVING COUNT(pid) = 1

이렇게 걸러낼 수 있겠다.

이를 ``WHERE``문을 통해 걸러내면 요구사항에 맞는 레코드들만 남을 것이다.

 

SELECT ROUND(SUM(tiv_2016), 2) AS tiv_2016

그럼 이렇게 한방에 다 더하면 될 것 같다.

 

최종 쿼리문은 다음과 같다.

SELECT ROUND(SUM(tiv_2016), 2) AS tiv_2016
FROM Insurance
WHERE tiv_2015 IN (
  SELECT tiv_2015
  FROM Insurance
  GROUP BY tiv_2015
  HAVING COUNT(pid) > 1
)
AND (lat, lon) IN (
  SELECT lat, lon
  FROM Insurance
  GROUP BY lat, lon
  HAVING COUNT(pid) = 1
);

 

 

``Discussion`` 탭에서 인상적인 부분은 다음과 같았다.

실생활에서 마주치지 않을 것 같은 문제들에 시간을 너무 많이 쓰지 말라는 내용에 대해,

진짜 금융권 현업자인진 모르겠으나 비슷한 문제에 직면한 적이 없다고 했다.

 

하지만 세상에 절대란 없지 않은가.

살다 보면 별별 일이 다 있기 때문에 이런 것들로 연습하는 것은 괜찮다고 생각한다.

그런데 문제 설명은 좀 못했다는 느낌은 조금 있다...

프로그래머스에서 주는 문제가 참 친절했다는 생각이 드는 것 같다.