[Javascript] 코딩테스트 - "H" + "i" + +", there."의 결과는?

코딩테스트로 자주 나오는 간단한 문제입니다.

먼저 함정 체크부터 합니다.

"Hi, there." 라고 썼으면 -100점입니다.

"i" 뒤에 "+"가 두개 있는 것이 오타라고 생각하거나, "+"가 한 개라고 착각하면 이미 탈락입니다.

이 문제는 두 가지 문제를 이해하는지를 확인하는 문제입니다.

문자열 텍스트는 다양하게 바뀝니다.

혼동을 주기 위해 특수문자를 넣기도 하고, "+ +" 뒤에 오는 문자열에 숫자를 넣기도 합니다.

기본 원리는 모두 동일합니다.

1. "+ +"의 이해

"++"로 붙여쓰면 구문 오류가 나므로 당연히 띄어서 "+ +"입니다.

문제의 핵심은 "+ +"를 알고 있고 "+"가 문자열 앞에 있으면 어떻게 되는지, 그러니까 타입 캐스팅이 어떻게 이루어지는지 정확하게 알고 있는지를 묻는 문제입니다.

타입 캐스팅 적용 순서와 "+ +"로 인해 뒤쪽의 ", there." 최종 값이 무엇이 되는지를 알아야 합니다.

먼저 "+ +" 는 파싱이 되면서 "H" + "i" + (+", there.")로 나누어집니다. "+"가 2개 오고 오른쪽에 피 연산자가 있으면 이렇게 분리됩니다.

(+", there.")는 왼쪽에 숫자 연산자가 있으므로 ", there."는 숫자(Number)로 캐스팅 시도를 하게 됩니다.

그런데 문자열 안에 적절하게 숫자로 파싱 할 수 있는 요소가 없기 때문에 NaN(Not a Number)이 리턴됩니다.

NaN은 자바스크립트의 내장 프리미티브 타입니다. 특수한 타입이지만 문자열이 아닌 NaN 타입이 반환됩니다.

그래서 다음과 같이 됩니다.

"H" + "i" + NaN

타입 캐스팅은 기본적으로 왼쪽의 타입을 따라갑니다.

따라 "H" + "i"는 "Hi"로 합쳐지고, 다음과 같은 최종 연산식이 만들어지게 됩니다.

"Hi" + NaN

2. NaN의 타입 캐스팅

이 문제의 두 번째 함정입니다.

실전에서 코딩을 해도 NaN을 타입 캐스팅을 하지는 않습니다. NaN이 발생하면 예외처리를 하거나 제외를 해서 결과에서 배제를 합니다. 아니면 NaN이 나온 것 자체가 오류 상황이기 때문에 앞의 로직을 다시 확인해서 문제를 해결하게 됩니다.

상식적으로는 그렇습니다.

문자열과 NaN을 합치면 NaN은 타입 캐스팅이 돼서 문자열 "NaN"으로 바뀝니다.

그래서 정답은 다음과 같이 됩니다.

"HiNaN"

NaN 프리미티브 타입이 문자열로 바뀌면 어떤 값이 될까? 가 핵심 문제입니다.

조금 다르게 생각해서 왼쪽이 숫자여서 숫자 + NaN이 되면 어떻게 될까?

NaN이 나옵니다.

NaN 타입의 NaN입니다. 문자열 "NaN"이 아닙니다.

이것조차 몰랐다면 아얘 기본이 안된 것입니다.

결과 조합을 할 때 NaN이 발생하면 타입캐스팅이 되면서 문제가 될 수 있다는 걸 인식하고 있는지를 묻는 기초 코딩테스트 문제입니다.