본문 바로가기
Programming/SQL

[HackerRank] The Blunder - 올림/내림/반올림 함수, 타입 변환, REPLACE 함수

by 수박주스으 2025. 2. 9.

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

 

문제 설명

- 사만다는 모든 직원들에 대해 월 평균 급여를 구하려고 한다. 그러나 그녀는 계산을 마칠때까지 키보드 숫자 0이 고장난 상태인 것을 인지하지 못했다.

- 따라서 나의 도움을 받아, 계산착오가 있었던 부분과 실제값 사이의 차이를 찾으려고 한다.

- 구하는 것 : (실제 평균값, actual) - (잘못 계산 된 평균값, miscalculated)

- 그리고 그 값을 올림하여 다음 정수값으로 나타내라.

 

솔루션

SELECT CEIL(AVG(Salary) - AVG(e)) AS result
FROM (
    SELECT *
          ,CAST(REPLACE(CAST(Salary AS CHAR), '0', '') AS UNSIGNED) AS e
    FROM Employees
) AS SUB

- 기존에 있었던 Employee 테이블 옆에 0이 제거된 Salary 값을 추가한다.

- Salary의 avg와 Error의 avg를 구하여 차이를 구한다.

 

<틀렸던 이유>
1. REPLACE 잘못 사용.
2. 'round' 글자만 보고 반올림 하는 것으로 이해함.

 

 

개념 정리

하단의 내용은 학부 때 쓰던 '이것이 MySQL이다' 전공책을 참고하여 정리하였다.

 

1. REPLACE 함수

REPLACE 함수의 사용법은 아래와 같다.

SELECT REPLACE(문자열, 원래 문자열, 바꿀 문자열)

-- 예시
SELECT REPLACE('이것이 MySQL이다', '이것이', 'This is')
>> 'This is MySQL이다'

 

사용법은 정말 쉽다. 그러나 내가 문제에서 간과했던 부분은,

REPLACE함수는 '문자열'에서만 사용할 수 있는 함수라는 것이다.

 

문제에서 Salary는 Integer 타입으로 정의되어 있으니, 이것을 문자열로 타입 변환한 후에 REPLACE함수를 적용해야 한다.

물론, 해커랭크에서 REPLACE((Salary), '0', '') AS e --> 이 코드로 실행해도 문제는 없다. 혹시나 해서 수정 후 돌려봤는데 정답처리가 되었다... 이유는 잘 모르겠지만, 문법의 규칙대로 작성해야 향후 코드를 재활용하거나 할 때 문제없이 실행할 수 있다고 생각하기 때문에, 규칙에 맞게 작성하고 제출했다.

 

1) CAST : 타입 변환 함수

CAST(expr AS 변환할 type)

-- 숫자 -> 문자열
SELECT CAST(234 AS CHAR)
>> 문자열 타입의 234

-- 문자열 -> 숫자
SELECT CAST('2' AS UNSINGED
>> 숫자 타입의 2

 

 

2. 올림/내림/반올림

1) CEIL(), CEILING() : 올림

2) FLOOR() : 내림

3) ROUND() : 반올림

SELECT CEIL(5.5) -- 6
SELECT FLOOR(5.5) -- 5
SELECT ROUND(5.842901, 3) -- 5.843
SELECT ROUND(5961.60, -2) -- 6000, 두 번째 자리(십의자리 6)에서 반올림하여 6000이 된 것.

 

이때, ROUND()함수에 대해 좀 더 정리해보자면.

  • 자릿수 지정을 생략하는 경우, 0으로 간주되어 소수점 첫째 자리 기준으로 반올림을 한다.
  • 음수를 지정해 정수 파트를 반올림 할 수도 있다.
  • 인수(m) 값에 따른 반올림 위치
    • 양수 : 반올림하여 m자리까지 보이게
    • 생략 : 반올림하여 소수점이 안보이게 (정수형으로)
    • 음수 : m자리에서 반올림