[코테] 문자열에서 가장 큰 숫자 찾기

Dongmin Lee·2022년 12월 19일
0

코테

목록 보기
1/23
post-thumbnail

🚪 문제

const numbers = "10 11 5 6 12 7 3 9";

공백으로 구분된 8개의 숫자들 중 최댓값을 반환하는 코드를 작성해 주세요.

🔍 어떻게 접근했나?

  • 공백을 구분자로 해서 indexOf로 자른다.
  • 잘린 문자열을 parseInt로 숫자화한다.
  • 숫자를 배열에 넣는다.
  • while문으로 이 과정을 반복한다.
  • while문의 조건으로 flag를 걸어놓고 indexOf의 리턴값이 -1 이면 flag 값을 변경해 while문을 벗어나도록 한다.
  • Math.max 메소드를 이용해 배열 요소의 최대값을 구한다.

🌿 풀이 코드

function extractNum(str) {
    if(str[str.length-1] !== " "){
        str += " ";
    }
    let curPos = 0;
    const numArr = [];
    let flag = 0;
    while(flag === 0) {
        let numStr = "";
        if(str.indexOf(" ",curPos+1) !== -1) {
            let nextPos = str.indexOf(" ",curPos+1);
            for(let i = curPos; i < nextPos; i++){
                numStr += str[i];
            }
            numArr.push(parseInt(numStr));
            curPos = nextPos;
        }
        else {
            flag = 1;
        }
    }
    return Math.max(...numArr); 
}
console.log(extractNum(numbers));

😵‍💫 장애물

공백을 구분자로 indexOf를 사용할 시 엄청난 문제점이 있었다. 당연하게 마지막 공백 이후 indexOf의 리턴값이 -1이었는데,

문자열을 파싱하는 for문의 조건식의 범위를 현재 공백의 인덱스부터 다음 공백의 인덱스로 지정했다보니 현재 공백이 마지막 공백일 경우 마지막 문자열이 파싱이 안되는 문제가 생겼다.

콘솔로그만 찍으면서 겁나 고민하다가,,

어? 그냥 문자열 받을 때 뒤에 공백 붙이면 되는 거 아님?

이라는 생각이 들었고,

if(str[str.length-1] !== " "){
   	str += " ";
}

이 코드를 추가하게 되었다.

🤓 모범 답안

1번. Math.max.apply() 메소드 활용

const numbers = "10 11 5 6 12 7 3 9"
const arr = numbers.split(' ').map(num => parseInt(num))

console.log(Math.max.apply(null, arr))

2번. Math.max() 및 Spread Operator 활용

const numbers = "10 11 5 6 12 7 3 9"
const arr = numbers.split(' ').map(num => parseInt(num))

console.log(Math.max(...arr))

3번. sort 함수를 활용하여 정렬 후 값 구하기

const numbers = "10 11 5 6 12 7 3 9"
const arr = numbers.split(' ').map(num => parseInt(num))

const maxValue = arr.sort((a, b) => {
    return b - a
})[0]

console.log(maxValue)

🚢 배운 점

메소드를 잘 활용하면 훨씬 쉽게 접근할 수 있다.

split() / map() / 화살표 함수 / sort() 공부할 것!

profile
어제보다 성장하기

0개의 댓글