algorithm - String

Seongjin Jo·2023년 1월 3일
0

algorithm

목록 보기
1/17

💥 문자열 알고리즘


유형

1.문자 찾기

//입력
Computercooler
c

//출력
2
Class String 1{
    public static int solution(String str,char c){
        int answer = 0;
        String s = str.toUpperCase();
        char t = Character.toUpperCase(c);

        for(int i=0; i<s.length(); i++){
            if(s.charAt(i)==t){
                answer ++;
            }
        }

        return answer;
    }

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

풀이
1.입력받은 두 문자를 str.toUpperCase()로 대문자로 만들기
2.str.length까지 for문 돌려서 입력받은 문자 c가 문자열 s의 문자와 같으면 answer ++

[ 주요 기능 ]
String.toUpperCase() : 문자열 대문자 변경
Character.toUpperCase(char) : 문자 대문자 변경
String.charAt(index) : 문자열 문자 접근

2.대소문자 변환

//입력
StuDY

//출력
sTUdy
class String2 {
    public static String solution(String str) {
        String answer = "";

        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (Character.isUpperCase(c)) {
                answer += Character.toLowerCase(c);
            }
            else if (Character.isLowerCase(c)) {
                answer += Character.toUpperCase(c);
            }

        }
        return answer;
    }

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

풀이
1.문자열 입력받고 문자열 길이 만큼 for문
2.문자열 단어 하나하나가 대문자면 소문자로, 소문자면 대문자로 변경해서 answer에 저장 후 리턴

[ 주요 기능 ]
string.charAt(index) : 문자열 문자접근
Character.isUpperCase() : 대문자인지 판별
Character.toUpperCase() : 대문자로 변경
Character.isLowerCase() : 소문자인지 판별
Character.toLowerCase() : 소문자로 변경

3.문장 속 단어

//입력
it is time to study

//출력
study
class String3 {
    public static String solution(String str) {
        String answer = "";
        String[] s = str.split(" ");
        int len =0;
        for(String x : s){
                if(x.length() > len) {
                    len = x.length();
                    answer = x;
                }
        }
        return answer;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(solution(str));
    }
}

풀이
1.split(" ")을 이용해서 공백기준으로 문자열을 잘라서 배열로 받는다.
2.for each문으로 배열의 인덱스에 접근
3.접근한 String x의 길이가 젤 긴 걸 len라 하고 x의 길이가 저장된 len의 길이보다 커야지만 len가 바뀐다. 그렇게 answer = x 로 리턴

[ 주요 기능 ]
string.split("") : 문자열을 ("")기준으로 분리하여 배열로 반환한다.
forEach문으로 배열의 요소에 접근
Scanner입력받을때 nextLine()으로 해야 공백도 인식한다.

4.단어 뒤집기

//입력
3
good
Time
Big

//출력
doog
emiT
giB
class String4 {
    public static ArrayList<String> solution(int n, String[] str) {
        ArrayList<String> answer = new ArrayList<>();

        for(String x : str){
            char[] c = x.toCharArray();
            int lt = 0;
            int rt = x.length() - 1 ;

            while(lt < rt){
                char tmp = c[lt];
                c[lt] = c[rt];
                c[rt] = tmp;
                lt++;
                rt--;
            }
            String s = String.valueOf(c);
            answer.add(s);
        }
        return answer;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        String[] str = new String[n];
        for(int i=0; i<n; i++){
            str[i] = sc.next();
        }
        for(String x : solution(n,str)){
            System.out.println(x);
        }
    }
}

풀이
1.일단 Scanner입력을 몇개 입력할 것인지 n을 입력받는다. 이후에 스트링 배열을 만들어서 n개 만큼 문자열을 입력할수있게 Scanner입력해주고soulution 함수에서 리턴값은 동적 배열이다.
2.forEach문으로 스트링배열에 접근 후, toCharArray()를 이용해서 접근한 string문자열을 char문자로 이루어진 char[]배열로 만든다.
3.lt,rt를 선언해준다. 각각 char[]의 왼쪽 끝, 오른쪽 끝을 뜻한다.
4.while문을 이용해서 문자를 뒤집는다.
5.charArray형태의 char[]이기 때문에 String.valueof()를 이용해서 string 형태로 바꿔서 .add를 이용해서 answer 동적배열에 추가한 후에 리턴

[ 주요 기능 ]
toCharArray() : 문자열 String을 char[] 형태로 변환
lt,rt를 이용한 문자배열 스위치
String.valueOf() : string 형태로 변환
.add : 배열에 string 추가

5.특정 단어 뒤집기

//입력
a#b!GE*T@S

//출력
S#T!EG*b@a
class String5 {
    public static String solution(String str){
        String answer = "";
        char[] c = str.toCharArray();
        int lt =0;
        int rt =c.length -1 ;

        while( lt < rt){
            if(!Character.isAlphabetic(c[lt])){
                lt ++;
            }
            else if(!Character.isAlphabetic(c[rt])){
                rt --;
            }
            else{
                char tmp = c[lt];
                c[lt] = c[rt];
                c[rt] = tmp;
                lt ++;
                rt --;
            }
        }
        answer = String.valueOf(c);
        return answer;
    }

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

풀이
1.문자열을 입력받아서 string.toCharArray()를 이용해 char[] 형태로 바꾼다.
2.lt, rt를 선언해준다
3.while문과 if문을 이용해 알파벳인지 아닌지 판별한 후에 아니라면 lt++,rt--를 각각해준다. 지나친다는 뜻
4.이제 또 다른 경우는 알파벳인 경우이기 때문에 문자를 뒤집는다
5.char[]이기 때문에 String.valueOf()를 이용해서 리턴

[ 주요 기능 ]
String.toCharArray() : 문자열을 char[]형태로
Character.isAlphabetic() : 앞에 Character가 붙어서 char형태의 문자를 알파벳인지아닌지 확인 하는 메서드
String.valueOf() : String 형태로 변환

6.중복 문자 제거

//입력
ksekkset

//출력
kset
class String6 {

    public static String solution(String str){
        String answer = "";
        for(int i=0; i<str.length(); i++){
            if(i == str.indexOf(str.charAt(i))){
                answer += str.charAt(i);
            }
        }


        return answer;
    }

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

풀이
1.for문으로 str문자열의 길이의 끝가지 돌고
2.indexOf를 이용해서 str.charAt(i)문자가 현재 i(index)랑 같은지 비교해서 answer에 저장

[ 주요 기능 ]
stirng.indexOf() : 현재 문자열의 인덱스가 처음 발견되는 인덱스 위치를 반환한다.

7.회문 문자열

//입력
gooG

//출력
YES
public class String7 {
    public static String solution(String str){
        String answer = "";
        String s = str.toUpperCase();

        String reverse = "";
        for (int i = s.length() - 1; i >= 0; i--) {
            reverse += s.charAt(i);
        }

        if(s.equals(reverse)) answer = "YES";
        else  answer = "NO";
        return answer;
    }

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

풀이
1.문자열을 입력받아서 다 대문자로 바꿔준다
2.reverse라는 문자열을 만들어서 for문으로 s.charAt(i)을 역순으로 reverse에 저장한다. 그 후에 s.equals(reverse)를 이용해서 if문으로 결과값 리턴
[ 다른 방식 ]

        StringBuffer sb = new StringBuffer(s);
        String reverse = sb.reverse().toString();

Stringbuffer라는 객체를 이용해서 문자열 s를 Stringbuffer에 담고 그것을 .reverse() 시켜서 간단하게 풀수도 있다.
[ 주요기능 ]
for (int i = s.length() - 1; i >= 0; i--) : 문자열 역순으로 for문
stringA.equals(stringB) : 두 문자 같은지 비교
StringBuffer : 문자열을 담아서 .revse().toString()으로 역순으로 바꾸고 다시 string 형태로 바꿔줄 수 있다.

8.유효한 팰린드롬

//입력
found7, time: study; Yduts; emit, 7Dnuof

//출력
YES
public class String8 {
    public static String solution(String str){
        String answer = "";
        String s = str.toUpperCase();
        String match = "[^A-Z]";
        s = s.replaceAll(match, "");

        String reverse = new StringBuffer(s).reverse().toString();

        if(s.equals(reverse)) answer ="YES";
        else answer="NO";

        return answer;
    }

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

풀이
1.우선, 특수문자나 공백 등 알파벳을 다 제외하고 문자들 끼리의 역순이 맞는지 비교하는 문제이다. 대소문자 상관없다. 그렇기 때문에 받은 문자열 str을 UpperCase() 해준다.
2.replaceAll(정리할 문자,""); 이라는 함수를 이용해서 필요없는 문자를 정리한다.
3.그 후에 StringBuffer(s).reverse().toString();을 이용해서 역순 문자를 만든다
3-2. for문을 역순으로 새로운 문자열을 만들어서 저장해도된다.
4.s.equals(reverse);를 이용해서 비교 후 값 리턴

[ 주요 기능 ]
string.replaceAll.(match,"") : 첫번째 인자값은 어떤 문자를 제외할것인지를 넣는 공간이고, 두 번째는 정리한 문자의 공간을 어떻게 매꿀것인가에 대한 공간이다.
예제에서는 String match = "[^A-Z]"; 이런 식으로 해서 알파벳 A-Z가 아닌 것을 match로 정의 했다 ('^' == 부정)
StringBuffer(string).reverse().toString() : Stringbuffer에 문자열 담아서 역순으로 뒤집고 다시 문자열로

9.숫자만 추출

//입력
g0en2T0s8eSoft

//출력
208
public class String9 {

    public static String solution(String str){
        String answer = "";

        String match = "[^0-9]";
        str = str.replaceAll(match, "");
        answer += Integer.parseInt(str);

        return answer;
    }

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

풀이
1.문자열을 입력받고 숫자를 제외한 모든 문자를 replaceAll(match,"") 한다.
2.Integer.parseInt(str)을 이용해서 정수로 만들어 준다. -> 0208 -> 208

주요 기능
replaceAll(match,"")
Integer.parseInt(str) : 문자를 정수 숫자로.

10.가장 짧은 문자열 거리

//입력
teachermode e

//출력
1 0 1 2 1 0 1 2 2 1 0
public class String10 {

    public static int[] solution(String s, char t){
        int[] answer = new int[s.length()];
        //0번인덱스 왼쪽에는 t가 없기때문에 0값 들어가는 거 방지용
        int p=1000;
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i) == t){
                p=0;
                answer[i] = p;
            }
            else {
                p++;
                answer[i] = p;
            }
        }

        p=1000; //초기화
        for(int i=s.length()-1; i>=0; i--){
            if(s.charAt(i) == t){
                p=0;
            }
            else{
                p++;
                //둘 중에 작은 값
                answer[i] = Math.min(answer[i],p);
            }
        }
        return answer;
    }

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

        for(int x : solution(str, c)){
            System.out.print(x + " ");
        }

    }
}

풀이
1.입력 값은 String s, char t 이고, return 값은 int[] answer 로 생성. 문자를 입력하고 char t -> 'e'라고 가정하자.
2.answer[]에 p라는 값을 담을 것이다. 우선 왼쪽에 있는 e를 기준으로 오른쪽으로 for문을 돌려서 왼쪽의 e와의 거리에따라 p++시켜서 answer[i]에 값을 넣고, e가 나온다면 p=0;으로 초기화 시킨다음 다시 ++ 시키면서 answer[i]를 채워나간다.
3.이번엔 [] 뒤에서 부터 앞으로 for문을 돌린다. 오른쪽 e와의 거리를 측정한다. 처음 for문과 같이 e랑 같으면 p=0;으로 초기화시키고 e랑 다르면 p++해서 answer[i]에 값을 채워나간다. 근데 여기서는 현재 존재하는 answer[i]와 p를 비교 즉, Math.min(answer[i],p)를 해서 최솟값을 배열에 담아서 answer[]를 완성시킨 후 리턴한다.

[ 주요 기능 ]
배열의 양 끝 같의 오른쪽 왼쪽에는 e가 없기 때문에 그 위치의 배열에는 p=1의 값이 저장될수 있기 때문에 p를 아예관계없는 숫자로 지정한다.

11.문자열 압축

//입력
KKHSSSSSSSE

//출력
K2HS7E
    public static String solution(String str){
        String answer = "";
        str = str + " ";
        int p=1;
        for(int i=0; i<str.length()-1; i++){
            if(str.charAt(i) == str.charAt(i+1)){
                p++;
            }
            else if(str.charAt(i) != str.charAt(i+1)){
                answer += str.charAt(i);
                if(p>1) {
                answer += String.valueOf(p);
                }
                p=1;
            }
        }
        return answer;
    }

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

풀이
1.str을 입력받아 p라는 int형 정수를 1로 초기화한다.
2.str을 for문을 돌리고 str.CharAt(i) == str.CharAt(i+1)인지 비교하고 맞으면 p++ 아니면 str.CharAt(i)를 answer에 저장. 그리고 p가 1보다 크면 같이 answer에 저장. 그런식으로 answer 리턴
3. i+1을 for문으로 하기 때문에 range error 방지용으로 처음에 str에 + " "로 한자리 더 만들어준다.

[ 주요 기능 ]
String.valueOf(p) : int형을 string형으로 변환

12.암호

//입력
4
#****###**#####**#####**##** 

//출력
COOL
    public static String solution(int n, String str){
        String answer ="";
        for(int i=0; i<n; i++){
            String tmp = str.substring(0,7).replace('#','1').replace('*','0');
            int num = Integer.parseInt(tmp,2);
            answer += (char) num;
            str = str.substring(7);
        }
        return answer;
    }

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

풀이
1.하나의 문자열을 받아서 n개의 암호문자를 만드는 문제이다.
2.subString(0,7)을 해줘서 7문자씩 짜르고 '#'->1,'*'->0 으로 2진수로이루어진 문자로 만들어준다. 그 문자열을 integer.parseInt(tmp,2)해서 2진수를 10진수로 변환해준다. 그러고 그 숫자를 (char) num 해줘서 그 숫자번호에 맞는 문자로 변환해서 answer에 담는다.
3.그 후에 다시 str = str.substring(7)해줘서 계속 7문자씩 자른다.

[ 주요기능 ]
string.substring(0,7) : 0~6번 인덱스 까지 7문자 짜른다.
sting.substring(7) : 7번 인덱스 부터 다시.
Integer.parseInt(tmp,2) : 2진주를 주입받아서 10진수 정수로 변환
(char) num : int 형 num을 char형 문자로 변환.

0개의 댓글