그저 내가 되었고
항해99) 2주차:: 알고리즘 테스트 연습(15~28); How I solved + more 본문
🎈 Today's my BEST
15. 내적
How I solved👇🏻
function solution(a, b) {
let sum = 0;
for ( i = 0 ; i < a.length ; i++ ) {
sum += (a[i] * b[i])
}
return sum
}
▶앞선 1~14번 문제 풀면서 삽질 맘껏 하니까.. 변수를 어디에다가 어떻게 선언하는지 꽤 익숙해져서 꽤 쉽게 풀었음.
16. 문자열 내 p와 y의 개수
How I solved👇🏻
function solution(s){
let convert = s.toLowerCase();
var count1 = (convert.match(/p/g) || []).length;
var count2 = (convert.match(/y/g) || []).length;
if (count1 == count2) {
return true
} {return false}
}
▶이건.. 문자열의 갯수 구해주는걸 따로 뭐 for문 돌리기 싫어서 그냥 함수 찾아보고 함.... 바로 구해주는 함수는 없고 저렇게 정규식으로 구한다고 함.
17. 문자열 다루기 기본⭐
How I solved👇🏻
function solution(s) {
let len = s.length;
if (len !== 4 && len !== 6) {
return false
} else {
for ( let i = 0 ; i < len ; i++) {
if (isNaN(s[i])) return false;
}
return true;
}
}
▶거의 한시간을 넘게 헤맸다.... 아니 일단 처음부터 if문 안에 for문 쓰기, 중첩 if문, if문 안에 for문 안에 if문 등등 다 짜증났는데...... 식 거의 다 세우고도 len !== 4 || 6 이러면 틀린다는 게 진짜 진짜 진짜 개ㅐㅐㅐ 킹받는 부분이었다..........(문법 모름)
Model Answer👇🏻
function solution(s) {
if (s.length === 4 || s.length === 6) {
return s.split("").every(c => !isNaN(c))
}
else {
return false
}
}
▶Array의 every 메소드를 사용하여 해당 문자열을 일일이 isNaN인지 확인할 수 있음. every는 배열 안의 모든 요소가 주어진 판별함수를 통과하는지에 따라 boolean값을 도출함. 조건을 만족하면 true, 아니면 자동으로 false 뱉음. 글서 if 필요 없다~!(그래서 이중 if문 안쓰고 바로 return 쓸 수 있는 것)
▶for문 돌려서 요소 하나하나 isNaN은 왜 안되는건지 아직도 의문. 똑같지 않나? 하.....ㅎㅅㅎ
Study More👇🏻
Array.prototype.every()
18. 서울에서 김서방 찾기
How I solved👇🏻
function solution(seoul) {
let location = seoul.indexOf("Kim")
return "김서방은 " + location + "에 있다"
}
▶location을 따로 변수로 빼지 않아도 되지만.. 이게 훨씬 더 깔끔하다고 생각.
19. 수박수박수박수박수박수?⭐
How I solved👇🏻
//짝수 자리에 "박", 홀수 자리에 "수" 밀어 넣는 방법.
function solution(n) {
let waterMelon = '';
for ( let i = 0 ; i < n ; i++) {
if( i === 0 || i % 2 === 0) {
waterMelon += "수"
} else {waterMelon += "박"
}
}
return waterMelon
}
//글자 수 홀/짝에 따라 "수박" repeat을 달리 처리하는 방법
function solution(n) {
let str = "수박";
let answer = '';
if ( n % 2 === 0 ) {
answer += str.repeat(parseInt(n / 2));
} else {
answer += str.repeat(parseInt(n / 2)) + "수";
}
return answer
}
▶처음에는 indexOf로 각각의 자릿수 다 계산해서 값을 밀어 넣어야 하나..? 하고 생각했는데 아무리 return을 해도, 그냥 집어넣으려 해도 그렇게는 안돼서 노선 변경........
20. 완주하지 못한 선수⭐⭐⭐⭐⭐
Model Answer👇🏻
function solution(participant, completion) {
participant.sort();
completion.sort();
for ( i = 0 ; i < participant.length ; i++ ) {
if (participant[i] != completion[i]) {
return participant[i]
}
}
}
▶풀지 못했다!!!!! 으앙!!!!!!! 답을 찾아보니 아이디어가 진짜 신박하고, 신기하고, 너무 재밌다고 생각됨ㅋㅋㅋㅋ 내장 함수, 메쏘드 등등을 전혀 이용하지 않는다면? sort의 존재를 모른다면? 아마 풀지 못할 것 같다.
21. 이상한 문자 만들기⭐⭐⭐⭐⭐
Model Answer👇🏻
function solution(s) {
let words = s.split(' ');
let answer = '';
for (let i = 0 ; i < words.length ; i++) {
for(let j = 0 ; j < words[i].length ; j++) {
if(j % 2 === 0 || j === 0) {
answer += words[i][j].toUpperCase();
} else {
answer += words[i][j].toLowerCase();
}
}
if (i < words.length - 1) {
answer += ' ';
}
}
return answer;
}
➟ 공백 기준으로 잘라서 문자열 덩어리들로 만들고
➟ 그 문자열들 총 갯수만큼 for문 돌건데
➟ 먼저 위의 for문 안에서, 그 문자열들 중 첫 번째 문자열의 문자 갯수만큼 for문 돌려줄거임
➟ 0번째 혹은 짝수번째면 대문자로 바꾸고
➟ 그게 아니라면 소문자로 바꿈. 위 두 과정 중 한 과정이 한 번에 일어남. if 또는 else 중 한개가 한번에 일어나는거고, i나 j는 차례로 증가하기 때문에 그냥 +=를 해줘도 아무 문제가 없는 것
➟ j 하나가 다 돌면 위의 for문으로 빠져나와서 i의 for문을 통해 공백을 적어줌
➟ 그 후 다시 안쪽 for문 돈다.
function solution(s) {
let words = s.split( " " );
let allWords = words.map(x => x.toLowerCase());
let temp = '';
for ( let i = 0 ; i < allWords.length ; i++) {
for ( let j = 0 ; j < allWords[i].length ; j++ ) {
if ( j == 0 || j % 2 == 0 ) {
temp += allWords[i][j].toUpperCase();
} else {
temp += allWords[i][j]
}
}
if (i < allWords.length - 1) {
temp += ' ';
}
}
return temp;
}
➟ 처음부터 전부 소문자로 바꾸고 시작할 수도 있음
22. 자릿수 더하기
How I solved👇🏻
function solution(n) {
let letters = n.toString();
let sum = 0;
for ( let i = 0 ; i < letters.length ; i++ ) {
sum += letters[i]*1
}
return sum
}
▶숫자를 문자열로 치환하는 방법을 헷갈리지 말자. 마음대로 하지 말자!!!!!!(처음에 let letters = "n"; 이렇게 함...ㅋㅋ....)
23. 자연수 뒤집어 배열로 만들기
How I solved👇🏻
function solution(n) {
let temp = [];
let letters = n.toString();
for (let i = 0 ; i < letters.length ; i++) {
temp.push(letters[i]*1)
}
return temp.reverse();
}
▶마지막에는 그냥 reverse 썼다.... 아 귀차너....ㅋㅋㅋㅋ큐큐ㅠㅠ
24. 정수 내림차순으로 배치하기
How I solved👇🏻
function solution(n) {
let letters = n.toString();
let temp = [];
for (let i = 0 ; i < letters.length ; i++) {
temp.push(letters[i]);
}
let answer = temp.sort(function(a, b) {
return b - a;
});
return answer.join('')*1
}
▶막... 문자열로 바꾸고 배열 만든 후에 for문 돌려서 배열에 하나하나 집어넣고...(하나하나 쪼개려고) 그다음에 sort 해줬는데.... 띠용
Model Answer👇🏻
function solution(n) {
let answer = Number(n.toString().split("").sort((a,b) => b - a).join(''));
return answer;
▶그냥 split("") 하면 알아서.. 그냥 각각 쪼개지나봄..... 와우......? 그 후엔 문자열도 그냥 sort 해버리면 되니까..... 응
▶아예 빠져나오기 전에 number만 씌워주면 끗...
Study More👇🏻
▶아래의 세 개 메쏘드 모두 string의 것
* .join('')
* split("")
* sort((a, b) => b - a)
25. 정수 제곱근 판별⭐
How I solved👇🏻
function solution(n) {
let answer = 0;
let power = 0;
for(let i=1; i*i<=n; i++){
if(i*i == n){
answer = i + 1
power = answer*answer
} else if(power == 0) {
power = -1
}
}
return power ;
}
▶어어... 이거 좀.... 이상한데...... 아니...... 왜 굳이 answer하고 power을 각각 만들어야하지?! 이런게 제일 문제임. 변수를 언제 잡는지 어떻게 잡는지 그런거......T T 기본이 제일 중요하다!!!!!!!!!!!!
function solution(n) {
if (Number.isInteger(Math.sqrt(n))) {
return (parseInt((Math.sqrt(n)) + 1) ** 2);
} else {
return -1
}
}
▶다시 풀 때는 그냥 square root 이용해서 풀었음. 간단하게 잘풀림.
26. 제일 작은 수 제거하기⭐⭐⭐⭐⭐겨 우 이 해 함⭐⭐⭐⭐⭐⭐
✍🏻문제 설명
▶정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
🎯제한 조건- arr은 길이 1 이상인 배열입니다.
- 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
Model Answer👇🏻
▶이제 이해함........... 이게 뭐냐면............ arr.splice(i, 1)이 arr의 i번째부터 1개를 컷해준다는건데.............. 위에서 for문 돌면서 i=j;로 제일 작은 숫자를 찍어주는 것임. 그러니까..... arr[i] > arr[j]일 때만 j를 i에 재할당해주고, 그게 아니라면 그냥 아무 일도 일어나지 않음. i와 j의 재할당으로 app.splice(i, 1)이 제일 작은 수를 컷팅할 수 있게 되는 것.....!!!!!
function solution(arr) {
if (arr.length === 1) return [-1];
let i = 0;
for (let j = 0; j < arr.length; j++) {
if (arr[i] > arr[j]) i = j;
}
arr.splice(i, 1);
return arr;
}
27. 콜라츠 추측⭐⭐⭐
How I solved👇🏻
function solution(num) {
var answer = 0;
for ( let i = 0 ; i < 500 ; i++) {
if (num !== 1) {
if (num % 2 === 0) {
num = num / 2;
} else {
num = (num * 3) + 1;
}
} else {
return answer = i;
}
}
return answer = -1;
}
function solution(num) {
for ( let i = 0 ; i < 500 ; i ++ ) {
if ( num !== 1 ) {
if ( num % 2 === 0 ) {
num = num / 2;
} else {
num = (num * 3) + 1;
}
} else {
return i
}
}
return -1;
}
28. 하샤드 수⭐
How I Solved👇🏻
function solution(x) {
let arr = x.toString().split("").map(x => parseInt(x));
let sum = arr.reduce((acc, cur) => acc + cur, 0);
return ( x % sum === 0 ) ? true : false
}
Model Answer👇🏻
function solution(x) {
let sum = 0;
let letters = x.toString().split("");
for ( let i = 0 ; i < letters.length ; i++) {
sum += letters[i]*1
}
return (x % sum == 0) ? true : false
}
'개발 > 항해99 9기' 카테고리의 다른 글
항해99) 2주차:: Algorithm Mock Test(JS) (0) | 2022.09.27 |
---|---|
항해99) 2주차:: TIL(화살표 함수 & 구조 분해 할당 & break문 & continue문 & for...of문 & for...if문) (0) | 2022.09.26 |
항해99) 2주차:: 웹개발+ 4주차; JWT & API (0) | 2022.09.25 |
항해99) 2주차:: 알고리즘 테스트 연습; Study more(1~14) (0) | 2022.09.25 |
항해99) 2주차:: 코딩테스트 연습(1~14); How I solved + more (0) | 2022.09.24 |