고양이와 코딩

[프로그래머스] 10월 22일 ~ 본문

javascript

[프로그래머스] 10월 22일 ~

ovovvvvv 2023. 10. 23. 15:32
728x90

10월 22일

문제1

 

내 코드 

function solution(score) {
    var answer = [];
    
    for (var i=0; i < score.length; i++){
        var avg = (score[i][0] + score[i][1]) / 2
        answer.push(avg)
    }
    
    const sortedAnswer = [...answer].sort((a,b) => b - a);
    
    const rank = answer.map(value => sortedAnswer.indexOf(value) + 1);
        
    return rank;
}

헤맸던것 !!!

→ 내림차순으로 정렬 한 뒤 순위를 매기는 부분에서 "기존 배열에서 순위" 를 매기는 부분을 헤맸다.

기존 배열인 answer를 기반으로 순위를 생성하는 코드를 짰다!

 

1. 각 배열의 평균을 계산

2. 평균값을 내림차순으로 정렬

3. 원래 배열의 각 요소에 대한 순위 계산

 

 

10월 23일

문제 1

오답

function solution(babbling) {
    const words = ["aya", "ye", "woo", "ma"];
    let answer = 0;

    for (let i = 0; i < babbling.length; i++) {
        let current = babbling[i];
        

        for (let j = 0; j < words.length; j++) {
            while (current.includes(words[j])) {
                  // 해당 발음을 제거
                current = current.replace(words[j], ''); 
            }
        }

        if (current.length === 0 ) {
            // 모든 발음을 조합하여 문자열을 만들 수 있으면
            answer++;
        }
    }

    return answer;
}

처음에 코드를 이렇게 넣어줬더니 첫 번째 테스트 케이스에서 오류가 발생했다.

오류를 따라가보니 "wyeoo"에서 for문을 돌며 먼저 "ye"를 공백으로 치환하면 "woo"가 남아서 또 word에 포함되기 때문이다!!

 

그래서 공백 대신 다른 문자로 치환해 주고 ('-') for문을 빠져나와서 '-'로 치환 해 준 문자열을 다시 공백으로 바꿔 준 뒤

길이가 0인 경우 (모든 발음이 조합된 경우) answer을 증가시켜 준다.

 

최종 코드

function solution(babbling) {
    const words = ["aya", "ye", "woo", "ma"];
    let answer = 0;

    for (let i = 0; i < babbling.length; i++) {
        let current = babbling[i];
        

        for (let j = 0; j < words.length; j++) {
            while (current.includes(words[j])) {
                  // 해당 발음을 제거
                current = current.replace(words[j], '-'); 
            }
        }
    
        current = current.replace(/-/g, "");    
        if (current.length === 0) {
            // 모든 발음을 조합하여 문자열을 만들 수 있으면
            answer++;
        }
    }

    return answer;
}

 

문제 2

코드

function solution(id_pw, db) {
    var answer = '';
    
    for (let i = 0; i < db.length; i++) {
        const array = db[i]
        
        for (let j = 0; j < array.length; j++){
          if(id_pw[0] == array[0] && id_pw[1] == array[1]){
              return "login";
          } else if(id_pw[0] == array[0] && id_pw[1] != array[1]){
              return "wrong pw";
         }
          
        }
        
    }
    return "fail";

}

주의해야 할 점은 "fail"을 출력하는 return 문을 이중 반복문 밖으로 옮겨야 한다는 것이다.

반복문 안에 있으면 첫 번째 요소에서 아이디가 다르면 바로 fail이 출력되기 때문!

 

그리 효율적인 코드는 아니여서 다른 사람들의 코드도 보았다.

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';
}

db배열을 기반으로 한 Map객체를 생성한다!! 여기서 Map객체는 아이디를 키로, 패스워드를 값으로 매핑

map.has(id) : map 객체에서 입력된 아이디 'id'가 존재하는지 확인하고,존재하면 true를 존재하지 않으면 false를 반환한다.

map.get(id) : map 객체에서 입력된 아이디 'id'에 대해 저장된 패스워드를 가져온다

map.get(id) === pw ? 'login' : 'wrong pw' 가져온 패스워드와 입력된 패스워드를 비교 후 일치하면 login 반환, 불일치하면 wrong pw 반환.

mmap.has(id)가 false인 경우 fail반환

 

난 아직 멀어따.....

 

 

10월 24일

문제 1

내 코드

function solution(chicken) {
    var coupon = chicken;
    var service_chicken = 0;
    
    while (coupon >= 10) {
        service_chicken += Math.floor(coupon / 10);
        coupon = Math.floor(coupon / 10) + coupon % 10;
    }
    return service_chicken;
}

처음에는 left_coupon이랑 chicken의 수도 다 변수로 만들어서 이상하게 관리를 했는데

곰곰히 생각해보니 그럴필요가 없다는걸 알았다..

coupon의 수가 10개 이상일때까지 while문을 반복하고 서비스 치킨의 수를 정수만 포함해서 coupon / 10한 결과를 계속 더해주고,

coupon의 수를 구하고 + left_coupon역할을 하는 남은 쿠폰도 coupon % 10으로 따로 더해준다.

 

어렵진 않은데 머리가 빙빙 도는 문제!! 합리적으로 생각하기

 

 

10월 25일

문제 1

 

내 코드

function solution(bin1, bin2) {
    var bin1 = parseInt(bin1, 2);
    var bin2 = parseInt(bin2, 2);
    var temp = bin1 + bin2;
    
    const answer = temp.toString(2);
    
    return answer;
}

2진수 상태에서 더하려는 생각을 잠깐 했지만.. 2진수 -> 10진수 변환 후 덧셈 

그리고 다시 10진수 -> 2진수 변환을 하면 간단하다.

내 코드가 깔끔하진 않지만 ㅎㅎ

 

문제 2

 

틀린 코드

function solution(i, j, k) {
    let count = 0;
    
    for (x = i; x <= j; x++) {
        if(String(x).includes(String(k))) {
            count++
        }
    }
    return count;
}

처음 제출한 코드는 몇몇 테스트케이스를 통과하지 못했는데, 11처럼 1이 두 번 들어가는 경우(k가 중복되는 경우)

에 대한 처리를 해주지 않아서이다. 그런데 includes는 문자열이 포함되어 있는지만을 확인하는거라 중복을 체크할 수 없다.

그래서 정규표현식을 사용해서 문제를 다시 풀었당

 

function solution(i, j, k) {
    let count = 0;
    
    for (x = i; x <= j; x++) {
       const string_x = String(x);
       const regex = new RegExp(k, 'g');
        const matches = string_x.match(regex);
        
        if (matches) {
            count += matches.length;
        
        }
    }
    return count;
}

정규표현식 객체인 regex를 생성해서 g플래그로 전역 검색을 활성화하고, k를 모두 찾을 수 있게 한다.

match메서드를 사용하여 string_x문자열에서 regex패턴과 일치하는 모든 부분 문자열을 찾아서 matches에 저장한다!

if (matches) matches 배열이 비어있지 않은 경우!! == 일치하는 부분 문자열이 존재하는 경우

matches 배열의 길이를 count에 추가한다 ~