본문으로 건너뛰기
/ Docs

조건문 활용 (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 개수 확인ㄴ