조건문 활용 (Day 23-24)
[프로그래머스] 일일 도전 과제 문제 풀이 정리입니다.
관련 개념도 첨부하였으니 필요한 분들은 참고하세요.
코딩 기초 트레이닝, 코딩테스트 입문 문제를 Day별로 풀고 정리한 내용입니다.
✨Day 23-24
입문 어려움~
목표: 조건문 활용
-
배열 순회
map✨ 각 요소를 변환해서 새 배열 반환
reduce✨ 하나의 누적된 값
filter✨ 조건을 통과한 요소만 새 배열 생성 -
문자열 치환/변환
replace🔄 문자열에서 첫번째 특정 패턴 치환
replaceAll🔄 문자열에서 모든 특정 패턴 치환 -
숫자 관련
parseInt(str, radix)문자열을 _진법의 정수로 변환
toString(radix)정수를 _진법의 문자열로 변환 -
기타
new Map()키-값 쌍
map.has(key)key가 있는지
map.get(key)key에 해당하는 값 가져오기
볼만한 코드 문제들만 가져왔습니다.!
기초
커피 심부름
function solution(order) {
return order.map((v)=> v.includes("cafelatte") ? 5000 : 4500).reduce((acc,cur)=> acc+cur,0)
}
🍞 map 배열 순회해서 'cafelatte' 포함하면 5000 아니면 4500
🍞 map 통해 나온 배열 요소들을 reduce로 합산
const solution(order) {
return order.reduce((acc, cur) => acc + (cur.includes('latte') ? 5000 : 4500), 0)
}
🍞 reduce 에서 바로 현재값 판단해서 합산
그림 확대
function solution(picture, k) {
const answer = [];
const rePicture = picture.map((v)=> [...v].map((val)=>val.repeat(k)).join(''))
for(let i=0;i<picture.length;i++){
for(let j=0;j<k;j++){
answer.push(rePicture[i])
}
}
return answer;
}
🍞 map 으로 문자를 k배로
🍞 for문으로 k번씩 추가
function solution(picture, k) {
var answer = [];
picture.forEach((line) => {
const expanded = [...line].reduce((acc, cur) => acc + cur.repeat(k), '');
for(let i=0; i<k; i++) answer.push(expanded);
});
return answer;
}
🍞 reduce 로 문자를 k배로
🍞 for 로 문자를 k배로
조건에 맞게 수열 변환하기 3
function solution(arr, k) {
return k%2 ? arr.map((v)=>v*k) : arr.map((v)=>v+k)
}
🍞 조건에 맞게 map으로 수열 변환하기
l로 만들기
function solution(myString) {
return [...myString].map((v)=> v.charCodeAt()<109 ? "l" : v).join('');
}
🍞 map에서 l보다 앞서는 문자를 l로
function solution(myString) {
return [...myString].map((v) => v < 'l' ? 'l' : v).join('');
}
🍞 map으로 아스키코드 안쓰고 문자 비교
const solution = myString => myString.replace(/[a-k]/g,'l')
🍞 replace로 a-k까지의 문자를 l로
특별한 이차원 배열 1
function solution(n) {
const answer = [];
for(let i=0;i<n;i++){
let subArr = Array(n).fill(0);
subArr[i] = 1;
answer.push(subArr)
}
return answer;
}
🍞 for n줄 -> subArr로 행 초기화 후 1넣기
function solution(n) {
const answer = Array.from(Array(n), () => Array(n).fill(0));
for (let i = 0; i < n; i++) {
answer[i][i] = 1;
}
return answer;
}
🍞 Array.from(~) 0으로 초기화한 2차원배열로 만든 후 [i][i]자리에 1넣기
입문
특이한 정렬
function solution(numlist, n) {
return numlist
.map((v)=> [Math.abs(n-v), v])
.sort((a,b)=> a[0]-b[0] || b[1]-a[1])
.map(([a,b])=> b)
}
🍞 map 으로 [차이, 수]
🍞 sort 기준을 가까운 수 오름차순, 같으면 큰 수 먼저
function solution(numlist, n) {
return numlist.sort((a, b) => Math.abs(a - n) - Math.abs(b - n) || b - a);
}
🍞 sort 기준을 가까운 수 오름차순, 같으면 큰 수 먼저
옹알이 (1)
function solution(babbling) {
return babbling.filter((v)=>v.replaceAll(/aya|ye|woo|ma/g, "").length===0).length
}
🍞 replaceAll 정규식으로 네가지 발음을 ""로 고침
function solution(babbling) {
var answer = 0;
const regex = /^(aya|ye|woo|ma)+$/;
babbling.forEach(word => {
if (regex.test(word)) answer++;
})
return answer;
}
🍞 test 주어진 문자열이 정규 표현식을 만족하는지 판별
로그인 성공?
function solution(id_pw, db) {
for(let i=0;i<db.length;i++){
if(db[i][0]===id_pw[0]){
if(db[i][1]===id_pw[1]) return "login"
else return "wrong pw"
}
}
return "fail"
}
🍞 for id 체크 -> pw 체크
function solution(id_pw, db) {
const [id, pw] = id_pw;
const map = new Map(db);
return map.has(id) ? (map.get(id) === pw ? 'login' : 'wrong pw') : 'fail';
}
🍞 new Map 키-값 쌍
🍞 map.has() 키에 해당하는 요소가 있는지 ?
🍞 map.get(key) Map 객체에서 키->값 반환.
🍞 즉 map을 만들고, map에 id가 있으면 map에서 pw와 같은지 확인하는 코드!
등수 매기기
function solution(score) {
const rank = score.map(([a,b],idx)=>[idx, a+b]).sort((a,b)=> b[1]-a[1]);
let last = rank[0];
rank[0].push(1);
for(let i=1;i<rank.length;i++){
if(rank[i][1]===last[1]) rank[i].push(last[2]);
else rank[i].push(i+1);
last = rank[i];
}
rank.sort((a, b) => a[0] - b[0]);
return rank.map(([a,b,c])=>c)
}
🍞 map으로 인덱스, 합산 점수 -> 합산 점수로 정렬한 뒤
🍞 rank[].push() 배열에 등수 추가해줌
🍞 다시 인덱스로 정렬한 뒤
🍞 등수 return ~
function solution(score) {
return score.map((el) => {
return (
score.filter((v) => (v[0] + v[1]) / 2 > (el[0] + el[1]) / 2).length + 1
);
});
}
🍞 filter로 전체 학생 중, 각 학생보다 점수가 높은 학생들 수
🍞 즉 등수 = 자기 보다 점수가 높은 학생 수 + 1
function solution(score) {
let avg = score.map(v=>(v[0]+v[1]));
let sorted = avg.slice().sort((a,b)=>b-a);
return avg.map(v=>sorted.indexOf(v)+1);
}
🍞 map 합산 점수
🍞 sort 로 점수 내림차순
🍞 map 각 점수가 내림차순 점수에서 몇번째인지 => 등수
치킨 쿠폰
function solution(chicken) {
let service = 0;
while(chicken>9){
service += Math.floor(chicken/10);
chicken = chicken%10 + Math.floor(chicken/10);
}
return service
}
function solution(chicken) {
var answer = parseInt((chicken-1) / 9);
return answer;
}
🍞 이렇게도..!
이진수 더하기
function solution(bin1, bin2) {
let i = bin1.length-1;
let j = bin2.length-1;
let c = 0;
const answer = [];
while(i>=0 || j>=0 || c){
const a = i >=0 ? Number(bin1[i]) : 0;
const b = j >=0 ? Number(bin2[j]) : 0;
const sum = a + b + c;
answer.push(sum%2);
c = Math.floor(sum/2)
i--; j--;
}
return answer.reverse().join('')
}
🍞 bin, bin2 뒤에서 돌면서 더해주는 코드
function solution(bin1, bin2) {
return (parseInt(bin1, 2) + parseInt(bin2, 2)).toString(2)
}
🍞 parseInt( , 2) 2진수 문자열을 10진수 정수로 변환
🍞 toString(2) 10진수 정수를 2진수 문자열로 변환
A를 B로 만들기
function solution(before, after) {
return +([...before].sort().join('') == [...after].sort().join(''))
}
🍞 둘다 정렬한 뒤 같은지 확인
k의 개수
function solution(i, j, k) {
let count = 0;
for(i;i<=j;i++){
count+= String(i).split(String(k)).length-1
}
return count
}
🍞 split(String(k)) 으로 k 개수 확인
function solution(i, j, k) {
let a ='';
for(i;i<=j;i++){
a += i;
}
return a.split(k).length-1;
}
🍞 i부터 j까지 문자열 합친 뒤 k 개수 확인ㄴ