JAVASCRIPT/코딩테스트

프로그래머스 레벨1 - 가장 가까운 같은 글자(JAVASCRIPT)

진짠 2023. 2. 9. 17:54
728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

언뜻 복잡해보일 수 있지만 조건은 크게 4가지다.

1.알파벳의 인덱스를 기준으로 한다.
2.기준 알파벳의 인덱스보다 작은 인덱스여야 한다.
3.기준 알파벳의 인덱스와 비교 알파벳 인덱스의 차가 제일 작은 수여야 한다.
4.기준 알파벳과 중복된 알파벳이어야 한다.

 

제한사항

주의하여 코딩할 부분은 없었다.

이 문제를 풀기 위해서는 'lastIndexOf()' 를 알아야 한다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf

 

String.prototype.lastIndexOf() - JavaScript | MDN

lastIndexOf() 메서드는 주어진 값과 일치하는 부분을 fromIndex로부터 역순으로 탐색하여, 최초로 마주치는 인덱스를 반환합니다. 일치하는 부분을 찾을 수 없으면 -1을 반환합니다.

developer.mozilla.org


간단하게 설명하자면 비교 문자와 같은 문자들 중 가장 마지막에 위치한 문자의 인덱스를 가져오는 것이다.
(문제의 banana와 a를 비교했을때 a가 있는 인덱스 1,3,5 중 가장 마지막에 있는 5를 반환한다.)

처음에 몰라서 헤매고 있었을 때 이 함수가 큰 힌트가 되었다.

function solution(s) {
    
    var answer_arr = [];
    var s_str = s; //substr함수를 쓰기 위해 문자열 형태의 변수를 만들었다.
    s = s.split('');
    
    for(var i=0;i<s.length;i++) {
        var answer = -1; //중복 문자가 없으면 -1을 반환하기 위해
        for(var j=0;j<i;j++) {
            if(s[i] == s[j]) { //중복 문자가 있으면
                //기준 인덱스에 비교 인덱스를 뺀 값을 추출한다.
                answer = i - s_str.substr(0, i).lastIndexOf(s[j]); 
            }    
        }
        //가장 큰 인덱스가 남아 배열에 저장된다.
        answer_arr.push(answer);
    }
   
    return answer_arr;
}

코딩할때 for문을 쓰는게 습관이 되다보니 코테할때만큼은 for문을 쓰고싶지 않았는데 결국 이중 for문 형태로 갔다.

문제에서 기준 인덱스를 넘지 않는 가장 가까운 위치 = 기준 인덱스 - 비교 인덱스의 최대값 라는 수학적 깨달음(?)이 있어야 했다.

기준인덱스 i와 substr로 자른 문자열을 비교하여 가장 마지막에 있는 인덱스 위치를 구했다.

그리고 기준인덱스 i에 방금 구한 값을 뺀 인덱스가 answer에 저장되는 것이다.

for문이 모두 돌고나면 결국 변수 answer에는 가장 큰 인덱스가 남아있을 것이고 그것을 answer_arr에 푸시했다.(기준 인덱스 - 비교 인덱스의 최대값)

비교

역시 깔끔한 코드가 많았다.

for문을 두번 돌리는거보다 map함수를 사용하여 문자를 비교한 뒤 lastIndexOf를 이용해 인덱스를 가져오는게 특히 인상적이었다.

[...s].map((char, i) => {
    const count = s.slice(0, i).lastIndexOf(char);
   ...
});

이렇게 하면 문자열과 인덱스를 모두 편하게 추출할 수 있고 중복된 문자의 인덱스도 단 한줄로 구현이 가능했다.

느낀점

아직 코테 초보자인 나에게 문제를 해결했다는것에 의미를 부여하고 싶다.

그리고 map함수 코테하면서 많이 썼는데 여기서 왜 쓸 생각을 못했을까 싶다.

문자열 앞에 ...붙이면 배열형태로 변하는거 다시한번 체크하고 간다.

 

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

728x90