반응형
// 21. 이상한 문자 만들기
// 문자열 s는 한 개 이상의 단어로 구성되어 있습니다.
// 각 단어는 하나 이상의 공백문자로 구분되어 있습니다.
// 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
const solution = (s) => {
// 문장을 단어별로 짜르기
const words = s.split(" ");
// 새로운 배열 만들기 위해 map을 써서 조건이 부합하면 들어가게 해줌
const newWord = words.map((n) => {
// 배열 요소 저장
let save = "";
for (let i = 0; i < n.length; i++) {
if (i % 2 === 0) save += n[i].toUpperCase();
// 짝수면 대문자
if (i % 2 !== 0) save += n[i].toLowerCase();
// 홀수면 소문자
}
return save;
// 대문자 소문자 변환해서 save에 다시 저장
});
const answer = newWord.join(" ");
// 문자열로 합체
return answer;
};
// 문제에 접근하는게 헷갈렸음
// 22. 자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
// 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
function solution(n) {
var answer = 0;
// 각 자릿수를 각각한자리씩보기 위해 문자로 변환시킨다
let s = n.toString();
for (let i = 0; i < s.length; i++) {
answer += parseInt(s[i]);
}
return answer;
}
// 23. 자연수 뒤집어 배열로 만들기
// 자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
function solution(n) {
var answer = [];
// toSring으로 형변환 안하고 n = n + "" 해도 문자열로 변환됨
var arr = n.toString().split("");
// 인덱스는 0 부터니까 -1 길이만큼부터 거꾸로 넣어준다.
// 역순으로 돌려주는거라 헷갈렸음 --- 배열 반대로 출력하기 (혼공스에 나와 있음)
for (let i = arr.length - 1; i >= 0; i--) {
answer.push(Number(arr[i]));
}
return answer;
}
// 24.정수 내림차순으로 배치하기
// 함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
function solution(n) {
// 바로 형변환하기
let answer = n + "";
// 각 숫자별로 짜르기
let newAnswer = answer.split("");
// 내림차순 정리후 합치기
return Number(newAnswer.sort((a, b) => b - a).join(""));
}
// 25. 정수 제곱근 판별
// 임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
// n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
function solution(n) {
// 루트로 씌워줘서 제곱근 찾기
let sqrt = Math.sqrt(n);
// % 1==0 으로 판단 제곱근이 아니라면 루트 씌워줬을때 소숫점이 생겨서 나머지가 생길 것 이므로 루트111 = 10.535653.....
// Math.pow(숫자 , 제곱=2 세제곱=3 ....)
return sqrt % 1 == 0 ? Math.pow(sqrt + 1, 2) : -1;
}
// Math.pow() 제곱값 구하기
// Math.sqrt() 루트값 구하기
// 26. 제일 작은 수 제거하기
// 정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요.
// 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 - 1을 채워 리턴하세요.예를들어 arr이[4, 3, 2, 1]인 경우는[4, 3, 2]를 리턴 하고, [10]면[-1]을 리턴 합니다.
// 접근방법
// 입력으로 들어온 배열 중에 indexOf와 Math.min을 이용해서 배열 중에 가장 작은 수와 그 수의 배열 인덱스를 찾아낸다.
// 이후에는 splice를 이용해 배열에서 가장 작은 수를 제거한다.
// 가장 작은 수를 제거한 배열이 빈 배열인지 삼항 다항식으로 파악해서 빈 배열일 경우[-1]를 반환하고, 아닐 경우에는 가장 작은 수가 제거된 배열을 반환한다.
const solution = (arr) => {
arr.splice(arr.indexOf(Math.min(...arr)), 1);
return arr.length ? arr : [-1];
};
// 27. 콜라츠추측
// 1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다.
// 작업은 다음과 같습니다.
// 1-1. 입력된 수가 짝수라면 2로 나눕니다.
// 1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
// 2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
// 예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다.
// 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요.단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.
function solution(num) {
let answer = 0;
// 1까지 반복이니까 num이 1이 아니라면 반복
// if 첫번째 짝수면 2로 나누고 홀수면 3을 곱하고 1을 더함
// 이 반복이 1이 될때까지 하는데 500번 반복할 때 까지 1이 안된다면 -1을 리턴
// anwer는 몇번 만에 나왔는가 측정하는 값
while (num != 1) {
if (num % 2 == 0) {
num /= 2;
} else {
num = num * 3 + 1;
}
answer += 1;
}
if (answer >= 500) {
return -1;
} else {
return answer;
}
}
// 위에 문장을 아래 삼항연산자로 압축 할 수 있다
function solution(num) {
let answer = 0;
while (num != 1 && answer != 500) {
num % 2 == 0 ? (num = num / 2) : (num = num * 3 + 1);
answer++;
}
return num == 1 ? answer : -1;
}
// 28. 하샤드 수
// 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다.
// 예를 들어 18의 자릿수 합은 1 + 8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다.
// 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
function solution(x) {
var answer = 0;
// 1. x를 문자열로 바꾼다. (예시: 18 -> "18")
let newStr = x.toString();
// 2. 문자열 x를 한 문자씩 쪼갠다.[전개연산자][...str] ("18" -> [ '1', '8' ]
let words = [...newStr];
// 3. 문자를 숫자로 바꾼 후 변수 answer에 더한다. (answer = 9)
for (let i = 0; i < words.length; i++) {
answer += Number(newStr[i]);
}
// 4. x가 answer으로 나누어지는지 검사한다.
if (x % answer === 0) {
return true;
} else {
return false;
}
// 5. 나눠지면 true 아니면 false 출력
}
// 문자를 한 문자씩 쪼개는 방법
// 1. spread operator
// let str = "hello";
// let splitStr = [...str];
// cnsolem.log(splitStr); // ["h","e","l","l","o"];
// spread operator 를 이용하면 간편하게 분리할 수 있다.
// 2. Array.from
// let split = Array.from('hello');
// console.log(split); // ["h","e","l","l","o"];
// Array의 함수인 from을 이용해서도 간편하게 나눌 수 있다.
반응형
'생각 > javascript' 카테고리의 다른 글
혼공스 고급 예외 처리 (0) | 2022.09.25 |
---|---|
혼공스 피라미드 , 윤년 (1) | 2022.09.24 |
알고리즘 연습 11-20번 (1) | 2022.09.24 |
알고리즘 연습 1-10번 (1) | 2022.09.24 |
reduce함수 (0) | 2022.09.24 |