Q. 주어진 리스트 안에 있는 단어 중 가장 긴 단어를 찾을 수 있는 함수 만들기
//주어진 단어 예
console.log(find_longest_word(["PHP", "Exercises", "Backend"]))
A. 처음 접근 법
1. 먼저 각 배열값을 다 돌아 글자수를 카운터한다.
- 각 배열을 다 돈다 (for 문)
- string값 1자씩 나눠 array의 길이를 구한다. (split, length)
2. 그 길이를 비교해 최대값을 찾는다. (Math.max)
3. 해당 인덱스값에 담긴 단어를 반환한다.
function find_longest_word(arr) {
let wordLength = []
for (let i=0; i<arr.length;i++){
wordLength.push(arr[i].split("").length)
}
return wordLength
}
// [3, 9, 7]
- 새로운 배열 wordLength를 생성해 단어의 길이 값만을 담기로 했다.
- for문을 사용해 배열이 각 요소를 돌아가며
- split메서드를 사용해 string을 array로 만들었다. 그리고 그 length를 구한 뒤
- push를 사용해 wordLength배열에 담았다.
이까지해서
(예시) wordLength = [3, 9, 7]이 되었다.
그러나 다음 부분에서 어려웠다.😰
- 각 값을 비교하는 로직
- 최대 값에 해당하는 index를 다시 arr에서 찾는 것
A. 동기분의 풀이 법을 참고해서 계속 이어가본 로직
function find_longest_word(arr) {
let wordLength = []
for (let i=0; i<arr.length;i++){
wordLength.push(arr[i].split("").length)
}
let maxLength = Math.max(...wordLength) // 9
let longestWord = wordLength.indexOf(maxLength) //1
return arr[longestWord]
}
//'Exercises'
- Math.max()메서드를 활용해서 바로 최대값 구해버리기.
- 처음 Math.max(myTxt)를 작성했을 때 계속 NaN이 떠서 제쳐뒀었는데,
- "배열"에서 Math.max를 사용하려면 배열명 앞에 "..."을 꼭 붙여야한다고 한다. (MDN명세)
- 그래서 9라는 최대값을 구할 수 있었다.
- 다시 myTxt배열에서 9값을 가진 요소의 index인 1을 찾는다. (indexOf()메서드 사용)
- parametar로 받았던 arr배열에서 구해둔 index값을 사용해 요소값을 반환시킨다.
동기분들의 피드백과 Tip으로 다시 풀어본 방법들)
B. map메서드을 사용해 본 방법
function find_longest_word(arr) {
let wordLength = arr.map(x=>x.length)
let maxLength = Math.max(...wordLength)
let longestWord = wordLength.indexOf(maxLength)
return arr[longestWord]
}
//'Exercises'
- 내가 작성했던 for문 대신 map메서드를 사용해 보다 간단한 방식으로 length 값을 구할 수 있었다.
Array.map() : 주어진 함수로 배열의 모든 요소를 실행시켜 새로운 배열을 반환하는 메서드 (전에 정리해 둔 것)
C. if문을 사용해 본 방법
function find_longest_word(arr) {
let longestWord = '';
for (let i=0; i<arr.length;i++){
if(arr[i].length > longestWord.length){
longestWord = arr[i]
}
}
return longestWord
}
//'Exercises'
find_longest_word(["PHP", "Exercises", "Backend"])
- 처음 접근 한 방식에에서 split이 아닌 if문과 string의 length를 사용한 방법.
- 현재의 longestWord.length과 1씩 증가한 index의 요소값 차례로 비교
- 조건에 만족한 값만 longestWord에 남기고
- 제일 마지막에 남은 longestWord값은 반환
이 함수의 경우 이전의 로직보다 많은 변수를 생성하지 않으므로, 메모리 낭비를 막을 수 있다고한다.
for문 실행
▼
arr[0].length = 3 > wordLength에 값이 없음 = 0
( if조건 맞음 )
▼
if 문 실행 : wordLength에 arr[0]값 "PHP" 담김
▼
for문 실행
▼
arr[1]의 "Exercises" length = 9 > wordLength.length = 3
( if조건 맞음 )
▼
if 문 실행 : wordLength에 arr[1]값 "Exercises" 담김
▼
for문 실행
▼
arr[2]의 "Backend" length = 7 > wordLength.length = 9
( if조건 안 맞음 )
▼
for문 나감, 최종 wordLength값 "Exercises" 반환
ES6방식으로 for문 수정해보기
function find_longest_word(arr) {
let wordLength = '';
for (let i in arr){
if(arr[i].length > wordLength.length){
wordLength = arr[i]
}
}
return wordLength
}
반응형
'D.evelop [CS] > Algorithm' 카테고리의 다른 글
[Algorithm 006] JS - reverse (0) | 2021.09.14 |
---|---|
[Algorithm 005] JS - twoSum (0) | 2021.09.14 |
[Algorithm 004] JS - 주어진 문자열에서 문자의 인덱스 찾기 (0) | 2021.09.11 |
[Algorithm 002] JS - 최소값, 최대값 구하기 Math.random() (0) | 2021.09.09 |
[Algorithm 001] JS - 사칙연산 (0) | 2021.09.07 |
댓글