몸과 마음이 건전한 SW 개발자

[HackerRank-MSSQL] 해커랭크 Basic Join - Average Population of Each Continent 본문

SQL/MSSQL

[HackerRank-MSSQL] 해커랭크 Basic Join - Average Population of Each Continent

스위태니 2026. 4. 21. 13:44
728x90

문제 링크

https://www.hackerrank.com/challenges/average-population-of-each-continent/problem?isFullScreen=true

 

Average Population of Each Continent | HackerRank

Query the names of all continents and their respective city populations, rounded down to the nearest integer.

www.hackerrank.com

틀린 코드 1

select co.continent, floor(avg(ci.population)) from city as ci 
left join country as co on ci.countrycode = co.code 
group by co.continent;

틀린 코드 2

select co.continent, floor(avg(ci.population)) from city as ci 
right join country as co on ci.countrycode = co.code 
group by co.continent;

정답 코드

SELECT 
    CO.Continent, 
    FLOOR(AVG(CI.Population))
FROM CITY AS CI
INNER JOIN COUNTRY AS CO 
    ON CI.CountryCode = CO.Code
GROUP BY CO.Continent;

풀이 과정

1. 문제 해결 사고 과정

  1. 연결(Join): CITY 테이블에는 인구 정보가 있고, COUNTRY 테이블에는 대륙 정보가 있습니다. 두 테이블을 CountryCode와 Code를 기준으로 합쳐야 합니다.
  2. 그룹화(Group By): 대륙별 평균을 구해야 하므로 Continent 컬럼을 기준으로 데이터를 묶습니다.
  3. 계산(Average): AVG(Population)를 사용하여 인구 평균을 구합니다.
  4. 내림(Floor & Integer): 소수점을 버리고(내림) 결과값을 정수(Integer) 형태로 출력해야 합니다.
 

2. 주요 오답 포인트 및 정리

  • 왜 INNER JOIN?
    • 도시가 있는 국가와 대륙만 계산하면 되기 때문. 만약 RIGHT JOIN을 써서 도시가 없는 대륙까지 나오면 평균값이 NULL이 되어 오답 처리가 될 수 있다.
  • 왜 CAST(... AS FLOAT)?
    • MSSQL에서 INT / INT를 하면 결과도 정수형이 되어 소수점이 미리 잘려나갈 수 있다. 정확한 평균 계산 후 내림을 하기 위해 잠시 실수형(FLOAT)으로 변환하는 것이 안전
  • 왜 FLOOR?
    • 문제에서 요구한 'Rounded down'에 가장 부합하는 함수. (소수점 첫째 자리에서 무조건 내림)

 

느낀점

  • left join을 해버리면 대륙이 명시되지 않은 데이터를 가져와서 null로 보여진다.
  • right join을 하면 도시에 인구수가 명시되지 않은 데이터까지 avg를 하기 때문에 null이 나온다.
  • 따라서 둘 다 있는 inner join으로 문제를 풀어야 한다.
  • 데이터가 어떻게 생겼는지를 모르니 풀기가 좀 까다로웠다.
728x90