
쉬운 문제는 한 번에 두 세개씩 포스팅 하려고 했는데
이 문제는 생각 해 볼 여지가 많기 때문에 하나만 올린다.
논란의 여지가 있고 많은 의문이 제기되는 문제인데 같은 고민을 하신 분들께 이 문제와 관련해서 내가 생각해보고 조사한 내용을 공유를 해보고자한다.
내가 궁금했던 점은 아래 두 가지였다.
- "LENGTH 에 NULL 만 있는 경우는 없습니다"라는 조건은 왜 필요한 것인가요?
- 왜 테스트 케이스 2만 실패가 뜨는 것인가요? 내지 10cm 이하인데 왜 정답코드에서는 `<=`대신 `<` 10이 맞는가
이 포스팅에 대해서는 위 질문들에 대해 명쾌한 해답을 할 것이다
첫번째 질문은 문제를 자세히 읽고 생각해보니 답을 찾을 수 있었고 두번째 질문은 다른 사람의 설명을 참고했다.
🐠 잔챙이 잡은 수 구하기

LENGTH 컬럼에 NULL값이 들어가 있으면 비교 연산이 안 되기 때문에 IFNULL로 NULL인 요소를 0으로 바꿀 수 있도록 해 주었다. 결과는 CNT만 출력 하고 결과값이 맞아서 통과인데 테스트 2가 틀린것이 거슬렸다. 정답코드는 맞지만 출력결과창에서 테스트케이스 2에 왜 실패가 떴는지 궁금해졌다.
먼저 이 문제를 두가지 방법으로 풀 수 있는데 첫번째는 NULL 키워드로 푸는것이고 해당 쿼리를 수행하면 테스트케이스2에 실패가 뜨지 않는다. 아래는 모든 테스트케이스가 통과되는 코드이다. 하지만 길이가 10이하인지 숫자를 연산자 <=10으로 비교해서 풀려고하면 테스트케이스 하나가 오류가 난다.
정답코드
SELECT COUNT(*) AS FISH_COUNT
FROM FISH_INFO
WHERE LENGTH IS NULL;
🐦 왜 "LENGTH 에 NULL 만 있는 경우는 없습니다"라는 조건은 왜 필요한가?
나도 해당 조건이 왜 달려 있는지 생각 해 보다가 프로그래머스에서 해당 문제에 달린 댓글에 들어가봤다. 나랑 같은 질문을 한 사람이 있었다.

어떤 분이 해당 질문에 답을 주셨는데 길이라는 것이 실제로 NULL일 수는 없고 실제로는 존재하는 값이기 때문에 그렇다는데 나는 그 말에 동의하지 않는다.
그래서 댓글을 아예 남기지 않는 내가 처음으로 댓글을 남겨 보았다.
LENGTH 에 NULL 만 있는 경우는 없다.
= LENGTH에 NULL이 아닌 값이 하나라도 있다.
잡은 물고기 길이가 10cm 이하이면 LENGTH가 NULL이다.
= 물고기의 길이가 10cm 초과이면 LENGTH는 NULL이 아니다.
위의 논리에 따라 결국 답은 하나의 테이블 내에서 데이터의 LENGTH 컬럼이 모두 NULL 일 수는 없고 하나라도 NULL 값이 아닌 게 있다는 것이고, 그 말은 잡은 물고기들 중 적어도 하나는 10cm를 넘는다는 것이다.
그렇게 하지 않으면 WHERE절에서 NULL 처리하는 연산을 할 때 오류가 날 수 있기 때문이 아닐까?
🐦 왜 테스트 케이스 2만 실패가 뜨는 것인가? ( <=는 틀리고 <는 맞는 이유)
나도 처음에 테스트 2만 실패가 떴다

원래는 문제에서 길이가 10cm 이하인 물고기의 LENGTH 값은 NULL로 설정된다고 했으므로, 길이가 10cm 이하인 물고기를 찾을 때는 LENGTH가 NULL인 행만 찾으면 된다. 그래서 WHERE LENGTH IS NULL만 해 주면 되는 간단한 문제이다.
하지만 나도 문제를 처음 읽었을 때는 길이 값과 숫자가 나오니까 IFNULL이랑 비교 연산자를 써서 코드를 짜자는 생각이 들었다. 그래서 처음에 쿼리문에 10cm 이하를 나타나는 기호인 LEGNTH <= 10 을 써 줬다. 답은 그래서 테스트 2가 통과되지 못한 것이다. 여기서 등호(`=`)가 들어가면 틀린다. < 10 이라고 쓰면 정답 인정이 된다.
왜 <는 맞고 <=는 틀리는가?
나도 여기에 대한 자료 조사를 해 봤지만 명쾌한 답을 얻을 수가 없었다.
그와중 프로그래머스에서 해당 문제에 달린 16개의 댓글 중 하나를 읽었는데 이 이유가 가장 타당성이 있는 것 같다.
결국에는 부동소수점 문제일 가능성이 크다는 것이다.

