본문 바로가기

CodingTest Practice

[인프런] 특정 문자 뒤집기

특정 문자 뒤집기

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

 

■ 문제 풀이

1) 입력 설명
- 첫 줄에 길이가 100을 넘지 않는 문자열이 주어진다.

2) 출력 설명
- 첫 줄에 알파벳만 뒤집힌 문자열을 출력

3)테스트
- input : kdj#@kdjg%$#kdjgk@kd$dk
- output : kdd#@kkgj%$#dkgjd@kj$dk

- input : kHSHHS#qQ!DGSG#@Sdj#@kd#g%$#kdj&&gk@kd$d#%&DGS@!DH%SQGk#
- output : kGQSHD#SG!Dddk#@kgj#@dk#g%$#dkj&&dS@GS$G#%&DQq@!SH%HSHk#

4) 문제 풀이
- 첫번째 solution에서는 String 클래스의 split() 함수를 사용하여 문자열을 자른 후, 정규표현식을 통해 영어인지 문자인지를 판별
- 두번째 solution에서는 Character 클래스의 isAlphabetic() 함수를 사용하여 문자열을 이루는 문자가 영어인지 문자인지를 판별
- 두번째 solution이 더 간결하고 가독성이 좋다.

 

import java.util.Scanner;

public class SpecialTurnOver {

    private String solution(String input) {
        String answer = "";
        String[] strings = input.split("");

        int lt = 0;
        int rt = strings.length - 1;

        while (lt < rt) {
            if (strings[lt].matches("[A-Za-z]") && strings[rt].matches("[A-Za-z]")) {
                String tmp = strings[lt];
                strings[lt] = strings[rt];
                strings[rt] = tmp;
                lt++;
                rt--;
            } else if (strings[lt].matches("[A-Za-z]")) {
                rt--;
            } else if (strings[rt].matches("[A-Za-z]")) {
                lt++;
            } else {
                lt++;
                rt--;
            }
        }

        for (String s : strings) {
            answer += s;
        }

        return answer;
    }

    private String solution2(String input) {
        String answer = "";
        char[] chars = input.toCharArray();
        int lt = 0;
        int rt = chars.length - 1;

        while (lt < rt) {
            if (!Character.isAlphabetic(chars[lt])) {
                lt++;
            } else if (!Character.isAlphabetic(chars[rt])) {
                rt--;
            } else {
                char tmp = chars[lt];
                chars[lt] = chars[rt];
                chars[rt] = tmp;

                lt++;
                rt--;
            }
        }

        answer = String.valueOf(chars);
        return answer;
    }

    public static void main(String[] args) {
        SpecialTurnOver convertString = new SpecialTurnOver();

        Scanner scanner = new Scanner(System.in);
        String input = scanner.next();

        System.out.println(convertString.solution(input));
        System.out.println(convertString.solution2(input));
        return;
    }
}

 

'CodingTest Practice' 카테고리의 다른 글

[인프런] 회문 문자열  (0) 2022.04.03
[인프런] 중복문자제거  (0) 2022.04.02
[인프런] 단어 뒤집기  (0) 2022.03.30
[인프런] 문장 속 단어  (0) 2022.03.29
[인프런] 대소문자 변환  (0) 2022.03.29