Problem
문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.
b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.
n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.
a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.
따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.
문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.
Solution
문제분석
return 각 요소별 앞에 동일 문자 있다면 얼마나 앞에 있는지, 없으면 -1
문제풀이
1. 우선 배열로 만들어준다
2. 각 요소별로 그 요소의 앞까지 배열 생성해주고 마지막 인덱스를 검색한 후 없다면 -1
3. 있다면 현 인덱스 - 마지막 인덱스
4. 2, 3을 반복해준뒤 결과값 return
function solution(s) {
let copy = [];
let answer = [];
s = [...s];
for(let i = 0; i < s.length; i++){
if(i === 0) answer[i] = -1;
else{
for(let j = 0; j < i; j++){
copy[j] = s[j];
}
if(!(copy.includes(s[i]))) answer[i] = -1;
else answer[i] = i - copy.lastIndexOf(s[i])
}
}
return answer;
}
처음에 배열을 생성할 변수들을 생성해주고 문제풀이에 맞게 여러 상황에 따라 for문과 if문을 사용하였다.
테스트는 통과했으나..
시간이 많이 걸렸다 아무래도 새배열을 생성해서 넣어주고 확인하고 또 다시 배열을 생성해주는 등의 비효율적인 코드를 짜서인 거 같다.
문제풀이대로 풀지만 코드를 좀 더 효율적으로 짤 수 있는 방법에 대해 고민해보았다.
function solution(s) {
return [...s].map((x, i) => {
const y = s.slice(0, i).lastIndexOf(x);
return y < 0 ? -1 : i - y;
})
}
고민하여 바꾼 코드!
es6 문법 사용하여 작성하였다.
기존에 for문을 사용하여 새로운 배열을 생성했던 것과 달리 slice를 이용하여 바로 새로운 배열을 생성하도록 하였고
lastIndexOf(x)에서 x가 없다면 -1이 나오기 때문에 y < 0 ? -1 로 삼항 연산자를 작성하였다.
코드도 간결해지고 시간복잡도도 줄어들었다!
'프로그래머스 (JS) > Lv. 1' 카테고리의 다른 글
[Programmers / JS] 42840번 - 모의고사 (0) | 2023.03.23 |
---|---|
[Programmers / JS] 12921번 - 소수 찾기 (0) | 2023.03.22 |
[Programmers / JS] 134240번 - 푸드 파이트 대회 (0) | 2023.03.21 |
[Programmers / JS] 132267번 - 콜라 문제 (0) | 2023.03.21 |
[Programmers / JS] 12901번 - 2016년 (0) | 2023.03.20 |