항해 99 10일차 09/28
내일 시험이 있어서 알고리즘 문제를 계속 풀어봤다.
아직 어려운것도 많고 메소드도 모르는것이 너무 많아서 푸는데 오래걸렸고 정말 모르겠으면 답을 찾아서 이해해보려고 했다.
문제 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 = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
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))
아직 이해가 안되는것도 많은데 몇번 더 풀어봐야 할꺼 같다.