알고리즘 문제 해결: 문자열 뒤집기 및 문자 교체

  1. 문자열 뒤집기

해결 접근법:

양쪽 끝에서 시작하는 이중 포인터를 사용하여 문자 순서를 교환하다가 좌우 포인터가 만날 때까지 반복합니다;

이 문제에는 또한 XOR 연산자를 활용한 요소 교환 방식도 있습니다.

public void reverseString(char[] s) {
    // 이중 포인터 방식으로 문자 순서 교환
    int left = 0;
    int right = s.length - 1;
    while(left < right){
        // left와 right 위치 문자 교환
        // char temp;
        // temp = s[left];
        // s[left] = s[right];
        // s[right] = temp;

        // XOR 연산자 활용
        s[left] ^= s[right];  // a ^ b 결과 생성 및 a에 저장
        s[right] ^= s[left];  // a ^ b 결과를 다시 ^ b하여 b에 저장, 이때 b = a, a = a ^ b
        s[left] ^= s[right];  // a ^ b 결과를 다시 ^ a하여 a에 저장, 이때 b = a, a = b로 교환 완료
        left++;
        right--;
    }
}
  1. 문자열 II 뒤집기

해결 접근법:

먼저 문제를 분석하여 뒤집어야 할 구간이 [n * 2k, Math.min(n * 2k + k - 1, ch.length - 1)]임을 파악합니다. 필요한 구간을 찾은 후, 다시 이중 포인터 방법으로 위치를 교환할 수 있습니다.

public String reverseStr(String s, int k) {
    // 문자열을 배열로 변환
    char[] ch = s.toCharArray();
    for(int i = 0; i < ch.length; i = i + 2 * k){
        // 뒤집을 배열 구간 찾기
        int start = i;
        // 길이가 k보다 짧으면 ch.length - 1 값이 선택되고, [start,ch.length - 1] 구간이 뒤집힘
        int end = Math.min(start + k - 1, ch.length - 1);
        while(start < end){
            ch[start] ^= ch[end];
            ch[end] ^= ch[start];
            ch[start] ^= ch[end];
            start++;
            end--;
        }
    }
    return new String(ch);
}

카드망: 54. 숫자 교체

해결 접근법:

  1. 먼저 원래 문자열에 숫자가 얼마나 있는지 확인합니다;

  2. 숫자의 개수를 바탕으로 새 배열의 길이를 계산하고 배열을 초기화합니다;

  3. 문자열을 뒤에서부터 순회합니다. 문자를 만나면 바로 채우고, 숫자를 만나면 'number'를 거꾸로 채웁니다. 순회가 끝나면 답을 얻을 수 있습니다.

참고: 이 문제는 ACM 모드 코드를 사용하며, 데이터 입출력을 직접 작성해야 합니다. 이 부분은 초보자에게 다소 생소할 수 있습니다.

// ACM 모드 코드
import java.util.*;

public class Main{
    public static String replaceNumber(String s){
        // 문자열을 배열로 변환
        int length = s.length();
        // 1. 배열에 숫자가 몇 개 있는지 먼저 확인
        int digitCount = 0;
        for(int i = 0; i < length; i++){
            if(Character.isDigit(s.charAt(i))){
                digitCount++;
            }
        }
        // 2. 새 배열 생성, 길이는 원래 배열 길이에 숫자 개수 * 5를 더한 값
        int newLength = length + digitCount * 5;
        char[] newArr = new char[newLength];
        int index = newLength - 1; // 새 배열의 인덱스
        // 뒤에서부터 새 배열 채우기 시작
        for (int i = length - 1; i >= 0; i--){
            char c = s.charAt(i); // 문자열에서 해당 인덱스 문자 가져오기
            if (Character.isDigit(c)){
                // 숫자이면 'number' 채우기
                newArr[index--] = 'r';
                newArr[index--] = 'e';
                newArr[index--] = 'b';
                newArr[index--] = 'm';
                newArr[index--] = 'u';
                newArr[index--] = 'n';
            } else {
                // 숫자가 아니면 문자 그대로 채우기
                newArr[index--] = c;
            }
        }
        return new String(newArr);
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.next();
        System.out.println(replaceNumber(input));
        scanner.close();
    }
}

태그: java 문자열 처리 알고리즘 자료구조 이중 포인터

7월 16일 19:45에 게시됨