가장 짧은 문자 거리(앞,뒤에서탐색)

Seungmin Lim·2022년 2월 5일
0

코딩문제연습

목록 보기
10/63

문제

나의풀이

import java.util.*;

class Main {
		    public int[] solution(String s, char t) {
		    	int[] answer = new int[s.length()];
		    	int p = 1000;
		    	//처음부터 탐색
		    	for(int i=0; i<s.length();i++) {
		    		if(s.charAt(i) == t)
		    			{p = 0;
		    			answer[i] = p;}
		    		else
		    			{p++;
		    			answer[i] = p;}
		    	}
		    	
		    	//끝에서 탐색하면서 비교
		    	p = 1000; //p값 초기화
		    	for(int i=s.length()-1; i>=0;i--) {
		    		if(s.charAt(i) ==t) p=0;
		    		else {
		    			p++;
		    			answer[i] = Math.min(answer[i], p);
		    		}
		    	}	
		    	return answer;
		    }
	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		char c = kb.next().charAt(0);
		for(int x : T.solution(str, c)) {
			System.out.print(x+" ");
		}
	}
	
}

풀이방법

처음에 나는 원래 문자와 뒤집은것과 비교해서 둘다 배열로 거리를 저장하고 그 배열끼리 비교하면서 작은값을 리턴하려고했다.
그럴 필요없이 0부터 탐색 vs length-1 부터 탐색을 통해 값을 비교하면서 작은값을 리턴해내면 된다.

핵심키워드

  1. for(int i=s.length()-1; i>=0;i--)
    나는 항상 for(int i=0; i<s.length();i++) 처럼 처음부터 탐색하는 for문만 써왔는데...
    왜 이렇게 뒤에서부터 탐색하는 방법을 생각못했을까 ㅠ
  1. p=1000으로 두는이유.
    만약, teachermode 가 아닌 ttteachermode 같이 첫문자와 e까지의 길이가 긴 문자가 온다면, [1,2,3,0] ... 이런식으로 처음에 담기는데,
    이후에 뒤에서 탐색 하는것과 비교할때,[3,2,1,0....]에서 3이 들어가야 정상이지만 answer에는 더 작은값인 1이 이미 담겨있기 때문에 틀린 값이 담겨버린다.
    p=1000이면,
    [1001,1002,1003,0...] vs [3,2,1,0...] 이기때문에 정상적인 값이 담긴다.
    p는 꼭 1000이 아닌 문자열보다 큰 넉넉한 값.

0개의 댓글