본문 바로가기
알고리즘/Java 코딩 테스트 준비

[Java] 특정 문자와 가장 짧은 거리 배열로 출력하기

by Dev dreamer 2023. 1. 28.

 

문자열 s 와 문자열 t 를 입력받는다.(소문자로만)

입력 : 문자열 (공백) 특정 문자

ex)welcomehome e

 

출력 : 특정 문자 기준으로 문자열에서 각 문자의 거리

ex)1 0 1 2 2 1 0 1 2 1 0 

 

💡나의 생각 및 풀이 과정


 

처음에 도저히 감이 안잡혔다. 그래서 강의를 통해 앞부분 힌트를 얻고 시작했다.

 

 

강사님은 문자열을 문자 배열에 담고

왼쪽기준으로부터의 e와의 거리와

오른쪽 기준으로부터의 e 와의 거리를 한번씩 구하라고 하셨다.

 

여기까지 듣고 아 한번씩 구한 거리 값을 각각 배열에 담고 최소값들만 배열에 한번 따로 담으면 되겠다.

 

라고 생각이 들었다.

 

처음에 cnt를 1000으로 해놓는 이유는 어차피 왼쪽 오른쪽 기준으로 e 와의 거리의 최소값을 구할 것이니까

1000으로 해도 작은값이 들어와서 상관이 없는데 만약 0으로 해놓으면 그 값이 최소값이 되어서 결과값에 영향을 줄수 있기 때문에 초기값을 크게 설정해 두었다.

 

왼쪽과 오른쪽(str.length-1-i) 기준으로 for문을 두번 돌려서 각 배열에 담아준다.

이때 한번 오류가 발생했는데 거꾸로 읽어주는 right 배열에 넣을때 

오른쪽 기준으로 거리를 측정해 놓고 정작 데이터 값은 rhgit[ i ] 부터 넣어서 값이 다르게 나왔다.

넣을때에도 right[str.length() -i -1] 로 넣어주어야 한다.

 

이후에 left 값이 더 크거나 같으면 더 작은 최소값인 오른쪽 배열을 넣어주고

else일때 그 반대 동작을 하면 된다.

 

그리고 항상 배열값을 출력할 때에는 for문으로!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	public int[] solution(String str, char ch) {

		int[] answer = new int[str.length()];
		int[] left = new int[str.length()];
		int[] right = new int[str.length()];

		char[] carr = str.toCharArray();
		int cnt = 1000;
		int cnt2 = 1000;

		for (int i = 0; i < str.length(); i++) {
			if (carr[i] != ch) {
				cnt++;
			} else {
				cnt = 0;
			}
			left[i] = cnt;
		}
		for (int i = 0; i < str.length(); i++) {
			if (carr[str.length() - i - 1] != ch) {
				cnt2++;
			} else {
				cnt2 = 0;
			}
			right[str.length()-i-1] = cnt2;
		}
		for (int i = 0; i < str.length(); i++) {
			if (left[i] >= right[i]) {
				answer[i] = right[i];
			} else {
				answer[i] = left[i];
			}
		}
		


		return answer;
	}

	public static void main(String args[]) throws IOException {

		Main T = new Main();

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		String str=st.nextToken();
		char ch=st.nextToken().charAt(0);
		

		
		for(int i=0; i<str.length(); i++) {
			System.out.print(T.solution(str, ch)[i]+" ");
		}		
	}

}

💡 강사님 풀이


강사님은 왼쪽은 배열에 넣고 오른쪽은 배열이 아닌 변수값 하나 지정해서 비교

 

 

 

코테 관련해서 많이 부담스러웠는데 강의를 통해 푸는 방법들을 배우니 이 시간이 즐겁습니다.

진짜 기능하나하나 다양한 방법으로 잘 가르쳐주십니다.

출처 : 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 대시보드 - 인프런 | 강의 (inflearn.com)

댓글