[프로그래머스] 가장 가까운 같은 글자 (구현, 문자열) (JAVA)
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이 아니라면 즉, 이전에 해당 알파벳이 존재했었다면 현재 인덱스에서 이전에 존재했던 가장 뒤의 해당 알파벳 인덱스를 빼주어 배열에 담는다.
-새벽코딩-