이 분의 설명은 그럴싸하지만 아직도 명확하게 설득되지는 않는다. 묘하게 이런 의문이 제기된다. 부동소수면 항상 10.01을 10으로 인식하는가? 왜냐하면 할때마다 2번 테스트케이스는 틀렸다고 나오기 때문이다.
더 타당한 설명을 할 수 있으시거나 테스트케이스 2번값이 무엇인지 확인하는 법을 아시는 분은 댓글 남겨주시면 감사드립니다.
'코딩테스트 > SQL테스트' 카테고리의 다른 글
[프로그래머스] 👩🏻💻 (MySQL) 조건에 맞는 개발자 찾기 문제풀이 (67) | 2024.11.18 |
---|---|
[프로그래머스] 👩🏻💻 (Oracle/MySQL) 🐠 가장 큰 물고기 10마리 구하기 / 특정 물고기를 잡은 총 수 구하기 문제풀이 (49) | 2024.11.18 |
[프로그래머스] 👩🏻💻 (MySQL) 모든 레코드 조회하기 / 조건에 맞는 회원수 구하기 / Python 개발자 찾기 문제풀이 (40) | 2024.11.18 |
[프로그래머스] 👩🏻💻 (MySQL) 📚조건에 맞는 도서 리스트 출력하기 (43) | 2024.11.18 |
[프로그래머스] 👩🏻💻 (MySQL) 🍦인기 있는 아이스크림 / 🏭 강원도에 위치한 생산공장 목록 출력하기 / 👩🏻👧🏻👧🏻 12세 이하인 여자 환자 목록 출력하기 문제 풀이 (36) | 2024.11.17 |

쉬운 문제는 한 번에 두 세개씩 포스팅 하려고 했는데
이 문제는 생각 해 볼 여지가 많기 때문에 하나만 올린다.
논란의 여지가 있고 많은 의문이 제기되는 문제인데 같은 고민을 하신 분들께 이 문제와 관련해서 내가 생각해보고 조사한 내용을 공유를 해보고자한다.
내가 궁금했던 점은 아래 두 가지였다.
- "LENGTH 에 NULL 만 있는 경우는 없습니다"라는 조건은 왜 필요한 것인가요?
- 왜 테스트 케이스 2만 실패가 뜨는 것인가요? 내지 10cm 이하인데 왜 정답코드에서는 <=
대신 <
10이 맞는가
이 포스팅에 대해서는 위 질문들에 대해 명쾌한 해답을 할 것이다
첫번째 질문은 문제를 자세히 읽고 생각해보니 답을 찾을 수 있었고 두번째 질문은 다른 사람의 설명을 참고했다.
🐠 잔챙이 잡은 수 구하기

LENGTH 컬럼에 NULL값이 들어가 있으면 비교 연산이 안 되기 때문에 IFNULL로 NULL인 요소를 0으로 바꿀 수 있도록 해 주었다. 결과는 CNT만 출력 하고 결과값이 맞아서 통과인데 테스트 2가 틀린것이 거슬렸다. 정답코드는 맞지만 출력결과창에서 테스트케이스 2에 왜 실패가 떴는지 궁금해졌다.
먼저 이 문제를 두가지 방법으로 풀 수 있는데 첫번째는 NULL 키워드로 푸는것이고 해당 쿼리를 수행하면 테스트케이스2에 실패가 뜨지 않는다. 아래는 모든 테스트케이스가 통과되는 코드이다. 하지만 길이가 10이하인지 숫자를 연산자 <=10으로 비교해서 풀려고하면 테스트케이스 하나가 오류가 난다.
정답코드
SELECT COUNT(*) AS FISH_COUNT FROM FISH_INFO WHERE LENGTH IS NULL;
🐦 왜 "LENGTH 에 NULL 만 있는 경우는 없습니다"라는 조건은 왜 필요한가?
나도 해당 조건이 왜 달려 있는지 생각 해 보다가 프로그래머스에서 해당 문제에 달린 댓글에 들어가봤다. 나랑 같은 질문을 한 사람이 있었다.

