문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/142086
문자열 s가 주어졌을 때
문자열 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을 완성해주세요.
나의 풀이
function solution(s) {
var answer = [];
let sArr = [...s]; //문자열을 배열로 변경해주기 위함
let arr = []; // 비교를 위해 저장할 배열을 생성
let result = -1; // 결과값을 나타냄
for(let i=0; i<sArr.length;i++){
arr.push(sArr[i]); // 하나씩 비교할 배열에 push
if(arr.length<=1){ //배열에 원소가 하나뿐일 땐 무조건 -1 이므로 바로 저장
answer.push(-1);
}
else{ //배열의 길이가 1보다 클 때 비교를 시작
for(let j=0; j<i; j++){ // 현재 비교 배열에 삽입한 원소와 비교 배열에 삽입된 원소를 순차적으로 비교함 / i전까지만 비교하면 되므로 조건문은 j<i
if(arr[j] === sArr[i]){
result = arr.length-j-1;
// 만약 banana 같은 경우 마지막 a를 예시로 들자면 인덱스 1 ,3 번째에 a가 존재하는데 가장 마지막에 오는 a가 가장 가까운 같은 글자이므로 result 는 최종적으로 가장 마지막에 같은 글자를 나타 내는것 -> 따라서 배열의 길이에서 찾은 인덱스를 제거한 후 -1 을 해주면 정답임 -1을 해주는 이유는 인덱스는 0부터 시작하기 때문임
}
}
answer.push(result); // 비교가 끝난 후에는 찾은 결과를 삽입
result = -1; // result 를 다시 -1로 초기화해줘야함
}
}
return answer;
}
이 문제를 푸는데 2시간정도 소요됐던 것 같다. 한 3개월만에 다시 문제를 풀어보기도 했고 구글링 없이 문제를 푸려다 보니 오래걸렸던 것 같다 .
문제에 대한 해설은 주석으로 달아두었다.
처음 문제를 풀 때 생각했던 것이 비교할 배열을 하나 생성해서 그 안에 주어진 s 원소를 순서대로 하나씩 추가하여 비교할 배열을 돌면서 추가한 원소가 존재하는지 안하는지 비교해서 정답을 찾으면 되겠다 생각했다.
마지막에 result = -1 을 써주지 않아 계속 마지막 찾은 result로 고정적으로 answer에 들어가서 고생을 했다. 이는 for 문 내에 result를 선언해주거나 result = -1로 초기화해주어 문제를 해결 할 수 있었다. (나는 후자의 방법을 선택함)
문제를 다 푼 후 다른 사람들은 어떻게 풀었나 검색을 해보았는데 다 똑같은 방법으로 풀어 신기했다 .. ( 7개의 블로그를 탐색해봤는데 다 같은 유형으로 풀었음 .. ) 모두 lastIndexOf 를 사용하였던데 이 방법은 처음 접해보는 방법이라 다음에 풀어볼 때는 참고하여 사용할 수 있을 것 같다 !!
질문은 언제나 환영입니다 !
'코테 준비 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 점프와 순간이동 (javascript) (1) | 2023.10.26 |
---|---|
[프로그래머스] 추억점수 (javascript) (0) | 2023.09.04 |
[프로그래머스] 푸드 파이트 대회 (javascript) (0) | 2023.03.19 |
[프로그래머스] 크기가 작은 부분문자열 (javascript (0) | 2023.03.18 |
[프로그래머스] 두 개 뽑아서 더하기 (javascript) (0) | 2023.03.18 |