단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.
s는 길이가 1 이상, 100이하인 스트링입니다.
s | return |
---|---|
"abcde" | "c" |
"qwer" | "we" |
function solution(s) {
let halfLength = (s.length -1) / 2
return s.slice(halfLength,s.length % 2 === 1? halfLength +1 : halfLength +2);
}
slice()
는 인수로 시작 인덱스, 끝나는 인덱스를 받아 준다. 이 인수로 인덱스에 맞는 요소를 잘라 준다. 유의할 점은 마지막 인덱스는 제거하고 인출을 하기 때문에,
arr = [1, 2, 3, 4]
arr.slice(0, 3)//[1,2,3]
이러한 결과를 나타내게 된다. arr[3]인 4를 제외하고 앞부분까지 잘라 주는 것이다.slice()
는 배열을 자체를 잘라주는 게 아니라 배열의 복사본을 잘라준다는 특징도 있다.
그래서 일단 문자열 길이의 절반을 halfLength라는 변수에 담아 줬다. slice()
는 소수점 숫자를 담아주면 자동으로 정수로 잘라 준다. 예를 들어 slice(2, 3)
과 slice(2.5, 3)
은 같은 값을 출력한다. 참고
따라서 첫 번째 인수는 문자열 길이의 절반을 쓰면 된다. 두 번째 인수는 짝수냐 홀수냐에 따라 달라지기 때문에 나머지를 체크해서 홀수라면 절반 값에 +1, 짝수라면 절반 값에 +2를 해줬다.
function solution(s) {
return s.substr(Math.ceil(s.length / 2) - 1, s.length % 2 === 0 ? 2 : 1);
}
이 풀이는 참고를 위해서 가져오긴 했지만 권장되는 방법은 아니다. substr()
이 일부 브라우저에서 지원하긴 하지만 사라지고 있는 방법이고, 언제 없어질지 모르므로 substr()
를 쓰는 것을 지양하라고 한다. 대신 substring()
을 쓰는 것이 권장된다. substring()
은 slice()
처럼 첫 번째 인덱스와 마지막 인덱스를 똑같이 받아 준다. slice()
와 substring()
은 첫번째 인수 < 두번째 인수이고 둘다 값이 자연수일 때에는 동일하지만, 다른 경우에는 살짝 용법이 달라질 수 있다.
substr()
은 slice와 쓰는 방식이 살짝 다르다. slice는 시작과 끝의 인덱스를 인수로 받지만, substr는 시작 지점의 인덱스와 필요한 문자열의 길이를 받는다.
console.log("abcdef".substr(2,2));//cd
console.log("abcdef".slice(2,4));//cd
따라서 똑같은 cd를 인출하려면 인수를 다르게 줘야 하는 것이다.
여기서는 또한 Math.ceil
을 이용해서 실수를 정수로 바꿔 줬다. 이 함수는 주어진 숫자보다 크거나 같은 수 중 가장 작은 수를 반환한다. 이것과 비슷한 함수는 Math.floor
이 있는데, 주어진 숫자보다 작거나 같은 수 중 가장 큰 수를 반환한다. 예를 들어, 이런 식이 될 수 있다.
console.log(math.ceil(5.6))//6
console.log(math.ceil(5.6))//5
둘다 정수로 만들어주는 값이지만 결과값이 살짝 달라진다. 하지만 내가 했던 것 처럼 정수로 굳이 안 만들고
function solution(s) {
return s.substr((s.length -1) /2 , s.length % 2 === 0 ? 2 : 1);
}
이런 식으로 써도 동일한 결과가 나온다.
function solution(s) {
const mid = Math.floor(s.length/2);
return s.length %2 === 1 ? s[mid] : s[mid-1]+s[mid];
}
이 풀이는 절반값을 구해준 후 정수로 만들어 준 것까지는 동일하지만, slice를 안 쓰고 문자열을 잘라 줬다. 홀수라면 s의 인덱스로 중간값을 줬고, 짝수라면 s의 인덱스 중간값 -1과 중간값을 더해 줬다. slice보다 간결한 방식인듯 하다.