TIL 20230408 알고리즘 문제 풀이
function solution(s) {
const words = s.split(" ");
let result = "";
for (let i = 0; i < words.length; i++) {
const word = words[i];
for (let j = 0; j < word.length; j++) {
if (j % 2 === 0) {
result += word[j].toUpperCase();
} else {
result += word[j].toLowerCase();
}
}
if (i !== words.length - 1) {
result += " ";
}
}
return result;
}
console.log(solution("try hello world "))
split(" ")을 사용해 문자열로 들어온 매개변수를 배열화 시켜서 "try", "hello", "world" 형태로 만들어줬다.
그 후 첫번째 반복문 내에 words[i]번째 인덱스를 word로 할당시켰다. 즉 첫번째 반복땐 word에 words의 0번째 인덱스가 고정이 되는 것이다.
다시 내부의 반복문으로 들어가서 만약 j가 짝수라면 word의 j번째 인덱스를 toUpperCase()을 통해 대문자화 시켜서 빈 문자열이 할당된 result에 더하게 했다. 내부의 반복문은 words의 i번째 인덱스 길이만큼 반복하므로 모든 문자열의 짝수번째 인덱스를 검증할 수 있다.
그 후 만약 i 와 words.length - 1 와 같지않다면 즉, 위의 코드에서 words의 0번째 인덱스의 대문자 변환을 모두 완료한 후 공백을 하나 넣어주고 , 다시 i가 1이 되면 words의 1번째 인덱스의 대문자 변환을 모두 완료 후 공백을 하나 다시 넣어준다.
이때, words의 2번째 인덱스 즉, 마지막 단어가 끝나는 부분에는 공백이 들어가면 안된다. 따라서 words.length - 1과 i가 같을때는 공백을 넣지 못하게 했다.
function solution(n) {
let str1= String(n)
let result = 0
for(i=0; i < str1.length; i++){
result += Number(str1[i])
}
return result
}
먼저 String() 메소드를 사용해 매개변수 n을 문자열화 시켰고 반복문을 사용해 str1의 첫번째부터 마지막번째 인덱스 요소까지 더해서 result에 할당시켰다. 이때 Number()을 사용한 이유는 숫자 형태로 result에 넣지 않는다면 0123 과 같이 문자열이 합쳐지는 결과가 나타나게 된다. 따라서 숫자 형변환을 시킨 후 result에 더해줬다.
function solution(n) {
let str1 = String(n)
let arr1 = Array.from(str1)
const result = arr1.map((a) => Number(a))
return result.reverse()
}
console.log(solution(12345))
먼저 String() 메소드를 사용해 문자열화 시켰고 Array.from() 메소드를 사용해 arr1 변수에 할당했다. 그 후 map() 내부에 Number() 메소드를 사용해 모든 요소를 돌면서 Number로 형변환 시켜서 리턴했고 마지막으로 reverse() 메소드를 사용해 배열을 거꾸로 뒤집어줬다.
# 다른 사람의 풀이
function solution(n) {
return n.toString().split('').reverse().map(o => parseInt(o));
}
to String()으로 문자열화 시킨후 split('')으로 배열화 시킨 다음 reverse()로 배열을 뒤집었다. 그 후 map 함수를 사용해 배열 내의 모든 요소를 돌면서 parseInt()을 사용해 모든 요소를 숫자로 형변환을 시켜서 리턴했다.
function solution(n) {
let abc = String(n)
let arr = Array.from(abc)
var answer = arr.sort((a,b) => b - a)
let result = answer.map((a) => Number(a))
return Number(result.join(''))
}
문자열로 변환한 후 배열화 시켰다. 그 후 sort() 메소드를 사용해 내림차순 시켰고 map 함수를 사용해 모든 배열 요소를 Number로 형변환을 시킨 후 리턴했다. 그 후 마지막으로 join()으로 하나로 합쳐줬는데 join() 메소드는 문자열을 반환하기 때문에 다시 한번 Number() 메소드를 사용해서 숫자 형변환을 시킨 후 리턴했다.
# 다른 사람의 풀이
function solution(n) {
return parseInt((n+"").split("").sort().reverse().join(""));
}
n + "" 을 사용해 문자열로 바꿔주고 split("")을 사용해 배열화 시킨후 sort() 메소드를 사용해 오름차순 정렬 후, reverse()로 배열 순서를 뒤집어줬다. 그 후 join("")을 사용해 배열의 요소들을 하나의 문자열로 합쳐준 후 모든 내용을 parseInt로 감싸 숫자 형변환을 해서 리턴하게 했다.
function solution(n) {
if(Math.sqrt(n) % 1 === 0){
return Math.pow(Math.sqrt(n) + 1,2)
}else{
return -1
}
}
console.log(solution(121))
먼저 제곱근을 구하는 메소드인 Math.sqrt()을 사용해 만약 1로 나누었을 때 나머지가 0 이라면(= 정수), Math.pow을 사용해 제곱근에 + 1 한 값을 제곱해서 리턴했다. 이때 2는 Math.sqrt(n) + 1의 값을 2제곱한다는 의미이다.
만약 제곱근을 1로 나누었을때 나머지가 0이 아니라면(! == 정수) -1을 리턴하게 했다.
function solution(arr) {
if(arr.length > 1){
let min = Math.min(...arr)
let result = arr.filter((a) => a > min)
return result
}else{
return [-1]
}
}
Math.min(...arr)을 사용하여 배열 요소 중 가장 작은 값을 min 에 할당했다. 이때 ...arr을 스프레드 문법을 사용한 것인데 배열의 모든 요소를 검사할 수 있도록 한것이다. 그 후 filter() 메소드를 사용해 모든 요소가 a를 돌면서 min보다 큰 수를 리턴해서 result에 할당하게 했다. 만약 arr.length가 1보다 크지 않다면 [-1]을 리턴하게 했다.
function solution(num) {
let result = [];
while (num !== 1) {
if (num % 2 === 0) {
num = num / 2
} else {
num = num * 3 + 1
}
if(result.length > 500){
return -1
}
result.push(num);
}
return result.length
}
console.log(solution(6))
while 문을 사용해 num이 1일때까지 반복한다. 만약 num이 짝수라면 num / 2를해서 다시 num에 할당 후 빈배열인 result에 push한다.
다시 재할당된 num이 짝수라면 2로 나눠주고 홀수라면 재할당된 num에 3 을 곱하고 1일 더해서 num에 재할당 후 result에 넣는다. 이러한 과정이 반복되다가 num이 1이 되면 끝나게되고 result.length 즉, result내의 배열 요소 길이가 몇번 연산을 했는지와 같으므로 리턴해준다.
# 다른 사람의 풀이
function collatz(num) {
var answer = 0;
while(num !=1 && answer !=500){
num%2==0 ? num = num/2 : num = num*3 +1;
answer++;
}
return num == 1 ? answer : -1;
}
function solution(x) {
let str = String(x)
let arr = Array.from(str)
let sum = arr.reduce((a,b) => a*1+b*1)
if(x % sum ===0){
return true
}else{
return false
}
}
먼저 매개변수 x를 문자열화 시킨 후 배열화 시켜서 arr 에 할당한다. 그 후 변수 sum에 arr 배열의 모든 값을 더한다. 이때 a와 b에 1을 곱해주는 이유는 number로 형변환을 시킨 후 더해주기 위함이다.
그 후 x가 모든 자리수의 합인 sum으로 나누어 떨어진다면 true를, 나누어떨어지지 않는다면 false를 리턴한다.