프로그래머스 lv2 최댓값 최소값

김민준·2024년 6월 1일

코드테스트

목록 보기
29/37

문제

프로그래머스 lv2 최댓값 최소값

주어진 문자열을 공백을 기준으로 하여 숫자로 분리하고, 그것에서 최소값과 최대값을 뽑아내는 문제이다.

나의 풀이

function solution0(s) {
  let answer;
  let number = s.split(" ").map(Number);
  let min = number[0];
  let max = number[0];

  for (i = 1; i < number.length; i++) {
    const now = number[i];
    if (min > now) {
      min = now;
    }

    if (max < now) {
      max = now;
    }
  }

  answer = `${min} ${max}`;

  return answer;
}

시간복잡도 : O(n)

문자열인 녀석들을 공백기준으로 숫자로 만든 뒤 for문에서 크기를 비교한다
원래는 s = s.split(" ").map(Number);를 사용하고 싶었으나 반복해서 s를 사용해야해서 조금 다르게 구현했다

다른 사람의 풀이

function solution1(s) {
  const arr = s.split(" ");

  return Math.min(...arr) + " " + Math.max(...arr);
}

Math.min을 사용하기 때문에 map(number)가 없다.
선정 사유 : 가장 코드가 짧아서

function solution2(s) {
  var arr = s.split(" ");
  arr.sort((a, b) => a - b);

  var answer = arr[0] + " " + arr[arr.length - 1];

  return answer;
}

시간복잡도 : O(n)

sort를 사용한뒤 가장 처음과 마지막의 원소를 리턴한다
선정 사유 : sort를 사용하였기 때문에 매우 느릴것이라고 판단함

새로 고친 내 코드

function solution00(s) {
  let number = s.split(" ").map(Number);
  let min = number[0];
  let max = number[0];

  for (i = 1; i < number.length; i++) {
    const now = number[i];
    if (min > now) {
      min = now;
    }

    if (max < now) {
      max = now;
    }
  }

  return `${min} ${max}`;
}

시간복잡도 : O(nlogn)O(n log{n})

변수를 따로 만들지 않고 바로 return에 넣는게 더 빨라보여서 이렇게 바꾸었다.

속도 비교

예상외의 결과?

띠용? 실제로 해보니 후자의 방법이 의미가 없는 수준이긴 하지만 더 느렸다??
전부다 확인을 해봐야겠다

0으로 끝나는 것은 answer 라는 변수를 만든뒤 그것을 return에 넣은것, 1로 끝나는 것은 쌩으로 return에 넣은 것이다

제대로 비교해보자

return에 뭘 넣는가?

딱한번 예외가 있긴했는데 변수를 만들어서 넣는것보다 그냥 return하는게 더 느리다?
입력값의 크기는 현재 -100에서 100 사이의 숫자 100개이다. 이제 범위를 -300~300의 숫자 300개로 증가시켜보자

입력의 범위와 길이 모두 증가

3 log_{2}^{3} ≒ 4.76 이기때문에 3배가 넘는 증가량은 말이 된다.

입력 범위는 그대로두고 길이를 감소

혹시나 길이는 같지만 범위가 줄어들면 차이가 있을까 싶어서 범위를 -300~300그대로 두고 길이를 300이 아니라 100으로 바꾸었다

최종 비교

범위에는 영향을 받지 않고 길이에만 영향을 받는다.

결론

  1. return에 값을 직접 넣는것보다 변수에 값을 넣는것이 조금이나마 더 빠르다.
    속도의 차이는 의미 없는 수준이며 속도가 아니라 코드 가독성을 위해서라도 변수에 넣는게 좋을 것 같다

  2. 시간복잡도에서 입력값의 범위는 영향을 주지 않는다.
    물론 알고리즘의 종류에 따라서 다를 수 있겠지만, 이번 알고리즘은 공백을 기준으로 나누는것 외에는 별달느 처리가 없기 때문에 입력값의 범위는 문제가 되지 않았던것같다.

profile
node 개발자

0개의 댓글