Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Kimyeongkyung

프로그래머스 알고리즘 정리(13-18번) 본문

알고리즘

프로그래머스 알고리즘 정리(13-18번)

yeongk0825 2022. 3. 15. 01:47

[quiz_13] 2016년

 

문제

 

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT

입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.

제한 조건

  • 2016년은 윤년입니다.
  • 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

풀이

 

function solution(a, b) {
    var answer = '';
    
    var Week = ["THU","FRI","SAT","SUN","MON","TUE","WED"];
    
    //1월부터 12월까지의 일자 나열
    var Day =[31,29,31,30,31,30,31,31,30,31,30,31];
    
    var sum = 0; //sum = 0으로 시작
    for(var i =0;i<a-1;i++){
        sum += Day[i];
    }
    sum += b;
    

    var when = (sum % 7);
     //116 % 7= 나머지 4
    answer = Week[when];
    //Week 배열의 index[4] 값은 = MON
    //4월 25일은 월요일
    return answer;
}

 

참고자료


    //for문
    //만약 (a, b)가 (4, 25) 이라면 3월까지의 값을 i에 넣고 돌림
    // i는 0부터 3까지 sum = sum + Day[i]에 들어가게 됨
    //(sum + Day[0]) + (sum + Day[1]) + (sum + Day[2]) +(sum + Day[3])
    
    //a-1을 해주는 이유? => Day[3]번째 값이 4월의 일자이기 때문에 일단 3월까지의 값은 건드릴게 없음.
    //1월-3월까지는 총 일수를 더하면 됨
    
    //따라서 현재까지 sum의 값은 3월 까지의 총 일수를 구해둔 상태.
    
    //4월 25일의 요일을 알아내려면
    //25일을 더해야함 => = b값
    //sum = sum + b
    
    //sum = {31(1월)+29(2월)+31(3월)} + 25 = 91 + 25 = 116
    
    이렇게 계산을 하고나면 내가 알고싶은 날짜까지의 총 일수가 나오게 됨
    나머지 연산인 % 사용
    1월 1일은 금요일
    
    요일이 총 7개니까 7로 나머지를 구했을때
    sum % 7 = 1이 나올경우 1일을 뜻하므로 금요일(FRI)이 나와야함
    
    index[1]이 금요일이라는 뜻이기 때문에 배열로 표현해보면
    목요일부터 시작하는 배열이 만들어짐

 

[quiz_14] 나누어 떨어지는 숫자 배열

 

문제

 

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.제한사항

  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다.
  • array는 길이 1 이상인 배열입니다.

풀이

 

function solution(arr, divisor) { //divisor은 자연수,나눌 값
    var answer = []; //빈 배열 하나 선언 => return할 배열임
    
    for(let i=0; i<arr.length;i++){ //arr 배열의 길이만큼 돌린다.
        if(arr[i] % divisor === 0){ //나눌 값을 넣었을때 나머지가 0이면 그것만 answer배열에 push
            answer.push(arr[i]) //빈배열 answer에 arr[i]값을 넣어서 추가 
        }
    }
    // console.log(answer.sort()) //오름차순 정렬
    
    if (answer.length === 0){ //answer의 길이가 0이면 = 나누어 떨어지는 인자가 하나도 없다면
        return[-1] //배열에 -1 담아서 반환
    }else{
        return answer.sort(function(a,b){return a-b}) //오름차순으로 정렬
    }
}

 

참고자료

 

[quiz_15] 내적

 

문제

 

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.

이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)

 

제한사항

  • a, b의 길이는 1 이상 1,000 이하입니다.
  • a, b의 모든 수는 -1,000 이상 1,000 이하입니다.

 

풀이

 

//내적 = 곱해서 더함
//a,b의 length값은 같다.
// n은 length의 길이를 의미함
//a=[1,2,3] b=[4,5,6] 

//n값은 3, 인덱스 값은 n-1이어야함 배열의 길이가 3이라는건 인덱스가 [0]~[2]까지라는 뜻

// a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1]
//a,b의 같은 인덱스값끼리 곱해서 더한뒤 return하면 됨

//reduce 메서드
// 배열의 합을 구할때 사용
    

1. for문 사용
function solution(a, b) {    
    var answer =0;  // answer = 0으로 선언
    for (var i = 0; i < a.length; i++) {
        //배열 a의 길이가 3이면 i값은 2까지 돌기때문에 0,1,2가 순서대로 들어감
        answer += a[i] * b[i]      
        
        //a와 b는 길이가 같고, 같은 index에 해당하는 숫자끼리 곱해서 더한 후 return하면 되므로 
        //만약 a=[1,2,3] b=[4,5,6] 이라면
        
        //answer은 (answer+ a[0]*b[0]) + (answer+ a[1]*b[1]) + (answer+ a[2]*b[2]) 가 들어가게됨
    }
    return answer;
}

출력값 => 정상출력

2. reduce 함수를 이용한 방법

 

2-1) 초기값을 넣지 않은 경우
 // 배열.reduce((누적값, 현잿값, 인덱스, 요소) => { return 결과 }, 초깃값);
 function solution(a, b) {
     answer = a.reduce((acc,cur,i) => acc += a[i]*b[i])
     // 초깃값을 지정하지 않으면 배열의 첫번째 값이 초깃값으로 지정된다.
    
     return answer;
}

 

