수학 응용 (1) (Day 19-20)
[프로그래머스] 일일 도전 과제 문제 풀이 정리입니다.
관련 개념도 첨부하였으니 필요한 분들은 참고하세요.
코딩 기초 트레이닝, 코딩테스트 입문 문제를 Day별로 풀고 정리한 내용입니다.
✨Day 19-20
문자열, 배열, 조건문, 수학, 시뮬레이션, 문자열, 사칙연산
목표: 수학 응용
-
배열 생성/초기화
fill❇️ 배열 채우기 | 원본 변경
push/pop💚 요소 추가 | 원본 변경new Set(): 배열 중복 제거 -
문자열 검색/확인
includes🔍 문자열 포함 여부 확인
match🔍 정규식으로 일치하는 부분 검색 -
수학
Math.pow,2 ** x: 거듭제곱
Math.log2: 2를 밑으로 한 로그
Math.floor: 소수 내림
Math.ceil: 소수 올림
Math.abs: 절댓값
볼만한 코드 문제들만 가져왔습니다.!
입문
잘라서 배열로 저장하기
function solution(my_str, n) {
const answer = [];
[...my_str].forEach((_, idx)=> {
if(idx%n===n-1) {
answer.push(my_str.slice(idx+1-n, idx+1));
}
else if(idx===my_str.length-1){
answer.push(my_str.slice(idx-(my_str.length%n)+1, my_str.length))
}
})
return answer;
}
function solution(my_str, n) {
return my_str.match(new RegExp(`.{1,${n}}`, "g"));
}
🍞 정규표현식사용 {찾는것 처음, 찾는것 끝}
캐릭터의 좌표
const ops = {
"left" : [-1, 0],
"right" : [1, 0],
"up" : [0, 1],
"down" : [0, -1],
}
function solution(keyinput, board) {
let sum = [0, 0];
const [w, h] = board
keyinput.map((v)=> ops[v]).forEach(([x,y])=>{
sum[0] += x;
sum[1] += y;
if(sum[0]>(w-1)/2) sum[0]--;
else if(sum[0]<(w-1)/2*-1) sum[0]++;
if(sum[1]>(h-1)/2) sum[1]--;
else if(sum[1]<(h-1)/2*-1) sum[1]++;
})
return sum;
}
🍞 ops 객체로 좌표를 정의
🍞 이동 -> 초과 확인 -> 되돌리기
function solution(keyinput, board) {
let res = [0,0];
for (let p of keyinput) {
switch(p){
case 'left': if (-res[0] < board[0]/2-1) res[0]--; break;
case 'right': if (res[0] < board[0]/2-1) res[0]++; break;
case 'up': if (res[1] < board[1]/2-1) res[1]++; break;
case 'down': if (-res[1] < board[1]/2-1) res[1]--; break;
}
}
return res;
}
🍞 switch 문으로 방향마다 처리
🍞 이동 전에 범위 조건 검사
function solution(keyinput, board) {
let key = {"right" : [1,0], "up" : [0,1], "down" : [0,-1], "left" : [-1,0]};
let rslt = keyinput.map(v => key[v]).reduce((a,b) => {
if (Math.abs(a[0] + b[0]) > board[0]/2 || Math.abs(a[1] + b[1]) > board[1]/2)
return [a[0],a[1]] ;
return [a[0] + b[0], a[1] + b[1]];}
, [0,0])
return rslt;
}
🍞 map 으로 방향을 좌표로 바꾸고
🍞 reduce 로 누적하면서 이동 : 좌표 '절댓값'이 보드 절반 크기를 초과하면 이동하지 않음
다항식 더하기
function solution(polynomial) {
let a=0, b=0
polynomial.split(' + ').forEach((v)=>{
if(v.includes('x')) a += Number(v.slice(0,v.indexOf('x'))) || 1
else b += Number(v)
})
return b ?
a ? a===1 ? `x + ${b}` : `${a}x + ${b}`
: `${b}` :
a===1 ? `x` : `${a}x`
}
🍞 + 기준으로 잘라서 항별로 배열 생성
🍞 x 있으면 숫자부분만 숫자로 -> 숫자가 없으면 1
기초
세 개의 구분자
function solution(myStr) {
let array = [];
array = myStr.split(/[abc]/).filter((v)=>v)
return array.length>0 ? array : ["EMPTY"]
}
🍞 a,b,c 를 기준으로 split
🍞 filter 로 빈 문자열 없애기
const solution(s){
return s.match(/[^a-c]+/g)||['EMPTY']
}
🍞 match : 문자열이 정규식과 매치되는 부분을 검색
🍞 match : ^a-c a~c가 아닌~~
배열의 원소만큼 추가하기
function solution(arr) {
const answer = [];
arr.forEach((v)=> {
for(let i=0;i<v;i++){
answer.push(v)
}
})
return answer
}
🍞 forEach : 각 원소에 대해 for문으로 v번 push
function solution(arr) {
return arr.reduce((list, num) => [...list, ...new Array(num).fill(num)], []);
}