5/8

dev_joo·4일 전

코드카타

가장 가까운 같은 글자

import java.util.*;
class Solution {

    public int[] solution(String s) {

        int[] alphabetIdx = new int[123]; // 현재 탐색에서 가장 가까운 등장 인덱스
        Arrays.fill(alphabetIdx, -1); // -1로 초기화
        int[] answer = new int[s.length()];
        Arrays.fill(answer, -1);

        
        for(int i = 0; i<s.length(); i++){
            char alpha = s.charAt(i);
            
            if (alphabetIdx[alpha] != -1) {
                answer[i] = i - alphabetIdx[alpha];
            }
            alphabetIdx[alpha] = i;
            
        }
            
        return answer;
    }
}

글자 자체로 배열 저장 위치 정하기 (ASCII)

// 'z'가 122이므로 넉넉하게 123 크기의 배열 생성
int[] alphabetIdx = new int[123];
        
// 등장하지 않은 경우를 구분하기 위해 -1로 초기화
Arrays.fill(alphabetIdx, -1);

배열의 'a' 의 앞 공간 (0~96) 은 낭비되지만 인덱스 매핑 연산을 피할 수 있다.

char alpha = s.charAt(i); // 현재 문자 (예: 'a'면 97)
            
if (alphabetIdx[alpha] != -1) {
	// 이전에 등장했다면 (현재 인덱스 - 마지막 등장 인덱스)
	answer[i] = i - alphabetIdx[alpha];
    } else { // answer 배열의 경우 초기화를 미리 하지 않아도 분기로 처리할 수 있다.
    	// 처음 등장했다면 -1
    	answer[i] = -1;
    }
            
    // 현재 문자의 ASCII 위치에 현재 인덱스 저장
    alphabetIdx[alpha] = i;
   }    
   	return answer;
    }
}

글자 개수만큼 배열 선언하고 인덱스 매핑하기 charAt() - 'a'

int[] lastPos = new int[26]; // 알파벳 소문자 개수
Arrays.fill(lastPos, -1);

for (int i = 0; i < s.length(); i++) {
    char ch = s.charAt(i);
    int index = ch - 'a'; // 'a'는 0, 'b'는 1 ... 'z'는 25가 됨
    
    if (lastPos[index] == -1) {
        answer[i] = -1;
    } else {
        answer[i] = i - lastPos[index];
    }
    lastPos[index] = i;
}

profile
풀스택 연습생. 끈기있는 삽질로 무대에서 화려하게 데뷔할 예정 ❤️🔥

0개의 댓글