항해 99

항해 99 10일차 09/28

코딩이좋아요 2022. 9. 29. 00:24

내일 시험이 있어서 알고리즘 문제를 계속 풀어봤다.

아직 어려운것도 많고 메소드도 모르는것이 너무 많아서 푸는데 오래걸렸고 정말 모르겠으면 답을 찾아서 이해해보려고 했다.

문제 1 콜라츠 추측

더보기
1-1. 입력된 수가 짝수라면 2로 나눕니다. 
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다. 

function solution(x) {
    if (x==1) return 0 //x가 1이면 0리턴
    let count = 0;
    let sum = x;
    for (let i = 0; i <500; i++ ){ //i가 499까지 증가
    sum % 2 ? sum = sum *3+1 : sum = sum / 2
    //3항 연산자는 true 1, false 0
    //sum 를 2로 나눈 값이 1 0
    //(홀수) 1 sum *3+1
    //(짝수) 0 sum/ 2
    count += 1 //한번할때 마다 count 1씩 증가
    if (sum == 1){ //sum이 1일시
      break // 반복문 중단
      }
    }
    return count < 500 ? count : count = -1
    //count 가 500보다 작다 = count 리턴
    // count 가 500보다 크다 -1 리턴
  }

console.log(solution(12)) //9

문제 2 제일 작은수 제거하기 (배열)

더보기

제일 작은수 제거하기( 배열 )
function solution(arr) {
 let answer = [];
for(i = 0; i < [...arr].length; i++){  //arr배열의 길이만큼 반복한다.
    if(arr[i] > Math.min(...arr)){  //arr의 인덱스 값이 arr배열안에 최소값이랑 비교한다
      answer.push(arr[i]) //배열의 각 요소가 최소값 보다 높으면 answer에 넣어준다
    }else if([...arr].length == 1){ //배열의 길이가 1과 같으면 즉 한개만 들어있으면 answer에 -1넣어준다.
      answer.push(-1)
    }  
}
    return answer;
}

 

arr = [4, 3, 2, 1]
arr1 = [10]

문제 3 자연수 N

더보기
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
 
let n = 123;
n = String(n) 
//123을 문자로 바꿔준다
answer = 0;
for(i = 0; i< n.length; i++){
//문자의 길이만큼 반복문을 돌린다
    answer += Number(n[i])
//문자의 인덱스 값을 숫자로 바꿔서 더해준다
}
console.log(String(answer))

문제 4 이상한 문자 만들기

더보기

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

function solution(s) {
    s = "try hello world"
    s.toUpperCase().split(" ")
    //s의 값을 대문자로 바꾸고 공백을 기준으로 쪼개준다.
   .map(a => a.split('').map((b,i)=> i%2 !==0 ? b.toLowerCase() : b).join(''))
   //map각 단어를 글자별로 쪼개고 map으로 돌린다 이때 map은 인덱스를 통해 홀짝 구문해야해서
   //인수를 두개 가진다. 참이면 즉 짝수이면 소문자로 바꿔주고
   //바꿔준 단어는 join으로 붙혀주고 
   //map으로 분리된 단어는 공백을 포함하여 붙혀줌
   .join(' ');
}

문제 5 자연수 뒤집기

더보기

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요.

예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

    return [...n+""].map(a=>+a).reverse() //문자인 배열로 받아서 숫자로 바꿔서 배열의 재배치했다
}  

 

문제 6 정수제곱근 판별

더보기

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

function solution(n) {
    var answer = 0;
    sum = 0;
if(Math.sqrt(n) % 1 == 0){ //Math.sqrt 함수는 제곱근을 구하는 함수다. n= 121 이면 11이 나온다. 
    sum = (Math.sqrt(n)+1) * (Math.sqrt(n)+1) //Math.sqrt(n)+1 즉 11+1 과 같다. 
}else{
    sum = -1 //제곱근이 아니라면 -1
}
    return answer = sum;
}

문제 6 하사드 수

더보기

function solution(x) {
    let a = String(x).split("").map(x => +x)
    //숫자는 길이를 알수가 없어 문자로 바꿔준다
    //문자로 바꾼 숫자를 split 함수로 쪼개서 배열로 만들어주고
    //그 배열을 숫자로 만들어준다.
    let count = 0;


for (i = 0; i < a.length; i++){ //배열의 길이만큼 반복문 돌린다
     count += a[i] 
//각 배열을 count에 넣어준다 1 + 1 +1 이런식으로
}
return x % count ? false : true;
//3항 연산자를 써서 x % count x의 값을 count의 값으로 나누어준다
//3항 연산자는 ? (1은 true) : (0은 false로 받는다)
//답안에는 0일시 true가 나와야 하므로 반대로 적어주며 원하는 결과를 얻을 수 있다.
// x % count ? false : true;
}
console.log(solution(111))

 

아직 이해가 안되는것도 많은데 몇번 더 풀어봐야 할꺼 같다.