[프로그래머스] 가장 가까운 같은 글자

2023. 8. 13. 12:04· 코테 준비/프로그래머스
목차
  1. 문제 설명
  2. 나의 풀이 

문제 설명

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
  1. 문제 설명
  2. 나의 풀이 
'코테 준비/프로그래머스' 카테고리의 다른 글
  • [프로그래머스] 점프와 순간이동 (javascript)
  • [프로그래머스] 추억점수 (javascript)
  • [프로그래머스] 푸드 파이트 대회 (javascript)
  • [프로그래머스] 크기가 작은 부분문자열 (javascript
배트리버
배트리버
🐾 사람 좋아, 개발 좋아 🐾 궁금한 건 끝까지 파고들고, 배운 건 즐겁게 나누는 개발자의 놀이터
배트리버
리트리버의 개발 놀이터
배트리버
전체
오늘
어제
  • 분류 전체보기
    • 네트워크
    • 기초 셋팅
    • 오늘의 일기
    • 리액트
    • 코테 준비
      • 프로그래머스
      • 백준
    • 코드스테이츠44기 프론트엔드
    • HTML-CSS-JavaScript
      • HTML
      • CSS
      • JavaScript
    • 자료구조&알고리즘
    • TypeScript
    • Git
    • Tip
    • 프로젝트
    • Next.js
    • 트러블슈팅

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 오블완
  • 코드스테이츠 회고록
  • 코드스테이츠 프론트엔드
  • 자바스크립트 비동기
  • 티스토리챌린지
  • 코드스테이츠 44기
  • 리액트쿼리
  • KPT 회고
  • 리액트
  • 자바스크립트
  • 코드스테이츠 44기 프론트엔드
  • 프로젝트 회고
  • 탄스택쿼리
  • 코드스테이츠
  • 네트워크
  • 타입스크립트문법
  • 프로그래머스
  • 코드스테이츠 블로깅
  • BFS
  • 리액트 상태관리

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
배트리버
[프로그래머스] 가장 가까운 같은 글자
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.