코딩 테스트/프로그래머스(LV2)

[프로그래머스] [3차] 압축 (LV2 - JavaScript)

dev-hpk 2024. 11. 25. 16:31
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

1. 문제

입력 형식

  • 입력으로 영문 대문자로만 이뤄진 문자열 msg가 주어진다. msg의 길이는 1 글자 이상, 1000 글자 이하이다.

입출력 예

msg answer
KAKAO [11, 1, 27, 15]
TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]
ABABABABABABABAB [1, 2, 27, 29, 28, 31, 30]

 

2. 오답

function solution(msg) {
    const answer = []
    const dict =['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
    let temp = '';
    
    msg.split("").reduce((acc, current, idx) => {
        temp = acc + current;
        if (dict.includes(temp)) return temp;
        dict.push(temp);
        answer.push(dict.indexOf(acc)+1);
        temp = current;
        return current;
     });
    answer.push(dict.indexOf(temp)+1);
    return answer;
}

테스트 케이스 하나만 실패. 로직을 수정해 봐도 동일한 테스트 케이스만 실패하니까 뭐가 문제인지 몰라서 한참 고민했다...😂😂😂

테스트 케이스를 추가해보고 나서 문제점을 알았다.

answer에 0이 들어간 걸로 봐서 dict.indexOf(temp)가 -1. 존재하지 않는다는 것이다.

reduce 메서드에 초기값을 지정해 주지 않으면 타입을 'a'로 추론한다😱

타입은 그럴 수 있는데 length property는 왜 'a'가 나오지... 이유는 나중에 자세히 찾아봐야겠다.

reduce 메서드를 사용할 때 초기값이 필요한지 확인하면서 사용해야겠다.

3. 정답 풀이

풀이 전략

  • reduce 메서드 활용
  • 사전(dict)에 단어가 존재하지 않을 때까지 순회하며 문자열을 비교
  • 사전(dict)에 단어가 존재하면 단어 -1까지 인덱싱 한 문자열의 색인 번호를 answer에 추가
  • 사전(dict)에 새로운 단어 추가
function solution(msg) {
    const answer = []
    const dict =['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
    let temp = '';
    
    msg.split("").reduce((acc, current) => {
        temp = acc + current;
        // 사전에 존재하는 경우 temp 문자열 리턴해 순회
        if (dict.includes(temp)) return temp;
        // 사전에 존재하지 않는 경우 dict 배열에 추가, answer에 인덱스 추가, 처리한 문자의 다음 문자를 리턴
        dict.push(temp);
        answer.push(dict.indexOf(acc)+1);
        temp = current; // 마지막 문자인 경우 조건 분기에서 return temp로 리턴해서 temp에 할당
        return current;
    }, '');
    answer.push(dict.indexOf(temp)+1); // 마지막 문자의 인덱스를 answer 배열에 추가
    return answer;
}

 

4. 문제를 통해 알게 된 점

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

 

문제에 추가한 입력이 "A"인 테스트 케이스의 경우 배열의 길이가 1이다.

initialValue를 제공하지 않았기 때문에 accumulator는 "A", currentValue 값이 없어 콜백을 실행하지 않고 accumulator의 값을 리턴하게 된다.

 

 

recduce 메서드를 항상 초기값 없이 사용해 왔는데, 이번 문제를 풀면서 멘붕이 왔다...😭😭

초기값을 안 줬더니 length property의 값이 'a'로 나오는 건 무슨 일인지... 그래도 이번 계기로 reduce 메서드에 대해서 자세히 찾아볼 수 있게 되어서 많은 것을 배울 수 있는 기회였다.

 

 

 

[프로그래머스] 모음사전 (LV2 - JavaScript)

프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr1. 문제사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는,

dev-hpk.tistory.com

 

 

[프로그래머스] 롤케이크 자르기 (LV2 - JavaScript)

프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr1. 문제제한사항 1 ≤ topping의 길이 ≤ 1,000,000 1 ≤ topping의 원소 ≤

dev-hpk.tistory.com