문제 설명
길이가 같은 문자열 배열 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라는 이름으로 값이 모두 채워진 배열이 주어졌지만, 만약 저렇게 값이 주어지지 않아도 상황에 따라 저런 데이터를 직접 만들어서 가져다쓸수있게하는 생각도 해봐야겠다.
그래서 그 만든 데이터를 매개변수로 넣어서 특정한 동작을 하는 함수를 만드는 연습을 많이하면 동일한 행위를 반복해야하는 특정상황에서 만들어진 함수만 가져다쓰면 되기때문에 저렇게 배열이나 객체를 만들어서 데이터구조화하는 것도 연습해야겠다고 생각했다.
'JavaScript > 알고리즘' 카테고리의 다른 글
프로그래머스 세로읽기 JS ( 가로 m글자씩, 세로 c번째 적힌값찾기 ) (0) | 2023.06.21 |
---|---|
프로그래머스 문자열 잘라서 정렬하기 JS (split()의 구분자가 문자열 끝에 위치한다면? / match()의 특징 ) (0) | 2023.06.20 |
프로그래머스 문자열 섞기 JS ( 복합할당 연산자 += ) (1) | 2023.06.19 |
프로그래머스 l로 만들기 JS (replaceAll() / for of문 ) (0) | 2023.06.17 |
프로그래머스 간단한 식 계산하기 JS ("연산자"처리하기, if문/switch문/객체 이용하기, eval()은 ❌) (1) | 2023.06.16 |