가장 가까운 같은 글자

Sheryl Yun·2023년 7월 26일
0

문제 링크

처음 풀이

아래 코드로 문제 테케와 정확도 케이스를 모두 통과했다. 하지만 점수가 1점 ^ㅡ^

코드를 다시 보니 왠지 string 변수를 줄일 수 있을 것 같고 includes나 lastIndexOf 같은 메서드도 좀 덜 사용할 수 있을 것 같았다. 하지만 느낌만 오고 구체적인 방법이 생각이 안 남

function solution(s) {
    let answer = [];
    let string = '';
    
    for (let i = 0; i < s.length; i++) {
        if (!string.includes(s[i])) answer.push(-1);
        else answer.push(i - string.lastIndexOf(s[i]));
        
        string += s[i];
    }
    
    return answer;
}

새로운 풀이

다른 사람 풀이 중 고차함수 map과 객체(hash)를 활용한 첫 번째 코드가 좋았다.
문제의 답을 내기 위해 필요한 코드만 작성한 느낌이었다 👍

function solution(s) {
	let hash = {}; // 최신 값을 넣을 빈 객체 생성
    
    [...s].map((v, i) => {
    	let result = hash[v] === undefined ? -1 : i - hash[v];
        hash[v] = i; // 객체의 v번째 값을 새로운 i로 교체
        return result; // 여기서 각 차례의 연산 값인 result를 리턴하면 map이 새로운 전체 배열로 리턴
    })
}

새로운 코드를 보며 다음 점들을 배웠다.

  • 특정 key의 value를 최신 값으로 교체해야 하는 경우 객체 활용이 편함
  • 객체에서 값이 있는지 없는지 확인하는 것을 hash[v] === undefined ? 형태로 가능
  • map이 매 차례의 연산 결과를 모아 자동으로 배열로 반환하기 때문에 let answer = []와 같은 초기 배열 선언이 불필요

두 번째 항목인 '객체 값의 존재 여부 확인'은 key: value 형태인 객체의 property를 확인하는 것과 동일했다. 관련 메서드가 있는 것 같아서 찾아보니 hasOwnProperty()가 있었다.

undefined 부분을 바꿔서 실행하니 체감상 속도는 살짝 느려졌지만 이전보다 가독성은 올라갔다. 최종 코드 완성 👏

function solution(s) {
    let hash = {};
    
    return [...s].map((v, i) => {
        let result = !hash.hasOwnProperty(v) ? -1 : i - hash[v];
        hash[v] = i;
        return result;
    });
}
profile
영어강사, 프론트엔드 개발자를 거쳐 데이터 분석가를 준비하고 있습니다 ─ 데이터분석 블로그: https://cherylog.tistory.com/

0개의 댓글