[프로그래머스-기초] 배열 만들기 5

JE·2024년 1월 18일
0

코테/코플릿

목록 보기
50/57

#배열 만들기 5

문제 설명

문자열 배열 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

입출력 예

intStrskslresult
["0123456789","9876543210","9999999999999"]5000055[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를 자주 활용할 수 있도록 노력해 봐야겠다.

profile
[프론트 애송이] 작은 깨달음도 기록하기

0개의 댓글