어떤 분이 해당 질문에 답을 주셨는데 길이라는 것이 실제로 NULL일 수는 없고 실제로는 존재하는 값이기 때문에 그렇다는데 나는 그 말에 동의하지 않는다.
그래서 댓글을 아예 남기지 않는 내가 처음으로 댓글을 남겨 보았다.
LENGTH 에 NULL 만 있는 경우는 없다.
= LENGTH에 NULL이 아닌 값이 하나라도 있다.
잡은 물고기 길이가 10cm 이하이면 LENGTH가 NULL이다.
= 물고기의 길이가 10cm 초과이면 LENGTH는 NULL이 아니다.
위의 논리에 따라 결국 답은 하나의 테이블 내에서 데이터의 LENGTH 컬럼이 모두 NULL 일 수는 없고 하나라도 NULL 값이 아닌 게 있다는 것이고, 그 말은 잡은 물고기들 중 적어도 하나는 10cm를 넘는다는 것이다.
그렇게 하지 않으면 WHERE절에서 NULL 처리하는 연산을 할 때 오류가 날 수 있기 때문이 아닐까?
🐦 왜 테스트 케이스 2만 실패가 뜨는 것인가? ( <=는 틀리고 <는 맞는 이유)
나도 처음에 테스트 2만 실패가 떴다

원래는 문제에서 길이가 10cm 이하인 물고기의 LENGTH 값은 NULL로 설정된다고 했으므로, 길이가 10cm 이하인 물고기를 찾을 때는 LENGTH가 NULL인 행만 찾으면 된다. 그래서 WHERE LENGTH IS NULL만 해 주면 되는 간단한 문제이다.
하지만 나도 문제를 처음 읽었을 때는 길이 값과 숫자가 나오니까 IFNULL이랑 비교 연산자를 써서 코드를 짜자는 생각이 들었다. 그래서 처음에 쿼리문에 10cm 이하를 나타나는 기호인 LEGNTH <= 10 을 써 줬다. 답은 그래서 테스트 2가 통과되지 못한 것이다. 여기서 등호(=
)가 들어가면 틀린다. < 10 이라고 쓰면 정답 인정이 된다.
왜 <는 맞고 <=는 틀리는가?
나도 여기에 대한 자료 조사를 해 봤지만 명쾌한 답을 얻을 수가 없었다.
그와중 프로그래머스에서 해당 문제에 달린 16개의 댓글 중 하나를 읽었는데 이 이유가 가장 타당성이 있는 것 같다.
결국에는 부동소수점 문제일 가능성이 크다는 것이다.

이 분의 설명은 그럴싸하지만 아직도 명확하게 설득되지는 않는다. 묘하게 이런 의문이 제기된다. 부동소수면 항상 10.01을 10으로 인식하는가? 왜냐하면 할때마다 2번 테스트케이스는 틀렸다고 나오기 때문이다.
더 타당한 설명을 할 수 있으시거나 테스트케이스 2번값이 무엇인지 확인하는 법을 아시는 분은 댓글 남겨주시면 감사드립니다.
'코딩테스트 > SQL테스트' 카테고리의 다른 글
[프로그래머스] 👩🏻💻 (MySQL) 조건에 맞는 개발자 찾기 문제풀이 (67) | 2024.11.18 |
---|---|
[프로그래머스] 👩🏻💻 (Oracle/MySQL) 🐠 가장 큰 물고기 10마리 구하기 / 특정 물고기를 잡은 총 수 구하기 문제풀이 (49) | 2024.11.18 |
[프로그래머스] 👩🏻💻 (MySQL) 모든 레코드 조회하기 / 조건에 맞는 회원수 구하기 / Python 개발자 찾기 문제풀이 (40) | 2024.11.18 |
[프로그래머스] 👩🏻💻 (MySQL) 📚조건에 맞는 도서 리스트 출력하기 (43) | 2024.11.18 |
[프로그래머스] 👩🏻💻 (MySQL) 🍦인기 있는 아이스크림 / 🏭 강원도에 위치한 생산공장 목록 출력하기 / 👩🏻👧🏻👧🏻 12세 이하인 여자 환자 목록 출력하기 문제 풀이 (36) | 2024.11.17 |