[선형] 3. 배열 문제(1)
1. 수열 최소값 위치
수열이 주어질 때, 이 수열이 있는 수 중 최소값의 위치를 모두 출력하는 프로그램을 작성하시오.
입력은 자연수로 된 배열을 받고, 시작 위치는 1로 계산하여 최소값의 위치를 배열로 반환한다.
모든 수는 100 이하의 자연수로 입력받는다.
function answer(nums) {
let result = [];
// 구현
let min = nums[0];
for (let item of nums) {
min = item < min ? item : min;
}
nums.forEach((item, index) => {
if (item == min) result.push(index);
});
// 구현 종료
return result;
}
let input = [
// TC : 1
[5, 2, 10, 2],
// TC : 2
[4, 5, 7, 4, 8],
// TC :3
[12, 11, 11, 16, 11, 12],
];
for (let i = 0; i < input.length; i++) {
console.log(`#${i + 1} ${answer(input[i])}`);
}
// output
//인덱스로 배열을 컨트롤 할때는 새 배열의 인덱스로 담을 변수를 만드는 것이 좋다.
let cnt = 0;
nums.forEach((item, index) => {
if (item == min) {
result[cnt] = index;
cnt++
}
});
2. 체스 세트
오래된 창고에서 체스판과 체스 기물을 발견했다.
불행히도 기물 별 개수가 부족하거나 많아, 완전한 한 세트를 이루고 있지 못하고 있다.
게임을 하기 위해 부족하거나 많은 기물의 개수를 계산하여 반환하는 프로그램을 제작하시오.
기물의 개수는 배열 형태로 아래와 같이 King 부터 pawns 순으로 들어오며,
한 게임을 하기 위해 필요한 기물의 개수는 아래와 같다.
king(1), queen(1), rooks(2), bishops(2), knights(2), pawns(8)
function answer(chess) {
let result = [];
// 구현
let origin = [1, 1, 2, 2, 2, 8];
let cnt = 0;
for (let i = 0; i < origin.length; i++) {
result[cnt] = origin[i] - chess[i];
cnt++;
}
// 구현 종료
return result;
}
let input = [
// TC : 1
[0, 1, 2, 2, 2, 7],
// TC : 2
[2, 1, 2, 1, 2, 1],
// TC :3
[0, 1, 1, 5, 3, 6],
];
for (let i = 0; i < input.length; i++) {
process.stdout.write(`#${i + 1}`);
console.log(answer(input[i]));
}
result[cnt++] = origin[i] - chess[i]; 로 줄일 수 있다!
3. 두 수 최대 합
수열이 주어질 때, 이 중 두 개의 수를 선택하여 최대 합이 나올 수 있도록 프로그램을 제작하시오.
입력은 정수로 된 배열을 받고, 최대 합이 나올 수 있는 두 수를 배열 형태로 반환한다.
배열로 입력되는 정수를 10~20개 사이이며, 정수의 범위는 -20 ~ +20 사이의 값이 입력된다
function answer(nums) {
let result = [];
// 구현
nums.sort((x,y)=>y-x)
result.push(nums[0])
result.push(nums[1])
// 구현 종료
return result;
}
let input = [
// TC : 1
[-11,5,8,18,-2,-3,6,4,17,10,9],
// TC : 2
[3,7,-14,2,-6,13,-20,-2,-7,6,-17,-5,14,-9,19],
// TC :3
[-15,-4,-8,12,-8,-8,9,10,15,-2,10,-14,2,14,19,-9,3,-18,14],
];
for (let i = 0; i < input.length; i++) {
process.stdout.write(`#${i + 1}`);
console.log(answer(input[i]));
}
// output
// #1[ 18, 17 ]
// #2[ 19, 14 ]
// #3[ 19, 15 ]
function answer(nums) {
let result = [];
// 구현
result = nums[0] > nums[1] ? [nums[0], nums[1]] : [nums[1], nums[0]];
// console.log(result); // #1[ 5, -11 ] #2[ 7, 3 ] #3[ -4, -15 ]
for (let i = 0; i < nums.length; i++) {
if (nums[i] > nums[0]) {
result[1] = result[0];
result[0] = nums[i];
} else if (nums[i] > nums[1]) {
result[1] = nums[i];
}
}
// 구현 종료
return result;
}
4. 일곱 난장이
일터에 나갔던 난장이 9명이 와서는 모두 자기가 일곱 난장이 중 하나라고 우기고 있다.
모든 난장이의 가슴에는 숫자가 표시된 배지가 있는데, 다행이도 일곱 난장이의 배지에 표시된 숫자의 합이 100이라는 단서로 일곱 난장이를 분별할 수 있다.
일곱 난장이를 분별하는 프로그램을 작성하시오.
배지 값은 100이하 자연수로 들어오며, 일곱 난장이의 배지 값을 기존 순서대로 배열에 넣어 반환한다.
function answer(dwarf) {
let result = [];
// 구현
result = [...dwarf];
let sum = 0;
for (let i of dwarf) {
sum += i;
}
sum -= 100;
console.log(sum);
for (let j = 0; j < dwarf.length; j++) {
for (let k = j + 1; k < dwarf.length; k++) {
if (dwarf[j] + dwarf[k] == sum) {
result.splice(j, 1).splice(k-1, 1);
}
}
}
// 구현 종료
return result;
}
let input = [
// TC : 1
[1, 5, 6, 7, 10, 12, 19, 29, 33],
// TC : 2
[25, 23, 11, 2, 18, 3, 28, 6, 37],
// TC :3
[3, 37, 5, 36, 6, 22, 19, 2, 28],
];
for (let i = 0; i < input.length; i++) {
process.stdout.write(`#${i + 1} `);
console.log(answer(input[i]));
}
// output
5. 나무 그리기
조카가 나무 그리기를 어려워 하고 있다. 어린 조카를 위해 나무를 그려주는 프로그램을 만들어주자.
자연수를 높이로 입력 받고 대칭형 형태로 나무 문자열을 만들어 반환한다.
각 행 별로 개행 문자를 넣어주면 *을 찍으며 출력 값 형태로 나무를 그려준다.
function answer(height) {
let str = "\n";
for (let i = 1; i <= height; i++) {
for (let j = 1; j <=height-i; j++) {
str += " ";
}
for (let k = 1; k <= 2 * i - 1; k++) {
str += "*";
}
str += "\n";
}
// 구현
// 구현 종료
return str;
}
let input = [
// TC : 1
3,
// TC : 2
5,
// TC :3
7,
];
for (let i = 0; i < input.length; i++) {
process.stdout.write(`#${i + 1} `);
console.log(answer(input[i]));
}
// output