코딩테스트 1(split, parseInt, toLowerCase, toString, reverse, map)
문제 1. 문자열 내 p와 y의 개수
대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
해답.
=> 대, 소문자가 모두 들어가있는 경우를 생각하고 toLowerCase() 함수를 사용하여 문자열을 전부 소문자로 바꿔주었다.
이후, 문자열 내에서 특정 문자의 개수를 세는 방법은 split함수를 사용하여, 특정 문자를 구분자로 넣고 -1 을 해 주는 방법이 있다. (split('p').length-1)
이렇게 p와 y를 비교해주는 구문을 넣으면 완료.
// split 함수를 이용하여, 문제를 풀 수 있어서 , 반복문을 사용하지 않아도 되었다. 이 방법을 몰랐다면 문자열을 배열로 전환시킨 후, p와 y의 개수를 비교했을 것 같다.
문제 2. 문자열을 정수로 바꾸기
문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.
예를들어 str이 "1234"이면 1234를 반환하고, "-1234"이면 -1234를 반환하면 됩니다.
str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.
해답.
=> 문자열을 정수로 변환하는 함수 parseInt()를 써주었다. 참고로 여기서 number() 함수를 쓰는것도 가능하다.
그렇다면 parseInt와 number의 차이점은 무엇인가?
- Number 함수는 주어진 값이 숫자로 변환될 수 있으면 그 값을 숫자로 변환하고, 그렇지 않으면 NaN을 반환한다. 반면 parseInt 함수는 문자열을 정수로 변환하는데, 첫 번째 숫자가 아닌 문자를 만나면 변환을 멈추고 그 이전까지 변환된 숫자를 반환한다.
- Number 함수는 부동 소수점 숫자, 정수, 혹은 숫자로 변환할 수 있는 다른 데이터 타입을 숫자로 변환할 수 있다. parseInt 함수는 문자열을 정수로 변환하는 것이 목적이므로 소수점 이하 숫자를 버리고 정수만 반환한다.
즉, Number 함수는 주어진 값이 숫자 혹은 숫자로 변환할 수 있는 값인지 확인하고 숫자로 변환하는 데 사용되며, parseInt는 문자열을 정수로 변환하는 데 사용된다.
// 이 외의 다른사람의 풀이를 보았는데 함수를 쓰지 않고 푸는 방법은 자바 스크립트의 특이한 연산을 사용하여 type을 바꿔주는 형식이였다.
문제 3. 약수의 합
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
해답.
=> 반복문과 조건문을 사용하여, 인자를 입력하면 0에서 부터 인자까지 인자를 나누도록 반복 하였고, 나머지를 반환하지 않는 경우 빈 배열에 i값을 합산 해 주는 형식으로 구현했다.
// 약수를 구하는 원리만 알고 있으면 쉽게 풀리는 문제였다.
문제 4. 자릿수 더하기
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
해답.
=> 먼저 숫자를 toString을 사용하여 문자열로 변환 시킨뒤, split("")을 사용하여 문자열을 배열로 바꿔주었다. 이 후, 배열의 합을 구하는 reduce 함수를 사용하여 배열의 합을 구해주었다.
// reduce 함수를 만들때, 배열안에 문자열인 숫자로 구성 되어 있을경우, parseInt를 사용하여 정수로 변환한 뒤에, 요소값을 넣어주어야 함을 알게되었다. 물론 여기서 parseInt가 아닌 Number를 사용해도 된다.
문제 5. 자연수 뒤집어 배열로 만들기
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
해답.
=> toString을 사용하여, 숫자를 문자열로 변환하였고, split("")을 사용하여 배열로 전환해주었다. 이후, reverse 함수를 사용하여 배열을 역순으로 변경 해 주었고. 이후 문자열인 숫자들을 정수로 변환 해 주기 위해, 배열을 순회하는 map함수를 사용하여, parseInt 함수와 함께 정수로 모두 변환 해 주었다.
// 여기서 parseInt가 아닌 단순하게 map(Number)로 구현해줘도 가능하다. 허나 여기서 map 대신 forEach를 써도 되지 않을까 생각했지만, map은 반환값이 있기 때문에 새 배열을 변수에 할당하는 것이 가능하지만 forEach는 값이 저장은 되지만 반환값이 없기 때문에 사용이 불가능 하다.
하루 총평.
레벨 0에서 코테가 이런 것이구나를 느꼈고, 레벨 1부터는 기록을 하기로 결정했다.
확실히 toString() 등 함수를 알고있으니 코테를 풀기 굉장히 수월해졌다. 이들을 몰랐을땐 너무 막막하고 계속 조건문 반복문을 이용할 생각만 했다. 함수를 많이 알고있을수록 유리해진다는 것을 알게 되었다.
또한. 예전에는 문제를 보자마자 키보드에 먼저 손이 갔지만, 지금은 문제를 읽고 머릿속으로 먼저 어떻게 풀어나갈 것인지 구상을 하게 되었고 풀이 순서를 차근차근 생각할 수 있게 되었다. 예를들어 1. 문자열로 먼저 바꾼다. 2. 배열로 변환 시킨다. 3. 이 배열을 역순으로 바꿔준다. 이런 식으로 생각하고 난 뒤에 키보드에 손을 올려놓으니 문제가 훨씬 잘 풀린다.
습관을 좋게 들여야 앞으로 코테를 해결해 나가기 수월 해 질듯하다.