상세 컨텐츠

본문 제목

[Java] 연습문제3 - Replace 없이 특정 문자열 원하는 문자로 바꾸기

Java/제로베이스

by Gopythor 2023. 1. 7. 23:20

본문

728x90
반응형

Practice3

문제 설명

자바의 String 자료형에는 많은 연산자 기능들이 있다.

프로그래밍의 기본기를 익히기 위해 일부 연산자들을 제한하고 다음의 기능을 구현하려 한다.

  • String 의 replace 기능 구현
  • String의 replace, indexOf, contains를 사용하지 않고 구현한다.

입출력 예시

 

입력 문자열 from to 출력
"Hello Java, Nice to meet you! Java is fun!" "Java" "자바" "Hello 자바, Nice to meet you! 자바 is fun!"
POP P W WOW

 

모범 코드

public static String solution(char[] str, char[] find, char[] to) {
    int idx = 0;
    String replaceStr = "";
    char[] replaceBucket = str.clone();

    do {
        idx = findIndex(replaceBucket, find);
        if (idx != -1){
            for (int i = 0; i < idx; i++) {
                replaceStr +=replaceBucket[i];
            }
            for (int i = 0; i < to.length; i++) {
                replaceStr += to[i];
            }
            for (int i = idx + find.length; i < replaceBucket.length ; i++) {
                replaceStr += replaceBucket[i];
            }
            replaceBucket = replaceStr.toCharArray();
            replaceStr = "";
        }
    } while(idx != -1);
    replaceStr = new String(replaceBucket);
    return replaceStr;
}

public static int findIndex(char[] str, char[] find) {
    int idx = -1;
    boolean isMatch = false;

    for (int i = 0; i < str.length; i++) {
        if (str[i] == find[0] && str.length - i >= find.length){
            isMatch = true;
            for (int j = 1; j < find.length; j++){
                if (str[i + j] != find[j]){
                    isMatch = false;
                    break;
                }
            }
        }
        if (isMatch){
            idx = i;
            break;
        }
    }
    return idx;
}


solution 

  • idx는 찾는 문자열이 있는 인덱스 번호이다
  • replaceStr은 버퍼로 쓰이는 문자형이다.
  • replaceBucket은 완성된 문자열을 가지고 있다. 또한 deep copy되어 원래 객체에는 영향을 주지 않는다(메모리 동일X)
  • findIndex함수는 매칭되는 단어가 없다면, 문자열의 끝까지 탐색한다.
  • do-while 반복문이 있고, while은 -1이 아니면, 계속 반복될 것이다.

findIndex

  • idx는 -1로 지정되어, 문자열의 끝까지 다 돌아도 해당 단어가 없다면 -1을 그대로 리턴할 것이다.
  • 첫 번째 for문은 문자열의 끝까지 탐색한다.
  • if문은 i번째 문자와 찾고자하는 값이 같고, 시작하는 인덱스 값에서 i번째를 뺀 값이 find의 길이와 같거나 긴지를 검사한다. 왜냐하면 남은 문자열이 찾는 단어보다 짧다면 검사할 이유가 없기 때문이다.
  • 첫글자와 남은 문자열의 길이 등의 조건이 일치하다면 isMatch는 true를 받는다.
  • 다음 for문에서는 초기값 j가 1이다. 왜냐하면 이미 첫번째 자리를 검사했기 때문이다.
  • 찾는 값과 일치하다면 idx는 해당 찾은 문자 인덱스의 시작 값을 리턴해줄 것이고 do -while로 돌아갈 것이다. 못 찾았다면, break로 for문의 처음으로 돌아온다.

do-while

  • idx가 -1이 아닌 값이 입력되면, 첫번째 for문에서는 idx 전까지 문자를 replaceStr에 복사한다.
  • 두번째 for문에서는 바뀔 단어가 입력된다.
  • 세번째 for문에서는 남은 단어가 replaceStr에 복사된다.
  • 그리고 그 replaceStr값이 다시 replaceBucket으로 복사된다.
  • 최종적으로는 replaceStr이 리턴된다. 값이 바뀌지 않아도 bucket 문이 최종적으로 전달된다.

 

 

내 코드

public static String solution(char[] str, char[] find, char[] to) {
    String ans = "";
    for(int i = 0; i < str.length; i++){
        if (str[i] !=find[0]){
            ans+=str[i];

        } else {
            boolean check = false;
            for(int j = 0; j < find.length; j++){
                if (find[j] == str[i+j]){
                    check = true;
                } else {
                    check = false;
                    break;
                }
            }
            if (check == false){
                ans+=str[i];
            } else {
            ans+= String.valueOf(to);
            i += find.length-1;
            check = false;
            }
        }
    }
    return ans;
}
  • String ans 선언하여 출력할 문자열을 받는다.
  • if 문은 문자열을 순회하는데, 찾고자하는 문자의 시작과 같은 값을 찾고, 아니면 기존 문자를 추가한다.
  • 찾고자하는 문자의 첫글자와 같은 문자를 만나면, else로 빠져 전체를 비교하게 된다.
  • 처음과 끝까지 같은 숫자라면, check는 true를 유지하고, 틀리게 되면 false와 break로 탈출하게 된다.
  • check if문에서는 false 인 경우, 검사된 글자를 그냥 추가하고, true 인 경우는 일치된 문자 위치에 바꿀 문자를 삽입하한다.
  • 그리고 i는 기존 문자 길이만큼 스킵한다. -1은 위의 루프에서 1을 또 더하기 때문이다. 
    ex ) java -> j에서 find.length로 +4 되면, a의 공백 끝 문자를 가리키지만, for문에서 1을 또 더하기 때문에 빼야 한다.
  • 루프가 끝나면 완성된 string을 리턴한다.
728x90
반응형

관련글 더보기

댓글 영역