새벽코딩

[프로그래머스] 가장 가까운 같은 글자 (구현, 문자열) (JAVA) 본문

알고리즘

[프로그래머스] 가장 가까운 같은 글자 (구현, 문자열) (JAVA)

J 코딩 2022. 12. 31. 18:46
반응형

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

 

프로그래머스

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

programmers.co.kr


문제 설명

문자열 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을 완성해주세요.


제한사항
  • 1 ≤ s의 길이 ≤ 10,000
    • s은 영어 소문자로만 이루어져 있습니다.

 

입출력 예sresult
"banana" [-1, -1, -1, 2, 2, 2]
"foobar" [-1, -1, 1, -1, -1, -1]

※ JAVA 코드 (가장 가까운 같은 글자)

class Solution {
    public int[] solution(String s) {
        int[] answer = {};
        
        // 입력 문자열의 길이
        int len = s.length();
        
        answer = new int[len];
        
        // 각 알파벳의 인덱스
        int[] alphabet = new int[26];
        
        for(int i = 0; i < 26; i++){
            alphabet[i] = -1;
        }
        for(int i = 0; i < s.length(); i++){
            int idx = s.charAt(i) - 'a';
            
            // 이전에 해당 알파벳이 존재하지 않을 경우
            if(alphabet[idx] == -1){
                answer[i] = alphabet[idx];
            } 
            // 이전에 해당 알파벳이 존재하는 경우
            else {
                answer[i] = i - alphabet[idx];
            }
            
            // 알파벳 배열에 현재 인덱스 초기화
            alphabet[idx] = i;
        }
        
        return answer;
    }
}

※ 생각정리 (가장 가까운 같은 글자)

가장 가까운 같은 글자 문제는 문자열 구현문제이다. 입력받은 문자열을 읽어드리기 전에 alphabet 배열을 선언하여 a~z 총 26크기의 배열에 각 값에 -1을 넣어두었다.

s 문자열을 0부터 s.length()전까지 반복문을 실행하였고 만약 문자열의 각 문자(알파벳)가 배열에 -1이라면 answer[i]에 alphabet값(-1)을 담아둔다.

만약 문자(알파벳)가 -1이 아니라면 즉, 이전에 해당 알파벳이 존재했었다면 현재 인덱스에서 이전에 존재했던 가장 뒤의 해당 알파벳 인덱스를 빼주어 배열에 담는다.

-새벽코딩-

반응형
Comments