ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] 항해 99 2주차 알고리즘 코딩테스트 회고록_3일차
    항해[TIL] 2021. 11. 11. 02:48

    Today I Learnd 

     

    (2021. 11. 10. 수)

     

     

    1.  2주차 3일차 소감

    오늘은 내 담당 문제 3문제를 풀었다. 중하로 오니까 조금 버거워진 것 같다. 3일차를 지나고보니까 문제 해결 능력과

    어떤 함수를 사용 해야하는지는 알겠다. 그런데 반복문이며, 조건문이며 여러가지를 시도해봤지만

    계속해서 답이 틀리면서, 결국에는 풀이를 참고를 해서 새로운 함수에 대해 배웠다.

    참 답답하면서도 새로운 것을 알아가는 재미가 있었고 담당 문제에 대해서 공부를 하면서 

    알고리즘을 풀 때도 많은 도움이 될 것 같다.

     

     

    2.  알고리즘 코딩테스트

     

     

     

    1. 프로그래머스 문제 '완주하지 못한 선수' _ 11월 10일

    // 문제 :수많은 마라톤 선수들이 마라톤에 참여하였습니다. 
    //       단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
    //       마라톤에 참여한 선수들의 이름이 담긴 배열 participant와
    //       완주한 선수들의 이름이 담긴 배열 completion이 주어질 때,
    //       완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
    
    // 제한사항 : 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
    //            completion의 길이는 participant의 길이보다 1 작습니다.
    //            참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
    //            참가자 중에는 동명이인이 있을 수 있습니다.
    
    
    
    function solution(participant, completion) {
        participant.sort() // 참여자 선수 배열 요소 정렬
        completion.sort()  // 완주자 선수 배열 요소 정렬
        // 이렇게 해주지 않으면 무조건 인덱스 0만 가져오기 때문에
        // 정렬을 해줘서 일치하는 것들을 제외한 나머지만 가져오게 .sort()를 써줬다.
    
        for (let i = 0; i < participant.length; i++) {
        // 참여한 선수들을 반복문을 사용해서 길이만큼 반복을 시켜줬다.
    
            if (participant[i] !== completion[i]) {
            // 두 매개변수가 일치하지 않다면이라는 조건문을 써줬다.
            // [i]를 넣어준 이유는 두 매개변수를 비교할 때 인덱스 0부터 순차적으로 비교해주기 위해서 이다.
                return participant[i]
                // 참여자 배열을 리턴
            }
        }
    }
    
    console.log(solution(["marina", "josipa", "nikola", "vinko", "filipa"], ["josipa", "filipa", "marina", "nikola"]))

     이 문제는 참여자 선수와 완주자 선수의 배열 요소를 먼저 정렬을 해줬다. 정렬을 하지 않고 터미널에 실행했을때 인덱스의 0만

    가져오는 현상을 발견해서 정렬을 먼저 해줬고, for문을 통해서 참여자 선수로 반복을 해주면서 참여자 선수가 완주한 선수와 일치 하지

    않으면  마지막에 참여자 선수의 반환값을 리턴을 시켜줘서 완주하지 못한 선수를 리턴할 수 있었다.

    이 부분은 어제 알아냈던 .sort()라는 함수로 정렬을 시도했더니 됐다. 확실히 반복하고 또 반복을 하니까 여러 도움이 돼서 흐뭇했다.

     

     

     

    2. 프로그래머스 문제 '자연수 뒤집기' _ 11월10일

    // 문제 : 자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요.
    //        예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
    
    // 제한 조건 : n은 10,000,000,000이하인 자연수입니다.
    
    
    
    function solution(n) {
        let answer = []
        // 숫자를 집어넣어주기 위해 answer라는 변수를 할당해서 대괄호를 비워뒀다.
    
        n = n + ''
        // 매개변수 n과 ''를 원하는 출력값으로 표현하기 위해서 위와 같이 정해줬다.
    
        for (let i = n.length - 1; i >= 0; i--) {
        // 이 반복문은 자연수를 뒤집기 위한 반복문이다.
        // i는 n의 길이의 마지막 인덱스로 정해주고
        // i가 마지막 인덱스에서 시작하기 때문에 0보다 크거나 같을 때 까지 i를 감소시켜주라고 했다.
            
            answer.push(Number(n[i]))
            // n + []로 끝낼 수 있다 생각했지만
            // 그렇게 되면 문자열 형식으로 나오기 때문에
            // Number()라는 함수를 사용해서 안에 매개변수 n에 i번째를 넣어줬다.
        }
        return answer
        //answer라는 변수를 반환값을 줘서 리턴해준다.
    }
    
    
    console.log(solution([12345]))
    // 터미널에서 출력값을 보면 원하는 입출력과 같이 나오는 걸 확인 할 수 있다.

    이 문제는 솔직히 내가 풀기에는 어려웠다... 매개변수 n에 문자열을 더해주는걸 생략했고 다 꼬이는 바람에 풀이를 보고

    직접 코드를 뜯어가면서 이해하기 위해서 주석처리를 해서 아래에다 코드를 이렇게 한 이유에대해서 정리를 해보았다.

    여러 반복을 통해서 내 것으로 가져오기를 노력해봐야겠다.

     

     

     

    3. 프로그래머스 문제 '제일 적은 수 제거하기' _ 11월10일

    // 문제 : 정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요.
    //        단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요.
    //        예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
    
    // 제한 조건 : arr은 길이 1 이상인 배열입니다.
    //             인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
    
    
    
    function solution(arr) {
        let answer = []
        // 배열을 넣기 위해서 대괄호 안을 비워 준 상태로 answer라는 변수를 할당해줬다.
        
        if (arr.length <= 1) {
            answer = [-1]
        // 조건문을 활용해서 arr의 길이가 index 1보다 작거나 같으면 -1을 리턴하라고 해줬다.
    
        } else {
            arr.splice(arr.indexOf(Math.min.apply(null. arr)),1)
            answer = arr
        // 제일 작은 수를 제거하기 위해서 spliece라는 함수를 사용해서 indexOf라는 함수를 start에 지정해줬고
        // 제일 작은 수를 찾기 위해서 indexOf라는 메서드 안에 Math.min와 apply를 넣어주고
        // 그 안에 매개변수를 넣어주는데 null이라고 넣어준 이유는 Math는 생성자가 없기 때문에
        // null을 넣어줬다. 또한 apply 숫자로 이루어진 배열을 매개변수로 전달할 수 있게 된다.
        // arr이라는 매개변수에 입력값이 들어오면 제일 작은 숫자를 제거해준다.
    
        // 위와 같은 작업을 마쳐서 반환값을 리턴할 때 나올 수 있도록
        // answer라는 변수 안에 arr이라는 매개변수를 넣어줬다. 
    
        } 
        
        return answer
    }
    
    console.log(solution([4,3,2,1]))
    console.log(solution([10]))
    
    // 터미널에서 출력해보면 입출력 예에서 원했었던 값이 나오는 것을 확인할 수 있다.
    
    
    // splice() = 객체의 참조를 유지한채 배열의 중간에있는 항목을 제거 또는 추가할 수 있다.
    //         ex) .splice(start : 인덱스 지정, deletecount : 시작 인덱스에서 몇개의 항목을 제거 또는 추가할지, 제거하거나 추가하고 싶은 문자열)
    
    // indexOf() = 문자열에서 원하는 문자열을 검색해서 찾거나, 배열에서 원하는 특정
    //             배열값의 존재여부 등을 확인할 수 있음. (찾은 값 첫번째 인덱스 위치를 반환해주고 없으면 -1을 리턴해준다.)
    
    // Math.min() = 숫자 집합 중 가장 작은 수를 리턴하는 것.
    
    // apply() : 호출할 함수의 매개변수들을 배열로 담아서 처리할 경우 사용한다.
    
    // null : 명시적으로 값이 비어있음을 나타낼 때 사용, 아무것도 참조하지 않고 있다는 의미.

    이 문제를 진짜 많이 공부했던 것 같다. 물론 내 코드는 아니다 풀이를 가져와서 코드를 뜯어보면서 의미를 적고 새로운 함수가 많아서

    이 함수가 왜 여기에 들어가 있고 뜻이 뭔지에 대해서 이해할 때 까지 시간은 3시간이 걸린 것 같다. Math가 생성자가 없어서 null을

    써줬다는데 솔직히 아직도 이해가 안간다. 다시 한 번 직접 코드를 적어보면서  있고 없고의 차이를 재봤지만 잘 모르겠다..

    반복하고 또  열심히 반복을 해봐야겠다.

     

     

     

    4. 부족한 점

    오늘은 스스로의 약속을 5문제 풀기로 약속을 했었다. 그런데 실행에 옮기지 못했다. 하면 할 수 있었겠지만,

    이 세 문제에 대해서 너무 많은 에너지를 쏟고 함수들을 머리에 집어 넣으려고하니 약간 과부하가 걸린 것 같았다.

    문제 해결능력과 기초 배경지식은 성장하는게 보인다. 근데 벌써 내일이면 목요일이다...

    개인 Test까지 얼마 안남았다. 근데 긍정적으로 생각하면서 이틀이나 공부할 수 있는 시간이 있다고 생각하고

    남은 시간을 잘 활용해서 28문제를 다 풀어봐야겠다.

Designed by Tistory.