[Algorithm] 구현 : 수열 최솟값 위치

task11·2022년 2월 15일
0

알고리즘뽀개기

목록 보기
5/20
post-thumbnail

💡 알고리즘 구현문제로 분류했다.

문제 🛫


수열의 최솟값 위치

수열이 주어질 때, 이 수열의 있는 수 중 최솟값의 위치를 모두 출력하는 프로그램을 작성하시오.
입력은 자연수로 된 배열을 받고, 시작 위치는 0으로 계산하여 최솟값의 위치를 배열로 반환한다.
모든 수는 100이하의 자연수로 입력 받는다.

TestCase
Input
[5, 2, 10, 2][4, 5, 7, 4, 8]
[12, 11, 11, 16, 11, 12]
Output
#1 [1,3]
#2 [0,3]
#3 [1, 2, 4]

분석

무난한 최솟값 찾는 문제이다. for loop로 해결할 수 있고, 찾는 시작 위치(인덱스)가 0인 점과, 수는 자연수(양수)인 점을 파악하고 문제를 풀면 되겠다.

풀이 📖


Solution 1 (For Loop) 👍🏽

무난하게 for loop 를 두번 사용해서 풀이했다.

function answer(nums) {
  let result = [];

  // 최솟값 찾기
  let minNum = Number.MAX_SAFE_INTEGER;
  for (let i = 0; i < nums.length; i++) {
    if (min > nums[i]) {
      min = nums[i];
    }
  }
  
  // 최솟값에 해당하는 index 찾기
  let count = 0;
  for (let i = 0; i < nums.length; i++) {
    if (min === nums[i]) {
      result[count++] = i;
    }
  }

  return result;
}

let input = [
  [5, 2, 10, 2],

  [4, 5, 7, 4, 8],

  [12, 11, 11, 16, 11, 12]
];

for (let i = 0; i < input.length; i++) {
  process.stdout.write(`#${i + 1}`);
  console.log(answer(input[i]));
}

Solution 2 (Recursive) - 효율성 고려 X

문제를 푸는 도중에 for loop를 사용하지 않고 풀어보고싶은 욕심이 생겨 도전해봤다.
최솟값은 Math.min()을 통해서 찾고, 최솟값은 index는 Array.indexOf()를 통해 찾는 방법을 사용했다.

Array.indexOf(item, index) 메서드는 index를 앞부터 탐색해서 일치하는 가장 가까운 index 하나를 반환하는데, 이 때 다음 index를 어떻게 하면 찾을 수 있을지 고민해보았다.
내 생각에 Array.indexOf(item, index)의 중복된 다음 값의 index는 Array.indexOf(item, Array.indexOf(item, index) + 1)로 찾을 수 있을 것 같다는 생각을 했다.

그래서

Array.indexOf(item, index)
Array.indexOf(item, Array.indexOf(item, index) + 1)
Array.indexOf(item, Array.indexOf(item, Array.indexOf(item, index) + 1) + 1)......

이 반복되면 모든 해의 값을 찾을 수 있겠다.

Recursive한 코드를 작성할 수 있는 능력도 길러보는셈 치고 아래와 같이 풀이를 했다.

// 마음대로 풀어본 For-Loop 없는 풀이(성능 고려 X)

function answer(nums) {
  let result = [];
  let minNum = Math.min(...nums);

  function recursive(num, index) {
    if (nums.indexOf(num, index) === -1) {
      return;
    }
    result.push(nums.indexOf(num, index));
    return recursive(num, nums.indexOf(num, index) + 1); // recursive
  }

  recursive(minNum, 0);

  return result;
}

let input = [
  [5, 2, 10, 2],

  [4, 5, 7, 4, 8],

  [12, 11, 11, 16, 11, 12]
];

for (let i = 0; i < input.length; i++) {
  process.stdout.write(`#${i + 1}`);
  console.log(answer(input[i]));
}

Review 💡

알고리즘 공부를 예전부터 꾸준히 했지만, 문제를 다른 방식으로 여러번 풀면서 재미를 느껴본적은 없는데 성능을 너무 고려하지 않아도 내가 생각해낸 아이디어로 풀어보는 것도 좋은 경험치 축적이 되는 것 같다.

0개의 댓글