항해99 👩💻8일차 TIL
🎉오늘의 한 일🎉
오늘은 정말 오전 9시부터 밤 12시까지 알고리즘 문제만 풀었다😝 총 28개의 문제 중 아직 못 풀었던 10문제를 오늘 풀고 그제, 어제 풀었던 18개 문제중에 햇갈리는 문제들을 복습차원에서 다시 푸는 시간을 가졌다. 내일이 모의고사여서 더 집중하고 풀었다. 또 팀원분들과 돌아가면서 발표도 하고, 서로 이해가 안가는 부분 물어보기도 하면서 엄청 많은 걸 배울 수 있었다!! 역시 팀의 힘은 막강하다 !! 👍👍👍
🥰자바스크립트 알고리즘 풀이🥰
수박수박수박수박수박수?
문제 설명
길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.
- n은 길이 10,000이하인 자연수입니다.
풀이
function solution(n) {
var answer = '';
for(let i=1;i<=n;i++){
if(i % 2 === 0){
answer += "박"
}else{
answer += "수"
}
}
return answer
}
⭐ n의 수만큼 문자열을 반복하니까 for문으로 n만큼 돌리고 안쪽에 if문으로 인덱스값이 짝수일 때 '박'을 출력해주고, 짝수일 때 '수'를 출력해준다.
완주하지 못한 선수
문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
풀이
function solution(participant, completion) {
var p = participant.sort()
var c = completion.sort()
for(let i=0;i<p.length;i++){
if(p[i] !== c[i]){
return p[i]
}
}
}
⭐ 우선 sort() 함수로 두 문자형배열을 정렬시켜주고 나서 for문을 돌려 같은 위치의 이름이 같은지 확인해서 같지 않다면(완주자 명단에 없다면) 이름을 출력해준다.
이상한 문자 만들기
문제 설명
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
- 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
- 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
풀이
function solution(s) {
let arr = s.split(' ') // 문장을 공백을 기준으로 단어로 나누어줌
let result = [];
for(let i = 0; i<arr.length; i++){ // 첫번째, 두번째, 세번째 단어 순서
let words = arr[i].split('').map((word,idx)=>{
if(idx % 2 === 0){
return word.toUpperCase()
} else if(word % 2 !== 0) {
return word.toLowerCase();
}
}).join(''); //각각의 문자열들을 공백없이 단어로 묶어줌
result.push(words)
}
return result.join(' ') // 각각의 단어를 공백을 두고 하나의 문장으로 이어준다.
}
⭐ 문장의 단어를 공백을 기준으로 나누어주고, for문을 이용하여 문자열의 값이 짝수일땐 대문자, 홀수일 땐 소문자로 만들어주고 나중에 한 번에 합쳐서 출력해준다.
자릿수 더하기
문제 설명
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
- N의 범위 : 100,000,000 이하의 자연수
풀이
function solution(n){
var answer = 0;
var arr = [];
arr = n.toString().split('').map(Number) // 공백을 기준으로 나눠준다(문자열로 변환)
for (let i = 0; i < arr.length; i++) { //문자열을 숫자형으로 변환
answer += arr[i]; //변환된 숫자들 모두 더해주기
}
return answer
}
⭐ 입력값을 split() 를 이용하여 문자열로 자르고나서, 숫자형으로 변환시켜준 후 answer에 누적 더해준다.
자연수 뒤집어 배열로 만들기
문제 설명
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
- n은 10,000,000,000이하인 자연수입니다.
풀이
function solution(n) {
var a = String(n).split('').map(Number)
var answer = a.reverse();
return answer;
}
⭐ 입력값을 split() 으로 나누어주고 .map(Numver) 를 이용하여 숫자형으로 변환시켜준다. 그 다음 .reverse() 를 이용하여 배열의 순서를 뒤집어서 출력해준다.
정수 내림차순으로 배치하기
문제 설명
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
- n은 1이상 8000000000 이하인 자연수입니다.
풀이
function solution(n) {
var answer = Number(n.toString().split('').sort().reverse().join(""));
return answer;
}
⭐ 입력값 n을 toString()으로 문자형으로 변환한 다음, split()으로 나눠준 값을 Number()함수를 이용하여 숫자형으로 변화시켜준 뒤 sort().reverse()를 이용하여 내림차순으로 만들어준다.
정수 제곱근 판별
문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
- n은 1이상, 50000000000000 이하인 양의 정수입니다.
풀이
function solution(n) {
var answer = 0;
var x = Math.sqrt(n) //x가 n의 제곱근이라면
if(n == x*x){ //n은 제곱근x 의 제곱이다
answer = (x+1)*(x+1) //제곱근+1 의 제곱의값을 반환
}else{
answer = -1
}
return answer;
}
⭐ 제곱근 계산해주는 Math.sqrt(n) 함수를 찾아서 풀어주었다.
재풀이
function solution(n) {
var answer = 0;
var x = Math.sqrt(n) // x는 제곱근
if(n % x === 0){
answer = Math.pow((x+1),2)
}else{
answer = -1
} return answer;
}
⭐ 거듭제곱값을 계산해주는 Math.pow([대상 숫자], [거듭제곱 횟수]); 함수를 이용하여 더 깔끔하게 풀이하였다.
제일 작은 수 제거하기
문제 설명
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
- arr은 길이 1 이상인 배열입니다.
- 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
풀이
function solution(arr) {
var answer = [];
var min = Math.min(...arr); //배열의 최소값 구하는 함수.
if(min.length !== 0){ //최소값을 가지고 있지 않을 떄
answer = arr.filter(a => a != min) //.filter함수를 사용
}
if(arr.length===1){ //리턴하려는 배열이 빈 배열인 경우(배열의 값이 1개인 경우)
answer.push(-1) // -1 리턴
}
return answer;
}
⭐ 배열의 최소값을 구하는 함수 Math.min(...arr)와 조건을 주고 해당 조건이 참인 요소를 모아 새로운 배열로 반환하는 .filter() 메서드를 구글링으로 찾아서 문제를 풀었다. 입력값이 하나인 경우 -1을 반환하는 이유는 값이 하나면 그 값이 최소값이 되서 첫번쨰 로직에서 사라져버리기 때문에 출력값이 나올 수 없기 때문이다.
콜라츠 추측
문제 설명
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을 완성해 주세요. 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.
- 입력된 수, num은 1 이상 8000000 미만인 정수입니다.
풀이
function solution(num) {
let answer = 0;
while (num !== 1 && answer !== 500) {
num % 2 ? (num = num * 3 + 1) : (num = num / 2);
answer++;
}
return num === 1 ? answer : -1;
}
⭐ 이 문제는 풀어봐도 답이 안나와서 답을 보고 풀었다. 다른분께서 삼항연산자를 사용해서 간편하게 풀으신 걸 보고 대단하시다는 생각이 들었다... 나도 더 열심히 해야겠다!!
하샤드 수
문제 설명
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
- x는 1 이상, 10000 이하인 정수입니다.
풀이
function solution(x) {
var answer = 0;
var arr = [];
arr = x.toString().split('').map(Number)
for(let i=0;i<arr.length;i++){
answer += arr[i] // 0 + 1 = 1
}if(x % answer === 0){
answer = true
}else{
answer = false
}
console.log(arr);
}
팀원분의 풀이
function solution(x) {
var answer = 0;
let a = String(x); // x를 더할수있게 문자열로바꿔준다
for(let i =0; i < a.length ; i ++){
answer += Number(a[i]);
}
if(x % answer ==0){
answer = true;
}else{
answer = false;
}
return answer;
}
⭐ 문제에 충실히 로직을 짜서 풀어더니 생각보다 쉽게 풀려서 기분이 좋았다 : ) 그런데 팀원분께서는 입력값을 굳이 split()으로 나누지 않으시고 문자열을 숫자형으로 변환시켜서 바로 답을 구하셨다. 생각지 못한 방법이었는 데 좋은 것 같다 : )
⭐ 다시 공부할 겸 문제를 초기화하여 다시 풀어보았는데 계속 for문의 출력값이 하나씩 더 나와서ㅠㅠ 그래서 한 10번은 다양한 풀이 찾아보면서 다시 풀어보았는데 분면 복붙해서 가져오면 정답이 나오고, 초기화하고 내가 다시 풀어보면 값이 달라서 이상하다 생각했는데 드디어 답을 찾았다!! 문제는 코드에 있는 게 아니라 첫 번째 줄에 answer 변수를 선언해주는 것에 있었다! 초기화하면 answer가 true로 자동설정 되는데 그게 이미 1이란 값을 가지고 있어서 각 자릿수를 더해주는 것에 +1이 되어 출력되는 것이었다!! 생각해보면 간단한건데 왜 몰랐었는지... ㅎㅎ 그래도 이렇게 하나 또 배웠다!
🍧느낀점🍧
아직도 어렵긴 하지만 그래도 이제 알고리즘 문제 푸는 것에 약간의 자신감이 생겼다 : )
내일 모의고사니까 좀만 더 공부하다 자자!!