ABOUT ME

-

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

    Today I Learnd 

     

    (2021. 11. 12. 금)

     

     

    1.  2주차 4일차 소감

    오늘은 내일 있을 개인 알고리즘 코딩테스트를 대비해서 1번 ~ 28번 문제들을 반복하면서 문제들을 풀었다.

    그 전에 팀원들이 담당 문제를 맡아서 풀었던 문제를 덜 푼게있어서 앞 문제들을 반복하기 전에 그 문제들을 풀어줬다.

    이제 어느정도 알고리즘 코딩테스트에 대해 좀 풀줄 아니까 어떤 걸 써야하고 이럴 때는 이렇게 써볼까? 해서 써봤는데

    틀린 것도 있었지만 맞춘 문제들도 있었다. 내심 기분이 좀 좋았다. 월요일에서 목요일까지 69시간 쯤을 투자한 성과같다.

    다 풀고나서 1번 ~ 28 문제들을 풀었는데 이해가 안가는 문제들은 직접 코드에 입력값을 넣어서 출력까지 직접 넣어봤다.

    그렇게 넣어보니 코드에 대해 이해가 가는 부분도 있었다. 내일 개인 알고리즘 코딩테스트를 잘 볼 수 있을 것 같은 기분이 든다.

     

    2.  알고리즘 코딩테스트

     

     

     

     

    1. 프로그래머스 문제  '수박수박수박수박수박수?'  _ 11/12 19번 문제

    // 문제 : 길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, 
    //        solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.
    
    // 제한 조건 : n은 길이 10,000이하인 자연수입니다.
    
    
    
    
    function solution(n) {
        let answer = ''
        // 수박을 반복해서 넣어주기 위해서 빈칸으로 answer라는 변수를 할당해줬다.
        
        for (let i = 1; i <= n; i++) {
        // n의 매개변수 값에 맞게 반복문을 돌려서 문자열을 완성시키기 위해 반복문을 돌렸다.
        // i에 1을 넣은 이유는 입출력값의 예처럼 '수'가 먼저 나오게 해주기 위해서 할당해줬다.
    
            if (i % 2 === 0) {
                answer += '박'
            // n이 4일 때 '박' 으로 끝나기 때문에 짝수로 정해줘서 조건문을 통해
            // 짝수일때는 answer라는 변수에 박을 넣어줬고
    
            } else {
                answer += '수'
            // n이 3일때는 '수' 로 끝나기 때문에 홀수로 정해줘서 조건문을 통해서
            // 홀수일때는 answer에 '수'를 넣어줬다.
            }
        }
        return answer
    }

    처음에 문제만 읽고 이게 무슨 장난인가 싶었는데 문제긴 하니 풀어보려고 문제 설명을 엄청 읽어본거 같다. 그러다 보니

    n이 4일때는 '박' 으로 끝나고 n이 3일때는 '수' 로 끝나는 걸 확인하고 저번에 풀었던 짝수와 홀수 하듯이 하면 될 것 같아서

    코드를 풀어나갔다. 코드를 실행해보니 잘 된 거였다. 그래서 이럴리가 없다 생각하고 채점을 해보니까 통과였다.

    내가 성장을 한건지 문제가 쉬운건지 모르겠지만 앞에 나온 문제들이 쉬운데 불구하고 내가 오래 붙잡고 있었던 것을 생각해보면

    그래도 조금 성장한 모습들이 보였다.

     

     

     

     

     

    2.  프로그래머스 문제  '이상한 문자 만들기'  _ 11/12 21번 문제

    // 문제 : 문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 
    //        각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 
    //        각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
    
    // 제한 사항 : 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
    //             첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
    
    
    
    
    function solution(s) {
        let answer = ''
        // 리턴값을 적어주기 위해서 공백으로 answer라는 변수를 할당해줬다.
        let index = 0
        // index라는 변수를 할당해줘서 매개변수의 index가 for문과 if문을 통과해서 1씩 증가하게 만들어줬다.
    
        for (let i = 0; i < s.length; i++) {
        // 매개변수 안에 있는 길이를 이용해서 각 요소들로 반복문을 돌린 뒤 조건문으로 들어가서
        // 조건에 맞는 값을 찾기위해서 반복문을 돌려줬다.
    
            if (s[i] === " ") {                         // s의 i가 공백이라면
                index = 0                               // index라는 변수를 0으로 초기화해주고
                answer += " "                           // answer라는 변수는 공백을 추가해줘라.
            } else {                                    // s의 i가 공백이 아니라면
                if (index % 2 === 0) {                  // 인덱스가 짝수면
                    answer += s[i].toUpperCase()        // answer라는 변수에 s의 i를 대문자로 반환해주고
                } else {                                // 홀수면
                    answer += s[i].toLowerCase()        // answer라는 변수에 s의 i를 소문자로 변환해줘라
                }
                index++                                 // 위에 있는 반복문을 통해서 index가 짝/홀일 때
            }                                           // 1씩 증가시켜서 index를 카운팅 해준 것이다.
        }
        return answer
    }
    
    console.log(solution("try hello world"))            // 츨력값이 잘 나오는 것을 확인할 수 있다.

    이 문제는 이해가 좀 어려웠다. 그래서 1주차때 같은 조였던 분께 도움을 청해서 문제를 배웠는데 왜 여기선 index가 들어가는지 

    이해가 가지를 않아서 이것저것 물어보고 직접 입력값을 넣어서 돌려보니 이제야 이해가 갔다. 조금 무식한 방법같지만 효과는 좋았다.

    뭔가 코드를 짤 때도 센스라는게 있는 것 같다. 아직은 2주차라 변명같은걸 할 수 있지만 앞으로 개발자가 되면 그런 센스들도 갖을 수 있게

    열심히 노력해야겠다.

     

     

     

     

     

    3. 프로그래머스 문제 '서울에서 김서방 찾기' _ 11/9 18번 문제

    // 문제 : String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, 
    //        "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. 
    //        seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.
    
    // 제한 사항 : seoul은 길이 1 이상, 1000 이하인 배열입니다.
    //             seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
    //             "Kim"은 반드시 seoul 안에 포함되어 있습니다.
    
    
    
    
    function solution(seoul) {
        let answer = ''
        // 김서방은 ${}에 있다를 넣어주기 위해서 answer라는 변수를 비워줬다.
        for (let i = 0; i < seoul.length; i++) {
        // seoul의 길이가 1이상, 1000이하이므로 길이보다 작을 때 까지 반복해주는 반복을 돌렸다.
    
            if (seoul[i] == 'Kim') {
              answer = `김서방은 ${i}에 있다`
            // 매개변수 입력값이 반복문을 돌때 'Kim'과 일치하는게 있으면
            // `김서방은 ${i}에 있다`를 출력해주기 위해서 answer 변수에 넣어줬다.
            // 백틱을 넣어준 이유는 ${i}을 넣어주기 위해서 템플릿 리터럴을 사용했다.
            }
        }
        return answer
    }
    
    console.log(solution(["Jane", "Kim"]))
    // 출력을 해보면 출력의 예인 "김서방은 1에 있다"라는 출력값이 나온다.

    이 문제는 seoul안에 반드시 'kim'이 포함이 되어있기 때문에 for문을 사용해서 'kim'을 찾아 주게 했고 템플릿 리터럴을 사용해서

    쉽게 찾을 수 있었다. 이 문제는 문제 잘 읽어보면 뭘 써야할지 보이기 때문에 문제없이 풀 수 있었다.

     

     

     

     

    1. 프로그래머스 문제  '문자열 내 p와 y의 개수' _ 11/12 16번 문제

    // 문제 : 대문자와 소문자가 섞여있는 문자열 s가 주어집니다. 
    //        s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 
    //        'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 
    //        단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
    
    // 제한사항 : 문자열 s의 길이 : 50 이하의 자연수
    //            문자열 s는 알파벳으로만 이루어져 있습니다.
    
    
    
    
    function solution(s){
        let a = 0
        let b = 0
        // 반복문을 통해서 매개변수 입력값이 p와 y이가 나오면 숫자를 적어주기 위해서 만들어줬다.
        
        s = s.toLowerCase()
        // 매개변수 입력값에는 대문자와 소문자가 들어가서 p와 y를 구분지어 쉽게 코드를 작성하기 위해서
        // .toLowerCase()를 사용해서 소문자로 통일 시켜줬다.
        
        for (let i = 0; i < s.length; i++) {
        // 입력값에 들어와 있는 p와y를 반복해서 조건문에 들어간 뒤 분류를 하기위해서
        // for문을 이용해서 반복을 해줬다.
            
            if (s[i] === 'p'){
                a += 1
            // s매개변수의 i가 p면 변수 a에 숫자를 추가 시켜주게 해줬다.
    
            } else if (s[i] === 'y') {
                b += 1
            // else를 쓸 필요가 없어서 다시 한번 if를 써준 뒤
            // s매개변수의 i가 y면 변수 b에 숫자를 추가 시켜주게 해줬다.
    
            } 
        } 
            if (a === b) {
                return true
            // for문 밖에다 해준 이유는 for문과 if문을 다 돌린 후 
            // for문과 if문을 지나온 p와 y의 갯수를 비교해서 일치하면 true를 리턴으로 반환값을 줬고,
    
            } else {
                return false
            // 일치하지 않으면 false를 리턴으로 반환값을 바로줬다.
            }
    }
    
    console.log(solution('Pyy'))
    // 출력값이 잘 실행 되는 것을 터미널 창을 통해서 확인 할 수 있다.

    이 문제는 읽어보니까 p와 y의 개수가 같으면 참 아니면 거짓인걸 볼 수 있었고 코딩을 할 때 편하게 코딩하기 위해서 대문자를 소문자로

    변환 시켜주는 메소드를 찾아서 .toLowerCase()를 사용해서 소문자로 변환을 해준 뒤에는 쉽게 풀 수 있었다. 풀이를 안 보고 스스로

    풀어보는 실력?을 갖게 돼서 정말 좋았다.

     

     

     

     

    2. 프로그래머스 문제  '자릿수 더하기' _ 11/12 22번 문제

    // 문제 : 자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
    //        예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
    
    // 제한 사항 : N의 범위 : 100,000,000 이하의 자연수
    
    
    
    
    function solution(n) {
        let answer = 0                              // 반복문을 끝나고 난 후 계산된 값을 넣어주기 위해 0으로 처리해줫다.
        let arr = String(n).split("")               // 문제 설명에 나왔듯이 123이면 1+2+3을 리턴하라해서
                                                    // String을 사용해서 매개변수 n을 문자열로 만들어주고
                                                    // split을 사용해서 문자열로 만든 매개변수n을 문자열을 나눠줬다.
    
        for (let i = 0; i < arr.length; i++) {      // 문자열로 나눈 arr의 길이까지 0으로 정한 i를 arr 길이보다 작을 때 까지
                                                    // i를 증가 시켜줬다.
    
            answer += Number(arr[i])                // 문자열로 나눠진 arr을 다시 숫자로 변환해주기 위해서 Number()를 사용했고
                                                    // 숫자로 변환해준 arr의 i를 answer에 반복이 가능할때까지 추가 시켜줬다.
        }
        return answer                               // 작업이 끝난 answer의 반환값을 리턴해줬다.
    }
    
    console.log(solution(123))
    // 출력값이 6이 찍히는 것을 확인할 수 있음

    이 문제 같은 경우에는 전날에 풀었던 '하샤드 수' 를 많이 참고를 했다. 뭔가 문제에서 요구하는 게 비슷해서 어제 풀었던 방식과 비슷하게

    코딩을 해보았다. 그 결과 테스트도 무사히 통과하고 채점도 완료할 수 있었다. 

     

     

     

     

    3. 프로그래머스 문제  '정수 내림차순으로 배치하기' _ 11/12  24번 문제

    // 문제 : 함수 solution은 정수 n을 매개변수로 입력받습니다. 
    //        n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 
    //        예를들어 n이 118372면 873211을 리턴하면 됩니다.
    
    // 제한 사항 : n은 1이상 8000000000 이하인 자연수입니다.
    
    
    function solution(n) {
        let answer = Number(String(n).split("").sort().reverse().join(""))
        // 우선 숫자를 String으로 이용해서 매개변수n을 문자열로 변환을 시켜주고
        // 정렬을 해주기 위해서 문자열을 나눠주는 split을 사용해줬고
        // .sort를 이용해서 숫자를 차례대로 정렬을 해주고
        // 숫자를 내림차순으로 나타내주기 위해서 .reverse로 숫자를 내림차순으로 해줬고
        // 문자열을 나눠줬던걸 join으로 다시 합쳐줬고
        // 문자열이 아닌 숫자로 나타내주기 위해서 위에서 했던 작업을 Number로 다 묶어줬다.
    
        return answer
        // answer의 반환값을 리턴해줬다.
    }
    
    console.log(solution(118372))
    // 출력값을 터미널에 실행해보면 정렬이 된 상태로 내림차순되는것을 확인할 수 있다.

    이 문제는 뭔가 정말 간단할 것 같았다. 그래서 여태 써본 함수나 객체나 메소드를 활용을 했고, reverse와 join은 구글링을 통해서

    오늘 배운 것 들이었다. 그래서 머릿속으로 생각한 대로 쭉쭉 적어 나갔더니 테스트와 채점을 무난하게 통과할 수 있었다.

     

     

     

     

    3. 프로그래머스 문제  '정수 내림차순으로 배치하기' _ 11/12  24번 문제

    // 문제 : 임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
    //        n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, 
    //        n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
    
    // 제한 사항 : n은 1이상, 50000000000000 이하인 양의 정수입니다.
    
    
    
    
    function solution(n) {
        let answer = 0
        // 문제에서 원하는 출력값을 구해서 넣어주기 위해 answer라는 변수에 0을 정해줬다. 
    
        let sqrt = Math.sqrt(n)
        // 매개변수n의 제곱근을 구해야하므로 Math.sqrt라는 함수를 이용해서 제곱근을 구해줬다.
    
        if (sqrt % 1 !== 0) {
            answer = -1
        // sqrt변수가 1로 나눴을 때 0이 아니면 answer변수에 -1을 넣어주도록 했다.
        // 그 이유는 제곱근이 아닐 경우니까 나머지를 이용해서 소숫점을 판별해주기 위해서 이 코드를 썼다.
        
        } else {
            answer = Math.pow(sqrt + 1, 2)
        // 제곱근일 경우에는 Math.pow라는 제곱을 구해주는 함수를 사용해서 아까 구했던
        // 제곱근인 변수 sqrt와 +1을 해줘서 제곱을 해주라는 뜻이다.
        
        }
        return answer
        // 출력값을 구하기위해 써뒀던 answer라는 변수의 반환값을 리턴해줬다.
    }
    
    console.log(solution(121))
    // 출력을 해보면 터미널창에 출력값이 잘 실행되는 것을 확인 할 수 있다.

    이 문제는 입력값의 제곱근에 1을 더해서 제곱을 시켜주는 문제였다. 문제 해석이 쉬워서 제곱을 시켜주는 함수(Math.pow)와

    제곱근을 반환하는 함수(Math.sqrt)를 구글링해서 찾은 뒤 적용을 시켜보았다. 이 문제도 별탈없이 술술 풀었던 것 같다. 

     

     

     

    4. 부족한 점

    5일차에 접어들고 월요일에서 목요일까지 69시간을했다.. 개인적으로는 정말 많이 시간을 투자한 것 같았는데 3일차까지는 효과가 없어서

    테스트에서 떨어질까봐 걱정이 많았다. 그런데 오늘을 풀었을 때는 문제 해석도 잘 됐고 앞서 풀었던 문제에서 참고를 많이 해서 괜찮게

    풀었던것 같다. 하지만 보자마자 코드를 써내려가는게 아니라 아직은 버벅 거리는면도 있지만, 수료할 때 쯤에 알고리즘 코딩테스트를

    다시 한다는 말을 들었기 때문에 이번 주차에서는 주특기랑 친해지는 시간을 가졌던 것 같다. 하지만 문제를 잘 읽고 해석하는 능력과

    머릿속에서 내가 아는 코드들을 꺼낼 수 있게 열심히 한 번 내일 테스트 보기 전까지 반복해서 문제들을 풀어봐야할 것 같다.

Designed by Tistory.