💡 알고리즘 구현문제로 분류했다.
수열이 주어질 때, 이 수열의 있는 수 중 최솟값의 위치를 모두 출력하는 프로그램을 작성하시오.
입력은 자연수로 된 배열을 받고, 시작 위치는 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인 점과, 수는 자연수(양수)인 점을 파악하고 문제를 풀면 되겠다.
무난하게 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]));
}
문제를 푸는 도중에 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]));
}
알고리즘 공부를 예전부터 꾸준히 했지만, 문제를 다른 방식으로 여러번 풀면서 재미를 느껴본적은 없는데 성능을 너무 고려하지 않아도 내가 생각해낸 아이디어로 풀어보는 것도 좋은 경험치 축적이 되는 것 같다.