Record/TIL

TIL 20230408 알고리즘 문제 풀이

junhub 2023. 4. 10. 20:53

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를 리턴한다.