출력값

입력값 [1, 2, 3], [4, 5, 6]
기댓값 32
실행 결과 실행한 결괏값 29이(가) 기댓값 32와(과) 다릅니다.

=> 일부가 오류나는걸 알 수 있음

2-2) 초기값을 넣은 경우
 function solution(a, b) {
     answer = a.reduce((acc,cur,i) => acc += a[i]*b[i], 0)
     // initialValue (Optional) : callback의 최초 호출에서 첫 번째 인수에 제공하는 값. 초기값을 제공하지 않으면 배열의 첫 번째 요소를 사용. 빈 배열에서 초기값 없이 reduce()를 호출하면 오류 발생
     return answer;
}

 

출력값

입력값 [1, 2, 3], [4, 5, 6]
기댓값 32
실행 결과 테스트를 통과하였습니다.

=>정상 출력

 

[quiz_16] 문자열 내 p와 y의 개수

 

문제

 

대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.

예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.

제한사항

  • 문자열 s의 길이 : 50 이하의 자연수
  • 문자열 s는 알파벳으로만 이루어져 있습니다.

 

 

풀이


function solution(s){
    var answer = true;
    s = s.toLowerCase();
    var p = s.match(/p/g);
    var y = s.match(/y/g);

    if(p===null){p=[];}
    if(y===null){y=[];}

    if(p.length!=y.length){answer = false;}
    return answer;
}
console.log(solution("원하는 문자열"));

 

참고자료

 

https://techtoart.tistory.com/34

 

 

프로그래머스 Level1 - 문자열 내 p와 y의 개수 (JavaScript)

처음에는 모든 문자열을 하나씩 비교하는 방법을 사용했습니다. function solution(s){ var answer = true; var p=0, y=0; for (var i in s){ if(s[i]=='p'){ p++; } if(s[i]=='y'){ y++; } } if(p!==y){answer =..

techtoart.tistory.com

 

[quiz_17] 문자열 다루기 기본

 

문제

 

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.제한 사항

  • s는 길이 1 이상, 길이 8 이하인 문자열입니다.

풀이

 

function solution(s) {
    if (!(s.length == 4 || s.length ==  6)){ //문자열의 길이가 4 or 6이 아닐경우
        return false; //false 반환
    } else { //그렇지 않으면
        const temp = s.split('') //temp 함수를 하나 선언하고 배열안에 인수들을 한 문자열로 만들어라
        for(let i =0;i<temp.length;i++){ //문자열의 길이까지 돌릴건데
            if (isNaN(temp[i])){ //temp배열안에 인수 중에 하나라도 숫자가 아닐경우 
                return false; //false 반환
            }
        }
    }
    return true; //모두 충족할 경우 true 반환
}

 

 

[quiz_18] 서울에서 김서방 찾기

 

문제

 

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.제한 사항

  • seoul은 길이 1 이상, 1000 이하인 배열입니다.
  • seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
  • "Kim"은 반드시 seoul 안에 포함되어 있습니다.

 

풀이

 

1. indexOf 메서드 사용

// seoul = string형 배열(문자열) = ["kim","Lee".....];
//배열안의 element(원소)의 수는 1개~1000개 사이 배열
//각 element(원소)의 길이는 1~20자 사이의 문자열 => 각 원소의 글자수가 20자를 안넘는다.

function solution(seoul) {
     return "김서방은 "+ seoul.indexOf("Kim")+"에 있다";
}

// string.indexOf(searchvalue, position)
// searchvalue : 필수 입력값, 찾을 문자열
// position : 선택, 기본값은 0, string에서 searchvalue를 찾기 시작할 위치
// 찾는 문자열이 없으면 -1을 리턴, 입력되지 않으면, position의 값은 0으로 처리됩니다.
// 문자열을 찾을 때 대소문자를 구분합니다
// 문자열 안에 문자는 소문자인데 대문자를 찾으려고 할 경우 -1 리턴


function solution(seoul){
    var where = 0;
    for(var i=0; i < seoul.length; i++){ //index값(i)를 seoul 배열의 길이(예시 => 4)만큼 돌리다가
        //예시로 얘기해보면 index[3]까지 돌리는 것.
        
        if(seoul[i] === 'Kim'){ //만약 배열 seoul 안에 Kim이 있다면 => 예시로 얘기하면 seoul[3]에 Kim이 있음. 
            where += i; //where = where + i => 변수 where에 i를 더해서 다시 그 값을 where에 넣어라
            //만약 Kim이 4번째에 있다면 where = 3이므로
            //멈춰라
        }
    }
    return "김서방은 " + where + "에 있다";
}

 

출력값

입력값 ["Lee", "Park", "Kim", "Kang"]
기댓값 "김서방은 2에 있다"
실행 결과 테스트를 통과하였습니다.

=>정상출력

 

 

 

 

'알고리즘' 카테고리의 다른 글

프로그래머스 알고리즘 정리(7-12번)  (0) 2022.03.14