본문 바로가기

코딩테스트/자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

섹션 1. 문자열 - 5. 특정 문자 뒤집기

📌 문제 설명

영어 알파벳과 특수문자로 구성된 문자열이 주어지면 영어 알파벳만 뒤집고, 특수문자는 자기 자리에 그대로 있는 문자열을 만들어 출력하는 프로그램을 작성하세요.

  • 문자열의 길이는 최대 100입니다.
  • 영어 알파벳과 특수문자가 포함될 수 있습니다.
  • 특수문자는 원래 위치를 유지해야 합니다.

📝 입력 & 출력

🔹 입력

  • 첫 번째 줄: 길이가 100을 넘지 않는 문자열 (영어 알파벳 + 특수문자 포함)

🔹 출력

  • 첫 번째 줄: 알파벳만 뒤집힌 문자열 출력

🔸 예제 입력 1

a#b!GE*T@S

🔸 예제 출력 1

S#T!EG*b@a

💡 해결 방법

  1. 투 포인터(two-pointer) 알고리즘 활용
    • lt (왼쪽)과 rt (오른쪽)에서 시작
    • 두 포인터가 알파벳을 찾으면 위치를 교환
    • 특수문자는 그대로 유지
  2. 문자열을 문자 배열로 변환 (toCharArray())
    • 문자열을 직접 수정할 수 있도록 배열로 변환
  3. Character.isAlphabetic()로 알파벳 여부 확인
    • 알파벳이 아닌 경우 포인터 이동

💻 코드 구현 (Java)

package partString;

import java.util.*;

public class Problem5 {

    public String solution(String str) {
        char[] s = str.toCharArray();
        int lt = 0, rt = str.length() - 1;
        
        while (lt < rt) {
            if (!Character.isAlphabetic(s[lt])) lt++;
            else if (!Character.isAlphabetic(s[rt])) rt--;
            else {
                char tmp = s[lt];
                s[lt] = s[rt];
                s[rt] = tmp;
                lt++;
                rt--;
            }
        }
        
        return String.valueOf(s);
    }
    
    public static void main(String[] args) {
        Problem5 T = new Problem5();
        Scanner kb = new Scanner(System.in);
        String str = kb.next();
        System.out.println(T.solution(str));
        kb.close();
    }
}

📖 코드 설명

1️⃣ toCharArray()를 사용하여 문자열을 배열로 변환

char[] s = str.toCharArray();
  • 문자열을 직접 수정할 수 있도록 배열로 변환

2️⃣ 투 포인터 알고리즘을 활용하여 문자 교환

int lt = 0, rt = str.length() - 1;
while (lt < rt) {
    if (!Character.isAlphabetic(s[lt])) lt++;
    else if (!Character.isAlphabetic(s[rt])) rt--;
    else {
        char tmp = s[lt];
        s[lt] = s[rt];
        s[rt] = tmp;
        lt++;
        rt--;
    }
}
  • lt는 왼쪽에서 오른쪽으로 이동
  • rt는 오른쪽에서 왼쪽으로 이동
  • 알파벳이 아닌 경우 건너뛰고, 알파벳이면 교환
  • 특수문자는 그대로 유지됨

3️⃣ 문자열로 변환 후 반환

return String.valueOf(s);
  • 배열을 다시 문자열로 변환하여 반환

⏳ 시간 복잡도 분석

  • O(n) (n: 문자열 길이)
  • 문자열을 한 번만 순회하면서 문자를 교환하므로 최적의 시간 복잡도

출처: 인프런 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

 

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 | 김태원 - 인프런

김태원 | , 자바(Java) 알고리즘 문제풀이 채점사이트를 통해 기초부터 준비해보세요! 💪 [사진] 이 강의는 [사진] 자바(Java)로 코딩테스트 준비를 하고 계신 분께 추천드려요! 문제는 기초~ 중급

www.inflearn.com