푸는 데 걸린 시간

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단계에서 카카오 일단 빼고 쉬운 문제부터 푸는 걸로..