문자열 배열 intStrs와 정수 k, s, l가 주어집니다. intStrs의 원소는 숫자로 이루어져 있습니다.
배열 intStrs의 각 원소마다 s번 인덱스에서 시작하는 길이 l짜리 부분 문자열을 잘라내 정수로 변환합니다. 이때 변환한 정수값이 k보다 큰 값들을 담은 배열을 return 하는 solution 함수를 완성해 주세요.
0 ≤ s < 100
1 ≤ l ≤ 8
10l - 1 ≤ k < 10l
1 ≤ intStrs의 길이 ≤ 10,000
s + l ≤ intStrs의 원소의 길이 ≤ 120
intStrs | k | s | l | result |
---|---|---|---|---|
["0123456789","9876543210","9999999999999"] | 50000 | 5 | 5 | [56789, 99999] |
입출력 예 #1
idx에 따라 잘라낸 문자열과 그에 따른 ret의 변화를 표시하면 다음 표와 같습니다.
idx | 잘라낸 문자열 | ret |
---|---|---|
0 | "56789" | [56789] |
1 | "43210" | [56789] |
2 | "99999" | [56789, 99999] |
따라서 [56789, 99999]를 return 합니다.
function solution(intStrs, k, s, l) {
let answer = [];
intStrs.forEach((item, idx) => (
answer.push(Number(item.slice(s).slice(0, l)))
))
return answer.filter(el => el > k)
}
가각의 숫자 문자열에서
s index 부터 l index 까지 자른 후 숫자로 변환한 배열을 만들어 준다.
이후 filter를 통해 요소가 k보다 큰 배열만 반환하도록 해준다.
이번 문제는 이전 문제 보다 다소 쉬웠다.
slice(s).slice(0, l)
slice가 반복되는 점이 아쉬워
function solution(intStrs, k, s, l) {
let answer = [];
intStrs.forEach((item, idx) => (
answer.push(Number(item.slice(s, s + l)))
))
return answer.filter(el => el > k)
}
slice(s, s + l)
이렇게 수정할 수 있을 거 같다.
s = 5
,l = 5
라는 값을 대입해 봤을 때
"0123456789"slice(5, 10)
되고 콘솔창에 확인했을 때
"56789"
값을 반환한다.알 것 같으면서 애매해서 GPT한테 물어봤다.
slice(5, 10)에서 첫 번째 매개변수는 시작 인덱스이며, 두 번째 매개변수는 끝 인덱스입니다. 여기서는 5번째 인덱스부터 시작하여 (0부터 시작하므로 '5'), 끝 인덱스는 10번째 인덱스까지이지만 (포함되지 않으므로 '9'까지), 해당 범위의 문자열을 반환합니다.
function solution(intStrs, k, s, l) {
return intStrs.map((v) => +v.slice(s, s + l)).filter((v) => v > k);
}
한줄로 표현할 수 있다는게 좋다.
또한 +
기호를 앞에 붙여 문자열을 숫자로 변환 시켰다.
이점은 JavaScript의 특징을 잘 활용하신 것 같다.
function solution(intStrs, k, s, l) {
return intStrs.reduce((bucket, intStr) => {
const v = Number(intStr.slice(s, s + l))
if (v > k) bucket.push(v)
return bucket
}, [])
}
reduce를 활용해 작성하셨다.
나도 reduce를 자주 활용할 수 있도록 노력해 봐야겠다.