*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 |