데이터 분석/SQL

[SQL] HackerRank The Blunder - CAST, CEIL 활용

된장찌개냠냠 2024. 5. 22. 11:20
반응형

해커랭크 SQL 문제 풀이: The Blunder

HackerRank에서 MySQL 기준으로 문제를 풀었습니다. 아래는 문제에 사용되는 테이블 예시입니다.

# EMPLOYEES 테이블
+----+---------+--------+
| ID | Name    | Salary |
+----+---------+--------+
|  1 | Kristeen| 1420   |
|  2 | Ashley  | 2006   |
|  3 | Julia   | 2210   |
|  4 | Maria   | 3000   |
+----+---------+--------+

 

 

문제링크: https://www.hackerrank.com/challenges/the-blunder/problem

 

The Blunder | HackerRank

Query the amount of error in Sam's result, rounded up to the next integer.

www.hackerrank.com

Samantha was tasked with calculating the average monthly salaries for all employees in the EMPLOYEES table, but did not realize her keyboard's  key was broken until after completing the calculation. She wants your help finding the difference between her miscalculation (using salaries with any zeros removed), and the actual average salary.

Write a query calculating the amount of error (i.e.:  average monthly salaries), and round it up to the next integer.

 

이 문제는 직원들의 월평균 급여를 계산하는 문제인데요. 여기서 사만다라는 직원이 평균을 계산하기 위해 급여를 모두 더했는데, 끝나고 나니 키보드의 0 키가 빠져있다는 것을 알게 됩니다. 즉, EMPLOYEES 테이블에 급여가 10050이라고 적혀있었다면, 실제로는 0이 다 빠진 15로 계산이 된 거죠. 즉, 아래와 같은 상황이 발생하게 된 것입니다.

# 정상 EMPLOYEES 테이블           # 사만다의 실수로 인한 계산 
+----+--------+--------+       +----+--------+--------+
| ID | NAME   | SALARY |       | ID | NAME   | SALARY |
+----+--------+--------+       +----+--------+--------+
|  1 | Alice  | 10050  |       |  1 | Alice  | 15     | # 10050 -> 15
|  2 | Bob    | 2000   |       |  2 | Bob    | 2      | # 2000 -> 2
|  3 | Charlie| 30500  |       |  3 | Charlie| 35     |
|  4 | David  | 4000   |       |  4 | David  | 4      |
|  5 | Eve    | 123000 |       |  5 | Eve    | 123    |
+----+--------+--------+       +----+--------+--------+

 

문제에서 요구하는 것은 1) 제대로 계산했을 때의 평균 급여 - 2) 사만다가 잘못 계산한 평균 급여의 차이를 구하고, 소수점 첫째 자리에서 올림 하라는 것입니다. 위 예시 테이블을 이용해서 한번 계산해 보면 아래와 같습니다.

 

- 1) 제대로 계산한 평균 급여: (10050+2000+30500+4000+123000)/5 = 33910

- 2) 실수로 계산한 평균 급여: (15+2+35+4+123)/5 = 35.8

- 1에서 2를 뺀 금액: 33874.2

- 최종적으로 소수점 첫째 자리에서 올림 한 금액: 33875 (정답)

 

 

The Blunder 정답: CAST, CEIL 활용

아래는 제가 제출한 정답입니다.

SELECT
	CEIL(AVG(salary) - AVG(CAST(REPLACE(CAST(salary AS CHAR), 0, "") as UNSIGNED)))
FROM employees

 

아래 순서로 접근했는데요,

 

1. 실제 평균 월급 구하기

AVG(salary) 부분입니다. 제대로 계산한 급여 평균이라 salary 컬럼을 그대로 이용합니다.

 

2. 잘못 계산한 평균 월급 구하기

AVG(CAST(REPLACE(CAST(salary AS CHAR), 0, "") as UNSIGNED)) 부분입니다. 숫자타입의 salary를 우선 문자 형태로 형변환을 해주기 위해 CAST 함수를 사용합니다. 그리고 REPLACE 함수를 사용해 문자열의 모든 0을 빈문자열("")로 변경합니다. 그렇게 변경한 문자열을 다시 숫자로 바꾸기 위해 CAST 함수를 사용해 UNSIGNED 타입으로 변경합니다. (여기서 UNSIGNED는 부호가 없는 정수를 나타냅니다. INT와 차이점은 부호가 없는 대신 사용할 수 있는 숫자의 범위가 그만큼 더 확장됩니다)

 

마지막으로 AVG 함수를 적용해서 평균 급여를 계산합니다.

*** 단, HackerRank MySQL로 푸는 기준으로 CAST 함수를 사용하지 않아도(=형변환을 하지 않아도) 무방합니다.

 

 

3. 두 평균의 차이 구하기

두 평균의 차이를 구하기 위해 뺄셈 기호(-)를 사용합니다

 

4. 소수점 첫째 자리에서 올림 하기 - CEIL 활용

최종 계산 결과를 CEIL 함수를 활용해 올림 처리합니다. CEIL은 해당 숫자보다 큰 정수 중 가장 작은 정수로 올림 한다(소수점 이하에서 올림 한다)는 뜻입니다.

 

 

 

HackerRank 모든 문제 풀이 모음 바로가기

 

정확하고 꼼꼼하게 씁니다

마케팅, 데이터, 프로덕트, 스타트업, 일상, 유용한 정보 등에 대해 씁니다.

onemorepatty.tistory.com

모든 SQL 코딩테스트 문제 풀이 모음 바로가기

 

정확하고 꼼꼼하게 씁니다

마케팅, 데이터, 프로덕트, 스타트업, 일상, 유용한 정보 등에 대해 씁니다.

onemorepatty.tistory.com

 

반응형