문제 

https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

 

코드

function solution(arr)
{
    var answer = [];

    for(let i = 1; i <= arr.length; i++) {
        if(arr[i-1] != arr[i] ) {
            answer.push(arr[i-1]);
        }
    }
    
    return answer;
}

 

 

후기

너무 빨리 풀어서 딱히 후기랄 것도 없지만 그냥 보자마자 이렇게 짜면 되는 거 아닌가..? 생각했지만 앞 문제의 for문에 시달려서 혹시 for문 쓰면 안되려나? 싶어서 풀긴 했지만 찾아보니 대부분 나랑 동일하게 풀었고 더 짧게 작성하신 분은 fliter를 쓰셨다.

fliter...생각도 못했다... 공부한다...

 

푸는 데 걸린 시간

4시간

 

 

문제

https://school.programmers.co.kr/learn/courses/30/lessons/92334?language=javascript

 

 

이번에는 금방 푼 거 같은데 시간 초과 해결하느라 시간이 좀 걸렸다. 찾아보니 시간 초과 때문에 통과 못 하신 분들이 많은 것 같은데 문제 특성상 반복문을 사용하는 방식을 쉽게 떠올리게 되어 있어서 그런 듯하다. 근데 javascript를 쓰는 경우에는 map, reduce를 활용하라고 대놓고 낸 문제인 것 같다. 문제 보자마자 빤히 보이길래 알고 있었는데도 애써 무시하고 3중첩 for문 돌렸다가 코드를 거의 다시 짜야했다. (map, reduce가 아직 낯설어서 쓰기 싫었음)

 

 

시간초과 실패 코드

/*  1. 캐릭별 신고 받은 횟수 카운트하고
    2. 신고받은 횟수가 k 이상인 경우
    3. 신고자에게 +1
    (같은 유저가 같은 유저 여러 번 신고해도 1번만 카운트)
*/

function solution(id_list, report, k) {
    var answer = [];
    var blist = []; // 신고 당한 유저
    var cnt = []; // 신고 당한 횟수
    
    report = [...new Set(report)]; // 같은 유저가 같은 유저 신고 카운트 1번만 되도록 중복 제거
    
    answer = new Array(id_list.length).fill(0);
    
    for (let i=0; i < report.length; i++) {
        blist.push(report[i].split(" ",2)[1]);
    }
    
    cnt = blist.reduce((arr, cur) => { 
        arr[cur] = (arr[cur] || 0)+1;
        return arr;
    }, {});
    

    for (let j=0; j < (Object.keys(cnt)).length; j++) { 
        if (Object.values(cnt)[j] >= k) { // 신고 횟수가 이상이면
            for(let m=0; m < report.length; m++) {
                if (Object.keys(cnt)[j] == report[m].split(" ",2)[1]) { // 신고당한 유저
                    for(let n=0; n < id_list.length; n++) {
                        if (id_list[n] == report[m].split(" ",2)[0]) { // 신고한 유저
                            answer[n] += 1;
                        }
                    }
                }
            }
        }
    } 

    return answer;
}

 

정답코드를 보고나니 for문 쓰는 건 확실히 괜히 복잡해지고 좋은 코드는 아니다.

위의 코드가 평소 내가 짜던 스타일인데 내 코드는 뭔가 전부터 느꼈지만 아는 거에서 어떻게든 돌리려는 느낌이 강한, 좀 고집있는..? 스타일인 거 같다.

고쳐야 되는 스타일이긴 하다...

두 번째 문제 푼 건데 벌써 코딩 테스트가 꽤 도움이 되는 것 같다고 느끼고 있다. 

역시 카카오 코테는 좀 어렵지만 왜 코테보는 지 알 거 같기도 하다.

시간 초과 실패라는 걸 알았을 때부터는 map을 써서 어떻게든 for문 하나만 빼보자, 라는 생각으로 머리를 굴렸다.

