javascript coding
정리중인 문서입니다
분수의 덧샘
- 문제링크
분수의 덧셈
분자 = 분자1분모2 + 분자2분모1; 분모 = 분모1*분모2;
기약분수
- 기약분수 = 분자와 분모를 최소공배수로 나누면 얻을수 있음
최대공약수 gcd(greatest common divisor)
- 두 숫자를 나누어 떨어지게 할수 있는 가장큰수 = 두 숫자를 나눈 나머지가 0이 될때의 값
- 항상 큰수에서 작은수를 나누어야 한다.
//javascript function gcd(a,b){ var min = Math.min(a,b); var max = Math.max(a,b); var _gcd = min; while(true){ if(max % min == 0)break; _gcd = max % min; max = min; min = _gcd; } console.log("gcd:"+_gcd); return _gcd; }
최소공배수 lcm(least common multiple)
- 두 수에 서로 공통으로 존재하는 배수 중 가장 작은 수
- 두 수를 곱한 후 최대공약수로 나눈수
//javascript function lcm(a,b){ var _gcd = gcd(a,b); var _lcm = a*b/_gcd; console.log("lcm:"+_gcd); return _lcm; }
중앙값 구하기
- 문제링크
- javascript sort를 이용하여 정렬 가능
- var answer = array[Math.round(array.length/2)-1];
-
정렬 후 전체길이의 반절 -1 (0 주소 부터 시작하기 때문)하여 문제해결
- 값의 크기가 비교되는게 아니라 앞글자부터 비교되어 에러가 난 경우
- sort()는 문자열의 유니코드 순서를 따르므로
- sort((a,b) => a-b)로 해주어야 한다.
최빈값 구하기
- 문제링크
//javascript function solution(array) { var counters = []; counters[0] = 0; for(var i=0; i<array.length; i++){ if(Number.isInteger(counters[array[i]])){ //주소에 들은 값이 정수인지 확인 counters[array[i]]++; }else{ //아니라면 초기값 입력 counters[array[i]] = 1; } } var appear_time = 0; var max_appear = -1; for(var i=0; i<counters.length; i++){ if(counters[i] == appear_time){ max_appear = -1;//최빈값 중복시 최빈값 -1로 변경 } if(counters[i] > appear_time){ appear_time = counters[i]; //최빈값 등장시 최빈량 저장 max_appear = i; //최빈값 저장 } } console.log(counters); var answer = max_appear; return answer; }
짝수는 싫어요
- 문제링크
function solution(n) { var answer = []; for(i=1; i<=n; i+=2){ answer.push(i); } console.log(answer); return answer; }
Javascript Reduce를 이용한 배열의 모든 숫자 더하기
var numbers = {1,2,3,4,5};
var sum = numbers.reduce((a,b) => (a+b));
배열 뒤집기
num_list.sort((a, b) => -1);
return num_list.reverse();
문자열 뒤집기
function solution(my_string) {
var strings = my_string.split('').reverse();
var answer = strings.reduce((a,b) => (a+b));
return answer;
}
var answer = [...my_string].reverse().join(""); //스프레드문법
문자 반복하기
function solution(my_string, n) {
var answer = [...my_string].map(v => v.repeat(n)).join("");
console.log(answer);
return answer;
}
문자열 치환하기
function solution(my_string, letter) {
const re = new RegExp(`${letter}`, 'g');
var answer = my_string.replace(re,"");
return answer;
}
my_string.replaceAll(letter, "");
- 문제링크
function solution(numbers, num1, num2) { var str = numbers.join(''); //하나의 문자열로 합시기 var new_str = str.substr(num1,num2-num1+1); //시작인덱스와 끝인덱스 문자만 자르기 var answer = new_str.split(''); //각문자를 배열로 변환 answer = answer.map(Number); //배열에 들어간 각각의 문자열을 숫자로 치환 answer = answer.map(x => Number(x)); //상동 return answer; //2가지 케이스에 대한 테스트 실패가 나옴 }
function solution(numbers, num1, num2) { var answer = numbers.slice(num1,num2+1); return answer; }
.slice, .splice
- splice(start, deleteCount)
- slice(begin, end)
- splice 메소드는 기존 배열에 영향을 주지만 slice 메소드는 기존 배열에 영향을 주지않습니다
*문제링크
var rank = [...emergency];
rank.sort((a,b) => b-a);
answer = emergency.map((x) => rank.indexOf(x)+1);
return answer;
어떠한 숫자를 이루는 약수의 개수 == 순서쌍
- 문제링크
function solution(n) { var answer = 1; for(var i=0; i<n; i++){ if(n%i == 0)answer++; } return answer; }
모스부호 치환
- 문제링크
function solution(letter) { morse = { '.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f', '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l', '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r', '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x', '-.--':'y','--..':'z' } var arr = letter.split(" "); for(var i=0; i<arr.length; i++){ arr[i] = morse[arr[i]]; } var answer = arr.join(""); return answer; }
letter.split(' ').map(v=>morse[v]).join('');
return letter.split(' ').reduce((prev, curr) => prev + morse[curr], '')
가위바위보 - 글자 치환
- 삼항연산자 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Conditional_Operator
- 문제링크
function solution(rsp) { var arr = rsp.split(""); arr = arr.map((x) => x==2 ? 0 : x==0 ? 5 : 2); var answer = arr.join(""); return answer; }
경우의 수 계산 - 팩토리얼
- 문제링크
function solution(balls, share) { //balls!/(balls-share)!*share! console.log(fectorial(2)); var answer = Math.round(fectorial(balls)/(fectorial(balls-share)*fectorial(share))); return answer; } function fectorial(num){ if (num < 0){ return -1; }else if(num==0){ return 1; } else { return num*fectorial(num-1); } }
- Math.round는 왜? 부동소숫점 오류 - https://joooing.tistory.com/entry/Javascript-%EC%86%8C%EC%88%98%EC%A0%90floating-point-%EA%B3%84%EC%82%B0-%EC%98%A4%EB%A5%98
구조 분해
function solution(dot) {
const [num,num2] = dot;
const check = num * num2 > 0;
return num > 0 ? (check ? 1 : 4) : (check ? 3 : 2);
}
배열에 갑추가, 빼기
- .push() : 배열의 맨 끝에 값을 추가한다.
- .unshift() : 배열의 맨 앞에 값을 추가한다.
##배열에 값을 제거하는 함수
- .pop() : 배열의 맨 끝에 값을 제거한다.
- .shift() : 배열의 맨 앞에 값을 제거한다.
정규표현식
- [^0-9] : 숫자가 아니면
- [0-9] : 숫자면
- [\d] : desimal 이면
- [^\d] : desimal 아니면
- [a-zA-Z] : 영문이면
- [^a-zA-Z] : 영문이 아니면
소인수 분해 하기
- 문제링크
function solution(n) { var arr = []; for(var i=2; i<=n; i++){ if(n%i==0){ arr.push(i); //소인수 입력 n=n/i; //소인수값으로 나눔 i--; //값이 나누어 떨어지면 재시도 } } arr = arr.filter((v, i) => arr.indexOf(v) === i) //중복제거 var answer = arr; return answer; }
function prime_factor(n){
var arr = [];
for(var i=2; i<=n; i++){
if(n%i==0){
arr.push(i); //소인수 입력
n=n/i; //소인수값으로 나눔
i--; //값이 나누어 떨어지면 재시도
}
}
arr = arr.filter((v, i) => arr.indexOf(v) === i)
//중복제거
return arr;
}
- 컨트럴 제트
- 문제링크
function solution(s) { var ss = s.split(" "); var keep = ss[0]; var answer = ss.reduce((a,b) => { if(b!="Z"){ a = Number(a); b = Number(b); keep = b; return (a+b); }else{ a = Number(a); return (a-keep); } }); return answer; }
- 테스트케이스 678번 실패
function solution(s) { var ss = s.split(" ").map(Number); var answer = ss.reduce((acc,current,index,arr) => !isNaN(current)?acc+current:acc-arr[index-1]); return answer; }
-
keep이라고 해서 숫자를 저장하는 방식이 문제였나 본데
reduce
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
- 매개변수
arr.rebuce((accumulator,currentValue,currentIndex,array)=>{return 연산후값},initialValue);
arr.rebuce((acc,current,index,arr)=>{return 연산후값},init);
- callbackFn : 배열의 각 요소에 실행할 함수
- accumulator : 이전 호출의 결과값
- currentValue : 현재 요소의 값
- currentIndex : 배열에서 인덱스 위치
- array : 배열
- initialValue : 콜백이 처음 호출될 때 초기화되는 값
369
- 문제링크
function solution(order) { var arr = order.toString().split(''); console.log(arr); var answer = arr.reduce((a,b) => a+(b==3)+(b==6)+(b==9), 0); return answer; }
- 숫자에 블린을 덧셈해서 카운트에 사용하기도 하네
아스키코드
- 참고 링크 : https://developer-talk.tistory.com/880
문자열.charCodeAt(0); //0번째 글자의 아스키코드 반환 String.fromCharCode(); //UTF-16코드를 문자로 반환 문자열.codePointAt(); //charCodeAt과 유사하나 표현할수 있는 정수의 범위가 더 크다 String.fromCodePoint(code1,code2 ... codeN); //지정된 코드 포인트 시퀀스를 문자열로 변환
필터
function solution(n, numlist) {
var answer = numlist.filter(x => x%n==0);
return answer;
}
자릿수 더하기
- 문제링크
function solution(n) { var arr = [...n.toString()]; var answer = arr.reduce((a,b)=>Number(a)+Number(b)); return answer; }
- 에러 : reduce에 초기값이 없음으로 초기값이 string으로 시작됨
arr.reduce((a,b)=>Number(a)+Number(b),0);
으로 초기값을 잡고 시작하거나 arr을 map(Number)하여 숫자로 변환 후 사용
문자열 검사
- 문제링크
function solution(str1, str2) { var regex = new RegExp(`${str2}`, 'g'); var answer = regex.test(str1)?1:2; return answer; }
제곱근 정수 판별
function solution(n) {
var sqrt = Math.sqrt(n);
var answer = sqrt==Math.floor(sqrt)?1:2;
return answer;
}
문자열 치환
- 문제링크
function solution(s) { var answer = s.toLowerCase(); var regex = /^\w| \w/g; //문자로 시작하거나(|)스페이스가 앞에 붙은 문자 answer = answer.replaceAll(regex,function(v){ return v.toUpperCase(); }); return answer; }
괄호
- 문제링크
function solution(s){ var regex = /\(\)/gm; while(regex.test(s)){ s = s.replaceAll(regex,""); } return s.length == 0; }
- 리플레이스로 해결하려하니 효율성 테스트에서 실패
function solution(s){
var arr = [...s];
var counter = arr.reduce((a,b)=>b==")"?a-1:a+1,0);
return counter==0 && arr[0]=="(";
}
- 플러스마이너스 0이고 (로 시작한다면. 통과
- 갯수만 가지고는 안되나? ())(() 반례
function solution(s){
var arr = [...s];
var counter = arr.reduce((a,b)=>b=="("?a+1:a>0?a-1:a-100,0);
console.log(counter);
return counter == 0;
}
- 시간초과
- 테스트 17 〉 통과 (2.21ms, 33.5MB)
- 테스트 18 〉 통과 (3.40ms, 33.5MB)
function solution(s){ var arr = [...s]; var counter = 0; for(var i=0; i<arr.length; i++){ counter = arr[i]=="("?counter+1:counter>0?counter-1:counter-100 } console.log(counter); return counter == 0; }
- 같은내용을 reduce가 아닌 for로 돌려서 해결
- 테스트 17 〉 통과 (2.25ms, 33.6MB)
- 테스트 18 〉 통과 (3.30ms, 33.5MB)
- 테스트 케이스에서는 차이가 별로 안나는데.
문자의 사용 만족
function solution(spell, dic) {
var answer = 0;
var exist = true;
for(var i=0;i<dic.length; i++){
if(dic[i].length != spell.length) continue; //글자수가 안맞으면 넘어가
console.log(dic[i]);
exist = true;
for(var j=0; j<spell.length; j++){
dic[i] = dic[i].replace(spell[j],"");
if(dic[i].length != spell.length-1-j){ //두개이상 지워지면 넘어가
exist = false;
break;
}
}
if(exist)return 1;
}
return 2;
}
function solution(p, d) {
return d.some(s => p.sort().toString() == [...s].sort().toString()) ? 1 : 2;
}
fill
- arr3.fill(‘A’, 1, 3);
- 인덱스 1부터 3 까지 ‘A’로 채움
등수매기기
- 문제링크
function solution(score) { var i=0; score = score.map(function(v){return (v[0]+v[1])/2;}); //평균내기 var arr = [...score]; arr.sort((a,b)=>b-a); //등수내기 console.log(arr); var answer = score.map(v => arr.indexOf(v)+1); //현점수가 몇순위인지 확인하여 배열에 넣기 return answer; }
십진수 이진수
function solution(bin1, bin2) {
var de1 = parseInt(bin1, 2); //2진수를 10진수로
var de2 = parseInt(bin2, 2);
console.log(de1);
console.log(de2);
var answer = (de1+de2).toString(2); //10진수를 2진수로
return answer;
}
배열의 비교
const equals = (a, b) => a.length === b.length && a.every((v, i) => v === b[i]);
function solution(before, after) {
var arr1 = [...before];
var arr2 = [...after];
arr1 = arr1.sort();
arr2 = arr2.sort();
console.log(arr1);
console.log(arr2);
var answer = equals(arr1, arr2);
return answer;
}
문자열내 포함여부
- String.indexOf(): 문자열에 어떤 문자열이 포함되어있는지 확인
- String.includes(): 문자열에 어떤 문자열이 포함되어 있는지 확인
- String.startsWith(), String.endsWith(): 문자열이 어떤 문자열로 시작하거나 끝나는지 확인