gimmickbutreal

[프로그래머스/자바] 가장 가까운 글자 - charAt 본문

Algorithm/Java

[프로그래머스/자바] 가장 가까운 글자 - charAt

isshosng 2023. 6. 12. 19:50

문제 설명

문자열 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 result
"banana" [-1, -1, -1, 2, 2, 2]
"foobar" [-1, -1, 1, -1, -1, -1]

입출력 예 설명

입출력 예 #1
지문과 같습니다.

입출력 #2
설명 생략

 

풀이 과정

1. answer 배열과 Index 배열의 값을 모두 -1로 선언

2. charAt을 사용해 문자열을 단일 문자로 반환

3. 처음보는 알파벳은 알파벳 인덱스에 맞게 index 배열에 저장

4. 처음보는 알파벳이 아니라면 i - index를 통해 몇 번째에 나왔는지 answer 배열에 넣어주기

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.Arrays;
class Solution {
    public int[] solution(String s) {
        int[] answer = new int[s.length()];
        Arrays.fill(answer, -1); // 초기 값으로 -1 설정
 
        int[] prevIndex = new int[26]; // 알파벳 소문자만 고려
        Arrays.fill(prevIndex, -1); // 초기 값으로 -1 설정
 
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            int idx = c - 'a'// 해당 위치의 알파벳이 알파벳 순서 기준 몇번째인지 알아보기
 
            if (prevIndex[idx] != -1) { // 처음보는 알파벳이 아니라면
                answer[i] = i - prevIndex[idx];
            }
            prevIndex[idx] = i; // 처음보는 알파벳은 알파벳 배열에 s 배열의 몇번째인지 적어놓기
        }
 
        return answer;
    }
}
 
cs
테스트 1 통과 (0.03ms, 72.6MB)
테스트 2 통과 (0.04ms, 75.3MB)
테스트 3 통과 (0.04ms, 71.3MB)
테스트 4 통과 (0.13ms, 84.3MB)
테스트 5 통과 (0.90ms, 81.6MB)
테스트 6 통과 (0.52ms, 80.4MB)
테스트 7 통과 (0.79ms, 92.1MB)
테스트 8 통과 (0.26ms, 74MB)
테스트 9 통과 (0.75ms, 93.9MB)
테스트 10 통과 (0.17ms, 76MB)
테스트 11 통과 (0.69ms, 78.8MB)
테스트 12 통과 (0.02ms, 72.9MB)
테스트 13 통과 (0.03ms, 79.5MB)
테스트 14 통과 (0.06ms, 71MB)
테스트 15 통과 (0.03ms, 71.9MB)
테스트 16 통과 (0.02ms, 79MB)
테스트 17 통과 (0.03ms, 77MB)
테스트 18 통과 (0.16ms, 77MB)
테스트 19 통과 (0.19ms, 76.7MB)
테스트 20 통과 (0.05ms, 75.1MB)
테스트 21 통과 (0.03ms, 76.7MB)
테스트 22 통과 (0.38ms, 76.1MB)
테스트 23 통과 (0.09ms, 73.5MB)
테스트 24 통과 (0.06ms, 79.1MB)
테스트 25 통과 (0.08ms, 74.3MB)
테스트 26 통과 (0.03ms, 76.4MB)
테스트 27 통과 (0.12ms, 75.6MB)
테스트 28 통과 (0.07ms, 82.7MB)
테스트 29 통과 (0.02ms, 73.4MB)
테스트 30 통과 (0.80ms, 77.8MB)