근데 map을 써도 for문이 줄어들 수 있는 코드는 도저히 생각이 안나서 아래 코드를 참고했다.

(map을 어떻게 써야 for문을 안 쓸 수 있는 거지?? 라는 생각이 자꾸 들었다.)

 

 

코드 (정답)

https://intrepidgeeks.com/tutorial/programmer-get-report-results-javascript-ver

 

프로그래머스 - 신고 결과 받기(JavaScript Ver.)

인트로 Programmers에서 독학 첫 번째로 도전한 문제이다. 이걸 해결해보고자 한다. 문제 Level: 1 언어: Javascript 문제보기 입력값 id_list: 이용자의 id가 담긴 문자열 배열 report: 각 이용자가 신고한 이

intrepidgeeks.com

 

 

 

후기

이 문제는 해결한 게 아니니까 정답을 제출 하진 않았다.

나중에 다시 풀어볼 생각이다.

코테 처음이면서 왜 이렇게 몇 시간씩 걸리는 문제부터 푸냐고 생각할 수도 있는데 풀고 싶어서 푸는 게 아니라 1단계 문제에 나와있는 문제 순서대로 푸는 건데 거기에 카카오 코테가 있을 뿐이다.

이게 젤 쉬운 단계라고? 라는 의문이 이 두 번째 문제 풀 때부터 들어서 찾아보니 사람들도 이게 1단계 문제인 게 이상하다고 생각하시더라.

원래 1단계 문제는 언어 기초만 알아도 풀 수 있는 수준이어야되는데 어렵다고.

나는 코테가 1단계도 이 정도 수준인 줄 알았다.

나중에는 얼마나 어려울 지 겁먹고 있었는데 생각해보니까 카카오 입사문제가 1단계 일리가 없지..

다음 문제부터는 1단계에서 카카오 일단 빼고 쉬운 문제부터 푸는 걸로..

 

문제

https://school.programmers.co.kr/learn/courses/30/lessons/118666?language=javascript

 

 

푸는 데 걸린 시간

5시간

 

 

코드

function solution(survey, choices) {
    var answer = '';
    var arr = { R : 0, T : 0, C : 0, F : 0, J : 0, M : 0, A : 0, N : 0 };
    
    for (let i=0; i < survey.length; i++) {
        if(choices[i] < 4) { 
            arr[survey[i].slice(0,1)] += 4 - choices[i];
        } else if(choices[i] > 4) {
            arr[survey[i].slice(1,2)] += choices[i] - 4;
        }
    }
    
    for(let j = 1; j <= Object.keys(arr).length; j+=2) {
        if (Object.values(arr)[j-1] > arr[Object.values(arr)[j]]) {
            answer += Object.keys(arr)[j-1];
        } else if (Object.values(arr)[j-1] < Object.values(arr)[j]){
            answer += Object.keys(arr)[j];
        } else { // 동점. 알파벳 순
            if(Object.keys(arr)[j-1] < Object.keys(arr)[j]) {
                answer += Object.keys(arr)[j-1];
            } else {
                answer += Object.keys(arr)[j];
            }
        }
    } 
    return answer;
}

 

 

후기

일단 문제 읽는데 1시간 걸렸다.

문제가 이해가 잘 안돼서 엄청 애 먹었다.

그리고 3시간은 코드 작성하는 데 걸렸는데 나와의 싸움이었다.

코드를 작성하면서도 '이렇게 하면 될 거 같긴한데 너무 어렵게 짜는 거 같은데?' 라는 생각이 들어서 썼다 지웠다하면서 좀 더 단순하게 짤 수 있을 거 같은데...를 반복해서 코드가 길진 않은 데 오래 걸렸다.

코딩테스트는 어쨌든 간결하고 단순하게 짤 수록 좋으니까 길고 복잡하게 짜고 싶지 않았는 데 해결하고 나서 구글링해보니 내 코드도 좋은 코드는 아니다.

