CS 기초/알고리즘 · 문제풀이

[JAVA] 문자열(String) - 단어 뒤집기 / 특정 문자 뒤집기 / 중복 문자 제거

sofiaaa 2022. 2. 13. 19:51
반응형

단어 뒤집기

 

내 코드 (정답)

답은 맞았으나 그렇게 효율적이지는 않은 듯 하다.

import java.util.*;

public class Main {
    public String solution(String str){
        String answer = "";
        int index = str.length();

        for(int i = 0; i < str.length(); i++){
            answer += str.charAt(index - 1);
            index = index -1;
        }

        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        int t = kb.nextInt();
        List<String> array = new ArrayList<>();
        for (int i =0; i < t ; i++){
            String str = kb.next();
            array.add(T.solution(str));
        }

        for(String x : array){
            System.out.println(x);
        }

    }
}

 

정답 코드

import java.util.*;

public class Main {
    public ArrayList<String> solution(int n, String[] str){
        ArrayList<String> answer = new ArrayList<>();

        for(String x : str){
            // StringBuilder - 처음에 만든 객체로 변경되서 메모리 낭비 줄일 수 있다.
            String tmp = new StringBuilder(x).reverse().toString();
            answer.add(tmp);
        }

        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        String[] str= new String[n];
        for (int i =0; i < n ; i++){
            str[i] = kb.next();
        }

        for(String x : T.solution(n, str)){
            System.out.println(x);
        }
    }
}

 

 

특정 문자 뒤집기

 

내 코드 (오답)

for 루프 늪에 빠져버렸다.

Character.isAlphabetic 을 사용해야 한다.

 

import java.util.*;

public class Main {
    public String solution(String str){
        String answer = "";

        char[] ss = new char[str.length()];
        for(int i = 0; i < str.length(); i++){
            ss[i] = str.charAt(i);
        }


        for(int x = 0; x < str.length(); x++){
            if(Character.isAlphabetic(str.charAt(x))){
                for(int y = str.length() - 1 ; y > -1; y--){
                    if(Character.isAlphabetic(str.charAt(y))){
                        ss[x] = str.charAt(y);
                        ss[y] = str.charAt(x);
                        if(x != y){
                            str.substring(x, y);
                        }
                        break;
                    }
                }
            }
        }

        for(char x : ss){
            answer += x;
        }


        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        String str = kb.nextLine();
        System.out.print(T.solution(str));
    }
}

 

정답 코드

 

import java.util.*;
class Main {	
	public String solution(String str){
		String answer;
		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--;
			}
		}
		answer=String.valueOf(s);
		return answer;
	}

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

 

 

중복 문자 제거

 

indexOf(charAt(i))

처음으로 발견되는 위치와 그 특정 문자의 위치가 같을 때만 추가해주는 로직

import java.util.*;

public class Main {
    public String solution(String str){
        String answer = "";

        // ** indexOf(charAt()) 처음으로 발견되는 위치

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

        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        String str = kb.next();
        System.out.print(T.solution(str));
    }
}
반응형