👩🏻💻 Today Learn
오늘은 뉴스피드 프로젝트를 진행하는것이 급해서 알고리즘 문제로 대체하는 TIL...OTL...
🔐 알고리즘 문제풀이
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;
while (num > 1) {
if (num % 2 === 0) {
num /= 2
} else {
num = (num * 3) + 1
}
answer += 1; // while문으로 홀수 짝수에 따라 반복한 횟수를 answer에 누적
}
if (answer >= 500){
return -1
} else {
return answer; // 누적횟수가 500이상이면 -1 반환, 그렇지 않으면 누적횟수 반환
}}
거의 매번 for문만 사용하다가 while문을 사용해보았다. 짝수와 홀수의 조건에 나누어 연산하는 부분까지는 문제없었는데 그 횟수를 누적하는 부분에 대해 고민이 많았다. 찾아보면서 꾸역꾸역 풀었지만 구구절절해 보이는 코드가 아쉬웠다.
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;
}
if문만 사용하지 말고 삼항연산자를 이용해 풀어보는 연습도 많이 필요할 것 같다.
String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.
function solution(seoul) {
let answer = '';
for(let i=0; i< seoul.length; i++){
answer = seoul[i] === 'Kim'
}
return `김서방은 ${Number(answer)}에 있다`;
}
제목만 흥미로웠던 문제
풀면서도 엥? 했는데 역시나 return 문에 Number가 없었을 때 true로 나왔다.
(배열안에 Kim이 무조건 있으니까 당연히 true지!)
그말은 Boolean을 숫자로 바꿨을때 true면 숫자 1 / false는 숫자 0으로 변환되는것이라 성공으로 나온것은 얻어걸린것이다.
정답 아님...엉망진창!
function solution (seoul) {
let answer = '';
answer = seoul.indexOf('Kim');
return `김서방은 ${answer}에 있다`
}
메서드를 활용하니 훨씬 간결하게 가능했다!
indexOf()
메서드는 배열에서 주어진 요소를 찾을 수 있는 첫 번째 인덱스를 반환하고, 찾을 수 없는 경우 -1을 반환한다.✍🏻 회고
팀 프로젝트 작업에 대해 기록하려고 했지만 진행된 부분이 많지 않아 조금 더 진행후에 기록하려 한다.
오늘 알고리즘 문제는 평소 풀던 것 보다(?) 문제가 조금 더 어렵게 느껴져서 구글링을 통해 이해하면서 풀었다. 단계별로 쪼개서 하나씩 접근하는 것에 익숙해지도록 해야겠다.