알고리즘 스터디 4일차 - 문제 풀이(Javascript)

싱클베어·2022년 1월 17일
0

algorithm

목록 보기
4/6
post-custom-banner

아래 3개의 문제에 대해 문제 풀이를 작성하였습니다.

프로그래머스 - 연습문제 - 하샤드 수
프로그래머스 - 연습문제 - 같은 숫자는 싫어
프로그래머스 - 완전탐색 - 모의고사


1. 하샤드 수 (q28)


문제 설명

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

제한 조건

x는 1 이상, 10000 이하인 정수입니다.

예시

입력

  • arr : 10
  • arr : 12
  • arr : 11
  • arr : 13

출력

  • true
  • true
  • false
  • false
  • 입출력 예#1 : 10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다.
  • 입출력 예#2 : 12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다.
  • 입출력 예#3 : 11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다.
  • 입출력 예#4 : 13의 모든 자릿수의 합은 4입니다. 13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.

나의 풀이

function solution(x) {
    var answer = true;
    let number = x;
    let divisor = 0;
    
    //n=123 -> ['1','2','3']
    console.log(number); // 123
    console.log(number + ''); // '123'
    console.log(typeof(x + '')); // string
    
    function intTostrarray(number) {
        return (number + '').split(''); // (number + '')를 배열에 한 글자씩 나눠 저장
    }
    
    let nArray = new Array();
    nArray = intTostrarray(number);
    console.log(nArray); // ['1', '2', '3']
    // 초기값 0부터 시작, parseInt(number) 를 배열 처음부터 순차적으로 더한 값을 리턴
    divisor = nArray.reduce((accumulator, number) => accumulator + parseInt(number),0);
    
    answer = number%divisor==0 ? true : false;
    console.log(answer);
    return answer;
}

자릿수 더하기에 있던 내용을 거의 그대로 가져다 쓰고, 그 방식을 바탕으로 나눗셈을 진행하여 결과를 반환한다.

다른사람의 풀이

function solution(n) {
    const waterMelon = n =>'수박'.repeat(n/2) + (n%2 === 1 ? '수' : '');
    var answer = waterMelon(n);
    return answer;
}

작성 필요


2. 같은 숫자는 싫어 (q31)


문제 설명

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,

  • arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
  • arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
    배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

제한 조건

  • 배열 arr의 크기 : 1,000,000 이하의 자연수
    배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

예시

입력
arr = [1,1,3,3,0,1,1] , [4,4,4,3,3]

출력
answer = [1,3,0,1] , [4,3]


나의 풀이

function solution(arr){
    var answer = [];
    for (let i = 0; i < arr.length; i++){
        // arr[i] 값과 arr[i+1] 값이 다른경우는, 
        // arr[i], arr[i-1] ... 이하 인덱스의 값이 이미 전부 같은 숫자였거나 최초로 나온 수라고 볼 수 있으므로
        if (arr[i] !== arr[i+1]){ 
            answer.push(arr[i]); // 그대로 추가
        }
    }
        return answer;        
}

전체 배열을 순회하며 중복을 체크할 필요는 없어서, 양옆끼리만 비교한 후, i번째와 i+1번째의 배열값 비교에서 다른 경우가 발생하면 answer 배열 끝에 넣어준다.

다른사람의 풀이

function getDayName(a,b){
  var dayList = ['FRI','SAT','SUN','MON','TUE','WED','THU'];
 

분석 필요..

3. 모의고사 (q34)


문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.
1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 조건

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

예시

입력
answers : [1,2,3,4,5] , [1,3,2,4,2]

출력
return : [1], [1,2,3]

  • 입출력 예#1 :
    수포자 1은 모든 문제를 맞혔습니다.
    수포자 2는 모든 문제를 틀렸습니다.
    수포자 3은 모든 문제를 틀렸습니다.
    따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.
  • 입출력 예#2 : 모든 사람이 2문제씩을 맞췄습니다.

나의 풀이

function solution(answers) {
    var answer = [];
    let oneArray = [1,2,3,4,5];
    let twoArray = [2,1,2,3,2,4,2,5];
    let threeArray = [3,3,1,1,2,2,4,4,5,5];
    let oneScore = 0;
    let twoScore = 0;
    let threeScore = 0;
    // 각 배열끼리 비교하여 일치하는경우 (문제를 맞춘 경우) 각 score값 증가
    for (let i=0; i<answers.length; i++){
        // answers.length = 문제수, 해당 i 값에 관계없이 배열은 
        // i%OneArray.length 로 나눈 나머지만큼 반복되므로..
        if (oneArray[i%oneArray.length] == answers[i]){ 
            oneScore+=1;
        }
        if (twoArray[i%twoArray.length] == answers[i]){
            twoScore+=1;
        }
        if (threeArray[i%threeArray.length] == answers[i]){
            threeScore+=1;
        }
    }
    
    // score 값으로 수포자들 순위 정렬
    var result = (oneScore > twoScore) ? oneScore : twoScore;
    var big_result = (threeScore > result) ? threeScore : result; // 수포자들 중 가장 높은 점수
    if (oneScore == big_result){
        answer.push(1);
    } 
    if (twoScore == big_result){
        answer.push(2);
    }
    if (threeScore == big_result){
        answer.push(3);
    }
    
    
    return answer;
}

시험은 최대 10,000문제로 구성되어있다고 해서, 시험 문제 자체가 10,000문제 인줄 알고 처음엔 최소공배수 관련한 내용을 계속 찾아보았다. 그래서 수포자가 찍는방식 5,8,10의 최소공배수 40을 잡았는데.. 그냥 answers 배열이 문제 수였다. 문제를 제대로 읽자.

다른 사람의 풀이

function solution(s){
    return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length;
}

작성중 ...

참고 URL

  1. 하샤드 수

    MDN - Array.prototype.push()

  1. 같은 숫자는 싫어
  1. 모의고사
profile
안녕하세요.
post-custom-banner

0개의 댓글