[알고리즘]프로그래머스 0단계 뽀개기(Day23)

HIHI JIN·2023년 4월 11일

알고리즘

목록 보기
26/29
post-thumbnail

Day 23

로그인 성공?

머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 id_pw와 회원들의 정보가 담긴 2차원 배열 db가 주어질 때, 다음과 같이 로그인 성공, 실패에 따른 메시지를 return하도록 solution 함수를 완성해주세요.

아이디와 비밀번호가 모두 일치하는 회원정보가 있으면 "login"을 return합니다.
로그인이 실패했을 때 아이디가 일치하는 회원이 없다면 “fail”를, 아이디는 일치하지만 비밀번호가 일치하는 회원이 없다면 “wrong pw”를 return 합니다.

//내 코드
function solution(id_pw, db) {
    let a=db.filter(v => v[0]===id_pw[0]);
    let b=a.filter(v => v[1]===id_pw[1]);
    return b.length>0 ? "login":a.length>0 ? "wrong pw":"fail";
}

등수 매기기

영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.

//내 코드
function solution(score) {
    //score의 각 요소 평균 내기
    score = score.map(v => (v[0]+v[1])/2);
    let num=1;//등수
    let result = [];//등수가 담길 결과값
    
    //점수인 요소를 등수로 바꾸는 반복문
    //차례대로 처음 값이 다음값보다 작으면 등수+1, 등수 매길때마다 1로 초기화
    for(let i of score){
        for(let j=0; j<score.length; j++){
            if(i<score[j]) num++;
        }
        result.push(num);
        num=1; //1로 초기화
    }
    return result;
}

//다른 사람 코드
function solution(score) {
  return score.map((el) => {
    return (
      score.filter((v) => (v[0] + v[1]) / 2 > (el[0] + el[1]) / 2).length + 1
    );
  });
}
//순위 매기기 방식은 자기보다 점수가 높은 사람 수 + 1 
//자기보다 점수 높은 사람을 score.filter로 배열에 넣고
//그 배열의 길이를 구하고, +1은 자기자신
//그럼 등수로 치환된 배열만 남는다.

//또 다른 사람 코드
function solution(score) {
    let avg = score.map(v=>(v[0]+v[1])/2);//각 요소 평균 구하기
    let sorted = avg.slice().sort((a,b)=>b-a);//배열 복제하고 오름차순 정렬 = 큰 수부터 차례로 정렬
    return avg.map(v=>sorted.indexOf(v)+1);
}
//indexOf가 처음의 인덱스를 반영하는 걸 기준으로 등수매기기
//각 점수를 정렬한 배열의 인덱스로 찾고, 인덱스는 0부터시작이므로 +1을 해주고 점수를 등수로 치환한다.

특이한 정렬

정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.

//내 코드
function solution(numlist, n) {
    return numlist.sort((a,b) => {
        const [aNum, bNum] = [Math.abs(a-n), Math.abs(b-n)];//각요소와 n을 뺀 절대값 정의
        if(aNum===bNum) return b-a; //뺀값이 같다면 더 큰수를 우선배치하는 내림차순 정렬
        return aNum-bNum; //다르다면 뺀값 기준 작은 것이 먼저 오는 오름차순 정렬
    })
}

//다른 사람 코드
function solution(numlist, n) {
  return numlist.sort((a, b) => Math.abs(a - n) - Math.abs(b - n) || b - a);
}
//Math.abs(a - n) - Math.abs(b - n)가 0이라면 두 차이 값이 같다는 것이므로 false인 두번째 코드 b-a를 실행하고
//Math.abs(a - n) - Math.abs(b - n)가 0이 아니라면 두 차이 값이 다르다는 것이므로 차이가 더 적은 a-b 코드를 실행한다.

옹알이

//내 코드
function solution(babbling) {
    let babblingArr = ["aya", "ye", "woo", "ma"];
    let word = "";
    let answer = 0;

    for(var i=0; i<babbling.length; i++) {
        word = babbling[i];
        for(var j=0; j<babblingArr.length; j++) {
            //babblingArr의 요소들을 word에서 찾아 공백으로 바꿔준다
            word = word.replaceAll(babblingArr[j], ' ');    
        }
        //word의 양옆의 공백을 제거한 후의 길이가 0인것만 count
        //만약 중간 공백도 제거하면 "wyeoo"의 경우 count하면 안되는데, 되버린다
        if( word.trim().length == 0) {
            answer++;
        }
    }
    return answer;
}

//다른 사람 코드
function solution(babbling) {
  var answer = 0;
  const regex = /^(aya|ye|woo|ma)+$/;

  babbling.forEach(word => {
    if (regex.test(word)) answer++;  
  })

  return answer;
}
//정규식으로 test하면 방법
//regex는 aya,ye,woo,ma가 있는데 word가 regex에 있는 것들로 만들 수 있으면 카운트
profile
신입 프론트엔드 웹 개발자입니다.

0개의 댓글