문자열 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)
'알고리즘 > Java 코딩 테스트 준비' 카테고리의 다른 글
[Java] 아스키코드 비밀 암호 해독하기 (0) | 2023.01.30 |
---|---|
[Java] 문자열 내 연속된 문자 Counting 압축 (0) | 2023.01.29 |
[Java] 문자와 숫자가 섞여있는 문자열 중 숫자만 추출해라 (0) | 2023.01.27 |
[Java] 앞뒤로 읽을 때 같은 문자(특수 문자 제거 후 읽기=>정규식 활용) (0) | 2023.01.25 |
[java] 회문(앞에서 뒤에서 읽을 때 같은 문자) 문자열 풀기 (0) | 2023.01.24 |
댓글