본문 바로가기

자바 자료구조 알고리즘/문자열 & 배열 & 투포인터 & 정렬

코딩 테스트 Java 문자열 문제 풀이

개요와 목적

자바의 문자열 문제를 풀면서, 문자열을 다루는 기능들에 대해서 알아보자.

문제 1. 대소문자 변환

String str = “SpEdCaR” 문자열 str의 각 알파벳을 소문자는 대문자로 대문자는 소문자로 바꿔보자.

풀이

public class Main{
    public static void main(String[] args){
        String str = "SpEdCaR";
        char[] chars = str.toCharArray();
        StringBuilder sb = new StringBuilder();

        for (char c : chars) {
            if (Character.isLowerCase(c)) {
                sb.append(Character.toUpperCase(c));
            } else {
                sb.append(Character.toLowerCase(c));
            }
        }
        System.out.println(sb.toString());
    }
}

설명

Character 클래스 메소드 중에 해당 Char이 소문자인지 판단해주는 메소드를 사용하고, Char를 대 소문자로 변형해주는 메소드를 사용하면 된다.

String class를 변형시킬 때는, String Array보다, CharArray로 만들어서 해결하는 것이 좋다. 각 단어를 Char로 분리하면 Character Class로 할 수 있는 게 많아진다.

isDigit, isAlphabetic 같은 기능들

문제 2. 단어 뒤집기

String str =”DAMAGE”의 뒤집어 보기

풀이

String answer = new StringBuilder(str).reverse().toString();

StringBuilder를 사용하면, 문장을 뒤집을 수 있다.

StringBuild의 추가적 기능들

append(뒤에 문자 추가), delete(원하는 위치 삭제), insert(원하는 위치에 문자 추가), indexOf(문자 위치 찾기) 등등

문제 3. 특정 문자 뒤집기

a#b!GE*T@S

풀이

tocharArray와 Character.isAlphabetic를 사용해서 각 단어들이 알파벳인지 아닌지 파악한다.

lt rt 알파벳 지점인 것을 확인 한 후에 서로의 위치를 바꾼다.

그리고 rt가 lt 보다 커질 때까지 반복한다.

import java.util.Scanner;

public class 특정문자뒤집기 {

    public static String solution(String str) {
        char[] s = str.toCharArray();
        int lt = 0;
        int rt = s.length - 1;
        while (lt < rt) {
            if(!Character.isAlphabetic(s[lt])) lt++;
            else if(!Character.isAlphabetic(s[rt])) rt--;
            else{
                //lt와 rt가 지칭하는 char이 모두 알파벳일 때, 서로 교환한다.
                char tmp=s[lt];
                s[lt]=s[rt];
                s[rt]=tmp;
                lt++;
                rt--;
            }
        }
        return String.valueOf(s);
    }

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

문제 4. 중복 문자 제거 가장 처음 발견되는 문자 발견하기

ksekkset

풀이

Stirng.indexOf()는 파라미터로 들어온 char이 String에서 가장 처음 존재하는 위치를 알려준다.

예를 들어서, Strings str =”abcb”가 있을 때 str.indexOf(’b’)를 입력하면 b가 가장 처음 등장하는 index 1 을 반한다. 해당 메소드를 사용해서 푼다.

import java.util.Scanner;

public class 중복문자제거 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        String answer = "";
        for (int i = 0; i < str.length(); i++) {
            //해당 문자열의 각 문자가 가장 처음 등장하는 알파벳이라면 answer에 추가한다.
            if (str.indexOf(str.charAt(i)) == i) {
                answer += str.charAt(i);
            }
        }
        System.out.println(answer);
    }
}

문제 5. 유효한 팰린드롬(알파벳만 남기기+정규식 사용)

“found7, time: study; Yduts; emit, 7Dnuof” 해당 문자열을 알파벳인 것만 놔두고 나머지를 지운 문자열을 구해라 (대소문자 구분할 필요 없다)

풀이

public class Main{

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();

        String answer = str.toUpperCase().replaceAll("[^A-Z]", "");
        System.out.println(answer);
				//FOUNDTIMESTUDYYDUTSEMITDNUOF
    }
}

문제 6. 가장 짧은 문자 거리

teachermode e

풀이

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        char t = sc.next().charAt(0);
        int[] answer = new int[s.length()];

        int p = 100;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == t) {
                p = 0;
            }
            answer[i] = p;
            p++;
        }
        System.out.println(Arrays.toString(answer));

        p = 100;
        for (int i = s.length()-1; i >=0 ; i--) {
            if (s.charAt(i) == t) {
                p = 0;
            }
            answer[i] = Math.min(answer[i], p);
            p++;
        }
        System.out.println(Arrays.toString(answer));
    }
}

문제 7. 문자열 압축 하기

KKHSSSSSSSE

풀이

import java.util.Scanner;

public class 문자열압축 {

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

        String answer = "";
        String s = str + " ";
        int cnt = 1;
        for (int i = 0; i < str.length(); i++) {
            if (s.charAt(i) == s.charAt(i + 1)) {
                cnt++;
            } else {
                answer += s.charAt(i);
                if (cnt > 1) {
                    answer += String.valueOf(cnt);
                }
                cnt = 1;
            }
        }
        System.out.println(answer);
    }
}