JavaScript/알고리즘

프로그래머스 부분 문자열 이어 붙여 문자열 만들기 JS ( 배열의 index로 2개의 배열매칭, 중첩배열에서 값추출 )

hihiha2 2023. 6. 20. 20:06
반응형

문제 설명 

길이가 같은 문자열 배열 my_strings와 이차원 정수 배열 parts가 매개변수로 주어집니다. parts[i]는 [s, e] 형태로, my_string[i]의 인덱스 s부터 인덱스 e까지의 부분 문자열을 의미합니다. 각 my_strings의 원소의 parts에 해당하는 부분 문자열을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

 

 

🙋‍♀️ 내 생각

이 문제는 배열을 이용해서 부분문자열을 만들어서 이어붙이는 문제이다.

각각 다른 값이 들어있는 배열을 매개변수로 이용하고(my_strings/parts), 인덱스i를 통해서 원하는 범위를 지정하여 얼마큼 반복할지를 정한다.

 

my_string문자열값을,

parts는 s,e를 숫자로 담고 있고 

이 2개가 만나서 하나의 결과값을 내는 것이 이 문제의 핵심이다.

 

문제를 이해하여 풀어서 정리하면,

my_string이라는 배열의 원소를 하나씩 추출해서, 그 문자열을 parts에 들어있는 숫자만큼 잘라준다.

이때 parts라는 배열안에는 [s,e]가 들어있는데 start와 end라는 의미로 문자열을 어디부터 어디까지 잘라낼 것인가를 지정한다.

my_string[i]과 parts[i]는 각각 역할을 하는 다른 배열에 들어있는 값이지만 ,인덱스i를 통해서 매칭해서 사용할 수 있다.

이렇게해서 my_string에서 parts만큼 자른 문자열을 이어붙인 결과를 리턴한다.

 

예제를 통해 보면, 

i=0이면 my_string[0]은 "progressive"이다.

parts[0]은 [0,4]이므로 "progressive"를 0번째부터 4번째까지 잘라준다.

앞에서부터 5개이므로 progr이 결과값이 된다.

 

i를 돌면서 반복하고 그 결과값들을 합친다.

 

 

✅ 내 코드

function solution(my_strings, parts) {
    let result =''
   
    for(i=0; i<parts.length; i++){
    result += my_strings[i].slice(parts[i][0],parts[i][1]+1)
    }
    return result
}

우선,결과값을 담은 빈문자열 result를 만들었다.

 

그리고

i의 범위를 지정하면서 반복된 행동을 하게 하기 위해서 for문을 사용했다.

 

for문안에서는 for문을 돌면서 수행하고 싶은 행동을 적는다.

my_string에서 i번째 값만을 추출해야하기 때문에 my_string[i]라고 적는다.

(my_string[0]="progressive", my_string[1]="hamberger"...)

 

그런다음, my_string에서 추출해낸 문자열을 start와 end를 지정해서 잘라야하기때문에 slice메서드를 사용한다.

slice()는 애초에 정의자체가 배열의 begin부터 end(end미포함)까지 잘라서 새로운 배열을 반환하는 것이기 때문에 문제를 보자마자 생각했다.

 

parts에서도도 my_string과 동일한 인덱스에 위치한 값을 추출해야하기때문에 parts[i]라고 적는다.

예를 들면 parts[0]=[0,4]이다

 

그런데 필요한 값은 저 배열이 아니라 배열안의 값이기때문에 배열을 한번 더 들어가야한다.

그래서 parts[i][0], parts[i][1]과 같이 적는다. parts라는 배열의 i번째 인덱스에 있는 값의 0번째와 1번째 값이라는 의미이다.

 

for문안에서 하고 싶은 행동을 정리하면 아래와 같다.

1️⃣ my_string[i]번째인 값을 자를것이다

2️⃣ 어디부터 어디까지자를거냐면 parts[i]의 0번째 인덱스에서 시작해서 parts[i]의 1번째인덱스까지.

3️⃣ 그리고 그 값들을 합쳐라

 

이것을 코드로 나타내면 아래와 같다.

result += my_strings[i].slice(parts[i][0],parts[i][1]+1)

여기서 주의할 점은 slice()end를 미포함하는 특성을 가지고 있기때문에 parts[i],[1]에 1을 더해야한다는 것이다.

 

+=복합할당연산자를 통해서 이렇게 얻은 부분문자열들을 더해준다.(그래야 하나의 완성된 값이 나오므로)

만약 그냥 = 을 통해서 할당하면 값들이 쌓인 결과가 아닌 가장 마지막값만의 리턴된다.

 

 

똑같은 코드인데 result의 초기값을 빈배열[]로 할당한 코드로도 바꿔보았다.

function solution(my_strings, parts) {
    let result =[]
   
    for(i=0; i<parts.length; i++){
    result.push(my_strings[i].slice(parts[i][0],parts[i][1]+1))
    }
    return result.join('')
}

나머지는 다 거의 동일하고 문자열은 +=복합할당연산자를 통해서 값을 축적시켰던것과 다르게

배열의 축적 push()을 통해서 한다는 것이다.

결괏값은 다 합쳐진 문자열이어야하기때문에 join('')을 통해서 이어붙이면서 문자열로 바꿔준다.

 

 

 

🙋‍♀️ 내 생각

이 문제를 통해, 배열이나 객체를 데이터로 구조화시키고 그것을 가져다가 함수안에서 특정한 동작을 수행하도록 만드는 과정을 이해하였다.

 

문제자체가 복잡하거나 한것은 아니지만 이 문제를 깊이있게 이해하고 싶었다.

실무를 할때도 위와 유사하게 값을 받아와서 어떤 기능을 수행하는 함수를 만드는 작업을 할 일이 많지 않을까하는 생각이 들었기 때문이다.

 

i를 통해서 각각 다른 데이터가 담긴 배열을 매칭시켜서 하나의 결과값을 내는 코드를 짜는 연습을 많이 하면 좋을 것같다. (i를 통해서 범위도 지정)

 

 

또 위와같이 이 문제에서는 my_string과 parts라는 이름으로 값이 모두 채워진 배열이 주어졌지만, 만약 저렇게 값이 주어지지 않아도 상황에 따라 저런 데이터를 직접 만들어서 가져다쓸수있게하는 생각도 해봐야겠다. 

그래서 그 만든 데이터를 매개변수로 넣어서 특정한 동작을 하는 함수를 만드는 연습을 많이하면 동일한 행위를 반복해야하는 특정상황에서 만들어진 함수만 가져다쓰면 되기때문에 저렇게 배열이나 객체를 만들어서 데이터구조화하는 것도 연습해야겠다고 생각했다.

 

 

 

반응형