개발자는 기록이 답이다

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(문자열_특정 문자 뒤집기) 본문

알고리즘/인프런 - Java알고리즘 입문

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(문자열_특정 문자 뒤집기)

slow-walker 2023. 8. 27. 03:29

 

https://cote.inflearn.com/contest/10/problem/01-05

 

OnlineJudge

 

cote.inflearn.com

(위의 링크는 인프런 로그인 후, 해당 강의를 사지 않으면 접속이 되지 않습니다)

 

5. 특정 문자 뒤집기

 

예시 입력 1 

a#b!GE*T@S

예시 출력 1

S#T!EG*b@a

 

내가 푼 틀린 풀이

예시 입출력대로 나와서 제출했더니, 오답이라고 나온다

알고보니 내가 푼 풀이는 앞과 뒤에 위치한 각 인덱스가 알파벳일때만 가능하고, 아래 예시처럼 서로 알파벳이 아닌경우에는 안된다

// 입력값
kdj#@kdjg%$#kdjgk@kd$dk

// 리턴값
kd$#@@kgj%$#kdgjdkkdjdk

// 정답값
kdd#@kkgj%$#dkgjd@kj$dk

 

import java.util.Scanner;

public class Main {

    public String solution(String str) {
        String answer = "";
        char[] strCharArray = str.toCharArray();
        int lt = 0, rt = strCharArray.length - 1;
        int idx = 0;
        while (lt < rt) {
            char tmp = strCharArray[lt];
            if ((strCharArray[idx] >= 'a' && strCharArray[idx] <= 'z') ||
                    (strCharArray[idx] >= 'A' && strCharArray[idx] <= 'Z')) {
                strCharArray[lt] = strCharArray[rt];
                strCharArray[rt] = tmp;
                lt ++;
                rt --;
                idx ++;
            } else {
                lt ++;
                rt --;
                idx ++;
            }
        }
        String string = String.valueOf(strCharArray);
        return string;
    }

    public static void main(String[] args) {
        Main main = new Main();
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        System.out.println(main.solution(str));

    }
}

 

내가 푼 맞은 풀이

 

그래서 lt가 알파벳일 경우, rt가 알파벳일 경우를 분기처리를 따로 해서, 아니면 한칸씩 이동하고,

둘다 알파벳일 경우에는 문자를 바꿔주도록 풀었다

import java.util.Scanner;

public class Main {

    public String solution(String str) {
        String answer = "";
        char[] strCharArray = str.toCharArray();
        int lt = 0, rt = strCharArray.length - 1;
        while (lt < rt) {
            if (!(strCharArray[lt] >= 'a' && strCharArray[lt] <= 'z') &&
                    !(strCharArray[lt] >= 'A' && strCharArray[lt] <= 'Z')) {
                lt ++;
            } else if (!(strCharArray[rt] >= 'a' && strCharArray[rt] <= 'z') &&
                    !(strCharArray[rt] >= 'A' && strCharArray[rt] <= 'Z')) {
                rt --;
            } else {
                char tmp = strCharArray[lt];
                strCharArray[lt] = strCharArray[rt];
                strCharArray[rt] = tmp;
                lt ++;
                rt --;
            }
        }
        answer = String.valueOf(strCharArray);
        return answer;
    }

    public static void main(String[] args) {
        Main main = new Main();
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        System.out.println(main.solution(str));

    }
}

 

 

강의 답안

알고보니 Character클래스에서 isAlphabetic()이라는 함수가 있어서 분기처리를 쉽게 할 수 있었다!

import java.util.Scanner;

public class Main {

    public String solution(String str) {
        String answer = "";
        char[] strCharArray = str.toCharArray();
        int lt = 0, rt = strCharArray.length - 1;
        while (lt < rt) {
            char tmp = strCharArray[lt];
            if (!Character.isAlphabetic(strCharArray[lt])) {
                lt ++;
            } else if (!Character.isAlphabetic(strCharArray[rt])) {
                rt --;
            } else {
                strCharArray[lt] = strCharArray[rt];
                strCharArray[rt] = tmp;
                lt ++;
                rt --;
            }
        }
        answer = String.valueOf(strCharArray);
        return answer;
    }

    public static void main(String[] args) {
        Main main = new Main();
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        System.out.println(main.solution(str));

    }
}