문제 1
두 자연수 a와 b가 주어질 때, 이 둘의 최대공약수를 구하는 함수를 작성하세요.
제한사항:
나의 풀이
function solution(a, b) {
let arr = [];
for (let i = 1; i <= a && i <= b; i++) {
if (a % i === 0 && b % i === 0) {
arr.push(i);
}
}
return Math.max(...arr);
}
console.log(solution(120, 40));
일단 배열을 생성한 후 i를 1씩증가시켜 a와 b를 나눠서 0이되는 숫자들을 배열에 집어 넣었다.
그 후 가장 큰수를 반환하는 형식을 생각했다.
배열은 Math.max를 바로쓰면 Nan이 반환된다. Math 함수는 배열을 인수로 받지 않기때문
그렇기 때문에 스프레드연산자인 ...를 사용해서 개별적 인수로 펼쳐야함
개선된 풀이
굳이 배열을 사용할 필요 없이 반복문에서 가장 큰 공약수를 찾으면 된다.
function solution(a, b) {
let gcd = 1; // 최대공약수로 사용할 변수를 지정
for (let i = 1; i <= Math.min(a, b); i++) {
//반복문의 범위를 더 작은숫자까지로 제한해 불필요한 반복 줄이기
if (a % i === 0 && b % i === 0) {
gcd = i;
}
}
return gcd;
}
console.log(solution(120, 40));
function solution(a, b) {
while (b !== 0) {
let temp = b;
b = a % b;
a = temp;
}
return a;
}
console.log(solution(48, 18)); // 6이 출력됨
b가 0이 아닐때 계속 돌게 하는 while문을 만들어 b가 0이 됐을때 a를 return 시킨다.
문제 2
주어진 배열에서 짝수와 홀수의 개수를 각각 세는 함수를 작성하세요. 함수는 [짝수 개수, 홀수 개수] 의 배열을 반환해야 합니다.
제한사항:
나의 풀이
function solution(arr) {
let even = 0;
let odd = 0;
for (let i = 0; i < arr.length; i++) {
if (arr[i] % 2 === 0) {
even++;
} else {
odd++;
}
}
return [even, odd];
}
const test = [1, 2, 3, 4, 5, 6, 7];
console.log(solution(test)); // [3, 4]가 출력됨
먼저 짝수와 홀수의 변수를 지정한 후 입력받은 배열을 순회하며 짝,홀수를 세고 반영하는 함수이다.
개선된 풀이
조금 더 세련되고 Js의 최신문법을 적용한 코드라고 생각하면 좋겠다.
function solution(arr) {
let even = 0;
let odd = 0;
for (let num of arr) {
if (num % 2 === 0) {
even++;
} else {
odd++;
}
}
return [even, odd];
}
const test = [1, 2, 3, 4, 5, 6, 7];
console.log(solution(test)); // [3, 4]가 출력됨
function solution(arr) {
return arr.reduce(
([even, odd], num) => {
if (num % 2 === 0) even++;
else odd++;
return [even, odd];
},
[0, 0] //초기값
);
}
const test = [1, 2, 3, 4, 5, 6, 7];
console.log(solution(test));
문제3
문자열이 주어지면 해당 문자열을 역순으로 배치한 후,
알파벳을 하나씩 오른쪽으로 이동시킨 결과를 출력하세요. 예를 들어, a는 b, z는 a로 변환됩니다.
제한사항:
나의 풀이
function shiftstr(str) {
return str === "z" ? "a" : String.fromCharCode(str.charCodeAt(0) + 1);
// String.fromCharCode() ASCII값을 문자로 변환
// charCodeAt(0)을 이용해 0번째 문자의 ASCII코드를 알아내고 거기에 1을 더해 출력
// z는 a로 나오게 예외처리, 안하면 ASCII 문법상 {로 출력됨
}
function solution(str) {
str = str.split("").reverse().map(shiftstr).join("");
// 1. 문자열을 나눈후 배열로 만든다.
// 2. 뒤집는다
// 3. shiftstr 함수를 이용해 문자를 변환한다
// 4. 하나의 문자로 만든다.
return str;
}
console.log(solution("helloz"));
ASCII 코드를 이용하는걸 생각을 못해서 해맸다.
String.fromCharCode() ASCII 값을 문자로 변환
charCodeAt() 문자의 ASCII 코드를 알아냄 기억하자
문제4
회전 초밥을 먹을 때, 접시들의 번호가 주어집니다. 이 중에서 임의의 연속된 접시를 선택하여 먹을 때,
가능한 모든 선택에서 가장 다양한 초밥 종류의 개수를 구하세요.
제한사항:
나의 풀이
function solution(arr) {
uniqueArr = new Set(arr); // new Set()을 통해 중복된 값 제거
return uniqueArr.size;
}
console.log(solution([1, 2, 1, 3, 2, 1, 4, 1]));
Set의 특징을 이용해 중복값을 제거했다.
.size 객체의 길이 .length 배열의 길이 기억하자
문제5
양의 정수가 주어질 때, 숫자에서 k개의 자릿수를 제거하여 얻을 수 있는 가장 큰 수를 구하세요.
제한사항:
number는 최대 1,000,000자리까지 입력될 수 있습니다.k는 1 이상 len(number) - 1 이하입니다.나의 풀이
function solution(num, k) {
let mostNum = 0;
let arr = [];
strNum = num.toString(); // 문자열로 변경
if (k >= 1 && k <= strNum.length) {
arrNum = strNum.split("").map(Number); // 나눈 후 숫자로바꿔서 배열로 만듬
arrNum.sort((a, b) => b - a); // 내림차순 정렬
for (let i = 0; i < k; i++) {
// 배열에 k자리 숫자를 집어넣음
arr.push(arrNum[i]);
}
mostNum = arr.join(""); // 숫자로 변환
}
return mostNum;
}
console.log(solution(89166341, 4));
.sort() 정렬 메소드
숫자일때는 오름차순인지 내림차순인지 정해줘야 한다
.sort((a,b)=>a-b) : 오름차순
.sort((a,b)=>b-a) : 내림차순