나머지 시간은 테스트 통과가 안돼서 헤매는 시간이었는데 알고보니 내가 문제 이해를 잘못 한 거였다.

그러니까 그냥 문제 이해를 못해서 시간을 엄청 잡아먹었다....

(점수를 1,2,3/3,2,1 이렇게 부여하려면 4를 빼줘야되는 데 4를 안 빼줘서 그런 거 였음)

 

프로그래머스 해보게 된 이유

 

컴퓨터공학과를 다니면서 코딩 테스트 하는 사람들이 주변에 많았는데 그런 사람들을 보면서 항상 생각하던 게 있다.

 

코딩 테스트 = 코딩 실력 인가?

 

코딩 테스트를 잘하면 과연 코딩을 잘한다고 할 수 있는 걸까?

 

이런 생각을 하면서 의도적으로 코딩 테스트를 피해왔다.

 

의문이 든다는 것 자체가 내 생각에는 관련 없어 보였기 때문이다.

 

아예 관련이 없진 않겠지, 근데 필수는 아닌 듯- 하고 살았고 지금 회사도 코딩 테스트를 보지 않는 회사였기 때문에 정말 잊고 살았다.

 

근데 이제 취업에 쫓기지 않다보니 좀 여유가 생겼는 지 이 의문을 증명하고 싶어졌다.

 

코딩 테스트가 정말 코딩 실력에 도움이 되는 지, 코딩 테스트를 잘 하게 되면 알고리즘을 더 잘 짜게 되는 지 궁금해졌고 이를 알아보려면 코딩 테스트를 풀어봐야하기 때문에 시작하게 됐다.

 

어차피 웬만한 회사는 다 코딩 테스트를 보니까 해두면 나쁘진 않을 거 같기도 했고 정말 알고리즘 짜는 데 도움이 된다면 현재 회사 일도 더 잘 할 수 있게 되지 않을까 싶어서.

 

 

Javascript 선택 이유

 

나는 최애 언어가 꽤 자주 바뀌는 편인데 변천사를 설명하자면 아래와 같다.

 

첫 최애 언어 - C언어 (2017 - 2018)

이유 : 내 첫 언어가 C언어였다. (요즘에는 Python부터 배우지만 라떼는 C언어 였음)

C언어 배우고 다음 학기에 JAVA를 배우니까 JAVA는 처음부터 마음에 안 들었다.

일단 print문도 printf로 쓰면 될 걸, system.out.println 이딴 식으로 써야하고 import나 기본 클래스 작성도 어찌나 많고 긴지 오죽하면 이클립스에 새 파일 생성할 때 기본 클래스 코드 작성해주는 옵션이 있겠나.

그리고 객체 지향인 것도 마음에 안 들었다.

그냥 함수 쓰면 될 걸 클래스까지 써야하니까 마음에 드는 구석이 없었다.

그러니 상대적으로 C언어가 천사로 보였다. 

(어느 정도 였냐면 면접 볼 때 JAVA를 훨씬 오래 쓰셨는데 면접은 C언어로 보시네요? 라는 질문도 들었음)

 

두 번째 최애 언어 - Python (2019 - 2021)

이유 : 학교에서 Python만 써서.

근데 Python이 쉽기도 하고 학교에서는 코딩 수업이 전부 딥러닝 수업이었어서 Python을 쓸 수 밖에 없었다.

자주 쓰다보니 몸에 익어서 최애 언어가 됐다. 

그래서 졸작도 백엔드지만 Django로 개발하게 됐다.

 

현재 최애 언어 - Javascript (2022 -)

이유 : 회사에서 Javascirpt만 써서.

생각해보니 쓰기 편한 언어가 최애 언어가 되는 듯 하다.

 

서론이 길었는데 결론적으로 현재 최애 언어인 Javascript로 프로그래머스를 풀어보겠다는 뜻이다.

작년에 풀었으면 아마 Python으로 했을 듯.