-
[인프런 강의] JS 알고리즘 문제풀이(코딩테스트 대비) - 섹션1Algorithm 2022. 1. 30. 21:17
*17개 문제 중 3개 못 풀었음 (22.01.31)
1) 세 수 중 최솟값
function solution(a, b, c) { let answer; if (a < b) { answer = a; } else { answer = b; } if (answer > c) { answer = c; } return answer; } console.log(solution(2, 5, 1));
2) 삼각형 판별하기
* 가장 긴 변의 길이가 다른 두 변의 길이의 합보다 크거나 같으면 삼각형을 그릴 수 없다.
세 변의 길이를 줬을 경우 길이가 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 삼각형을 그릴 수 있다.
function solution(a, b, c) { let answer = "YES"; let arr = [a, b, c]; arr.sort(function(a,b) { return a-b; }); const max = arr[2]; if(arr[0] + arr[1] <= max) { answer = "NO"; } return answer; } console.log(solution(13, 33, 17));
* 강사님 코드
function solution(a, b, c) { let answer = "YES"; max; let sum=a+b+c; if(a>b) max=a; else max=b; if(c>max) max=c; if((sum-max)<=max) answer="NO"; return answer; } console.log(solution(13, 33, 17));
3) 연필개수
* 나머지가 있을 경우 올림 해줘야함
function solution(n) { let answer; answer = Math.ceil(n / 12); return answer; } console.log(solution(178));
👉 let answer = Math.ceil(n/12); 한 줄로 작성 가능
4) 1부터 N까지의 합
function solution(n) { let answer = 0; for(let i=1; i <= n; i++) { answer += i } return answer; } console.log(solution(10));
5) 최솟값 구하기
* 아래와 같이 오름차순 정렬해서 arr의 0번째 있는 수를 return 했는데, 출제자의 의도가 이 방식은 아니라고 생각.
방법2와 같이 다시 풀었음.
방법1
function solution(arr) { arr.sort( function (a,b) { return a-b; }); return arr[0]; } let arr = [5, 7, 1, 3, 2, 9, 11]; console.log(solution(arr));
방법2
function solution(arr) { let answer; let min = arr[0]; // arr의 0번째 인덱스 값으로 세팅 for(let i=0; i < arr.length; i++) { if(arr[i] < min) { min = arr[i]; } } return min; } let arr = [5, 7, 1, 3, 2, 9, 11]; console.log(solution(arr));
* 강사님 코드
function solution(arr) { let answer; let min = Number.MAX_SAFE_INTEGER; // 안전한 범위의 제일 큰 정수로 초기화 for(let i=0; i < arr.length; i++) { if(arr[i] < min) { min = arr[i]; } } return min; } let arr = [5, 7, 1, 3, 2, 9, 11]; console.log(solution(arr));
* 보충
[Math.min() 함수 사용해서 최솟값 구하기]
Math.min(1,7,3)
배열일 경우 Math.min(...arr)
-> ...arr 하는 이유는 arr[0], arr[1], arr[2]... 와 같이 인자를 전개 연산자를 사용해서 펼쳐줘야함
전개연산자를 쓰지 않으려면
Math.min.apply(null, arr); // 첫번째 인자는 객체고 null, 두번째 인자에 배열을 넘김
[Math.max() 함수 사용해서 최댓값 구하기]
Math.min(1,7,3)
배열일 경우 Math.max(...arr)
6) 홀수
* 배열 중 홀수의 합을 첫째 줄에 출력, 해당 홀수 중 최솟값을 둘째 줄에 출력
function solution(arr) { let answer = []; let sum = 0; for(let i=0; i < arr.length; i++) { if(arr[i] % 2 !== 0) { // 홀수 판별 sum += arr[i]; answer.push(arr[i]); } } answer.sort(function (a,b) { // 정렬 return a-b; }); console.log(sum) // 합계 출력 return answer[0];// 최솟값 출력 } arr = [12, 77, 38, 41, 53, 92, 85]; console.log(solution(arr));
function solution(arr) { let answer = []; let sum = 0; let min = Number.MAX_SAFE_INTEGER; // 안전 범위의 가장 큰 숫자로 초기화 for(let x of arr) { if(x % 2 === 1) { // 홀수일 경우 합산 sum += x; if(x < min) { // 최솟값 구함 min = x; } } } answer.push(sum); answer.push(min); return answer; } arr = [12, 77, 38, 41, 53, 92, 85]; console.log(solution(arr));
7) 10부제
function solution(day, arr) { let answer = 0; for(let i=0; i < arr.length; i++) { if(arr[i].toString().split("")[1] == "3") // 문자열로 바꾸고 split 후 1번째 인덱스 비교 answer++; } return answer; } arr = [25, 23, 11, 47, 53, 17, 33]; console.log(solution(3, arr));
* 강사님 코드
function solution(day, arr) { let answer = 0; for(let x of arr) { if(x % 10 === day) { // 10으로 나눈 나머지가 day일 때 answer++; } } return answer; } arr = [25, 23, 11, 47, 53, 17, 33]; console.log(solution(3, arr));
8) 일곱난쟁이
*실패 코드
function solution(arr) { let answer = arr; let sum =0; for(let i = 0; i < arr.length; i++) { sum += arr[i]; console.log("sum: " + sum) for(let j = 0; j < arr.length; j++) { if(sum - (arr[i] + arr[j]) == 100) { arr.splice(i, 1); arr.splice(j, 1); } } } return answer; } let arr = [20, 7, 23, 19, 10, 15, 25, 8, 13]; console.log(solution(arr));
*강사님 코드
function solution(arr) { let answer = arr; // 얕은 복사 (메모리에 있는 똑같은 주소 가리킴) let sum = arr.reduce((a, b) => a + b, 0); // a에 b(arr의 값들)를 누적, 0은 처음에 0으로 초기화(시작 조건 없을 경우 안해도 됨) console.log(sum); for(let i = 0; i < 8; i++) { // 배열에서 2개씩 확인하니까 9보다 하나 작은 8로,, for(let j = i+1; j < 9; j++) { // 9 대신 arr.length로 하면 됨 // console.log(arr[i], arr[j]); if(sum - (arr[i] + arr[j]) === 100) { arr.splice(j, 1); // i를 먼저 지울 경우 앞에서 삭제되며 뒤 인덱스가 변경 arr.splice(i, 1); // 때문에 뒤 인덱스인 j부터 지우고 i를 지움 } } } return answer; } let arr = [20, 7, 23, 19, 10, 15, 25, 8, 13]; console.log(solution(arr));
9) A를 #으로
function solution(s) { let answer = s.replace(/\A/g, "#"); // A 를 # 으로 변경 return answer; } let str = "BANANA"; console.log(solution(str));
*강사님 코드
function solution(s) { let answer = ""; for(let x of s) if(x === "A") answer += "#"; else answer += x; return answer; } let str = "BANANA"; console.log(solution(str));
10) 문자 찾기
function solution(s, t) { let answer = 0; for(let i = 0; i < s.length; i++) { if(s[i] === t) answer++; } return answer; } let str = "COMPUTERPROGRAMMING"; console.log(solution(str, 'R'));
*강사님 코드
function solution(s, t) { let answer = 0; for (let x of s) { if (x === t) answer++; } return answer; } let str = "COMPUTERPROGRAMMING"; console.log(solution(str, 'R'));
function solution(s, t) { let answer = s.split(t).length; // 만약 t가 제일 끝에 있어도 빈 문자열이 생기기 때문에 관계 없음 return answer - 1; } let str = "COMPUTERPROGRAMMING"; console.log(solution(str, 'R'));
11) 대문자 찾기
*내가 풀이한 것 중 if 문으로 처리한 부분에서 소문자가 97부터 시작하지만 알고보니 대문자에서 바로 소문자로 간게 아니라 91부터 96까지 다른 특수문자가 있었다.
따라서 해당 코드에서 65 에서 90 사이일 경우로 조건을 변경이 필요하다.
function solution(s) { let answer = 0; let arr = s.split(""); for(let i=0; i < s.length; i++) { if(arr[i].charCodeAt() < 97 ) // 소문자 a (97)보다 작을 경우 answer ++ answer++; } return answer; } let str = "KoreaTimeGood"; console.log(solution(str));
function solution(s) { let answer = 0; for (let x of s) { //let num=x.charCodeAt(); //if(num>=65 && num<=90) answer++; if (x === x.toUpperCase()) answer++; } return answer; } let str = "KoreaTimeGood"; console.log(solution(str));
12) 대문자로 통일
function solution(s) { let answer = ""; let arr = s.split(""); for (let i=0; i < s.length; i++) if (arr[i].charCodeAt() > 96) // 아스키 코드로 소문자일 경우 answer += arr[i].toUpperCase(); // 대문자로 변환 else answer += arr[i]; return answer; } let str = "ItisTimeToStudy"; console.log(solution(str));
*강사님 코드
function solution(s) { let answer = ""; for (let x of s) { let num = x.charCodeAt(); if (num >= 97 && num <= 122) answer += String.fromCharCode(num - 32); // 소문자 아스키 코드에서 32 빼면 대문자 아스키 코드 나옴 else answer += x; //if(x===x.toLowerCase()) answer+=x.toUpperCase(); //else answer+=x; } return answer; } let str = "ItisTimeToStudy"; console.log(solution(str));
- 쉬운 방법
function solution(s) { let answer = s.toUpperCase(); // 여기서 한 번에 대문자로 바뀜 return answer; } console.log(solution("StuDY"));
13) 대소문자 변환
function solution(s) { let answer = ""; let arr = s.split(""); for(let i=0; i < s.length; i++) if(arr[i].charCodeAt() > 96) // 소문자일 경우 answer += arr[i].toUpperCase(); // 대문자로 변경 else // 대문자일 경우 answer += arr[i].toLowerCase(); // 소문자로 변경 return answer; } console.log(solution("StuDY"));
*강사님 코드
function solution(s) { let answer = ""; for(let x of s) { if (x === x.toUpperCase()) answer += x.toLowerCase(); else answer += x.toUpperCase(); } return answer; } console.log(solution("StuDY"));
14) 가장 긴 문자열
*풀지 못한 코드
function solution(s) { let answer = "" let max = Number.MIN_SAFE_INTEGER; for(let i = 0; i < s.length; i++) { if(s[i].length > max) max = s[i].length; answer = s[i]; // 여기서 계속 s의 새로운 단어들이 들어오는 문제 (max가 이미 큰 값으로 세팅되어 있으므로) } return answer; } let str = ["teacher", "time", "student", "beautiful", "good"]; console.log(solution(str));
*위의 코드에서 if 문에 { } 를 넣어주니까 정상적으로 beautiful이 출력됐다....
function solution(s) { let answer = "" let max = Number.MIN_SAFE_INTEGER; for (let i = 0; i < s.length; i++) { if (s[i].length > max) { max = s[i].length; answer = s[i]; } } return answer; } let str = ["teacher", "time", "student", "beautiful", "good"]; console.log(solution(str));
* 강사님 코드
function solution(s) { let answer = "", max = Number.MIN_SAFE_INTEGER; for (let x of s) { if (x.length > max) { max = x.length; answer = x; } } return answer; } let str = ["teacher", "time", "student", "beautiful", "good"]; console.log(solution(str));
15) 가운데 문자 출력
function solution(s) { let answer = ""; let mid = Math.floor(s.length / 2) ; if (s.length % 2 === 0) answer += s[mid - 1] + s[mid]; else if (s.length % 2 === 1) answer += s[mid] return answer; } console.log(solution("study"));
function solution(s) { let answer; let mid = Math.floor(s.length / 2) if (s.length % 2 === 1) answer = s.substring(mid, mid + 1); else answer = s.substring(mid - 1, mid + 1); // substring(2,3) 2번 인덱스에서 3번 인덱스 전까지라는 뜻. 즉, 2번 인덱스만. //if(s.length%2===1) answer=s.substr(mid, 1); //else answer=s.substr(mid-1, 2); // substr(2,4) 2번 인덱스에서 4개를 뽑아내라 return answer; } console.log(solution("study"));
16) 중복문자 제거
* arr.indexOf(v) === i 이 부분 덜 이해됨 다시 확인해야함
function solution(s) { let answer = ""; let arr = s.split(""); let arrUniqe = arr.filter((v, i) => { if(arr.indexOf(v) === i) // 해당 값의 첫 인덱스와 마지막 인덱스가 같을 경우 answer += arr[i]; }); return answer; } console.log(solution("ksekkset"));
알파벳 다음으로 나온 두 인덱스가 다를 경우 제거 (중복이라는 뜻)
*강사님 코드
function solution(s) { let answer = ""; //console.log(s.indexOf("K")); for (let i = 0; i < s.length; i++) { //console.log(s[i], i, s.indexOf(s[i])); if (s.indexOf(s[i]) === i) // s.indexOf(s[i]) 는 해당 알파벳의 idx 중복일 경우 제일 처음 idx 나옴 answer += s[i]; } return answer; } console.log(solution("ksekkset"));
* 중복횟수를 찾아야하는 경우
// 중복 횟수를 찾아야하는 경우 function solution(s) { let answer = 0; let pos = s.indexOf("k"); // k의 첫번째 위치 while(pos !== -1) { // 못 찾을 경우 -1 => 여기 제대로 이해 못함!!! answer++; pos = s.indexOf("k", pos+1); // 찾은 k의 위치 뒷편부터 탐색 } return answer; } console.log(solution("ksekkset"));
17) 중복단어 제거
*강사님 코드
function solution(s) { let answer; answer = s.filter((v, i) => { if (s.indexOf(v) === i) { return true; // true 가 return 되는 요소만 따로 뽑아서 새로운 배열 만든다. } }); return answer; } let str = ["good", "time", "good", "time", "student"]; console.log(solution(str));
-> 위 코드블럭에서 if 문을 return 에 넣어 줄일 수 있음
function solution(s) { let answer; answer = s.filter((v, i) => { return s.indexOf(v) === i; // true일 경우 해당 요소만 따로 뽑아서 새로운 배열 만든다. }); return answer; } let str = ["good", "time", "good", "time", "student"]; console.log(solution(str));
'Algorithm' 카테고리의 다른 글
[인프런 강의] JS 알고리즘 문제풀이(코딩테스트 대비) - 섹션2 (0) 2022.02.03 [이론] 삼각형의 결정 조건 (0) 2022.01.30 [백준 알고리즘] 1316번: 그룹 단어 체커 (JavaScript - 실패코드) (0) 2022.01.16 [백준 알고리즘] 4344번: 평균은 넘겠지 (JavaScript, Python) (0) 2022.01.11 [백준 알고리즘] 10869번: 사칙연산 (JavaScript, Python) (0) 2022.01.10