(String)문장 속 단어/단어 뒤집기

-·2023년 12월 7일
0

Inflearn-basicTest

목록 보기
2/27

문장 속 단어

StringTokenizer

  • new StringTokenizer(문자열, "구분자")

String.split("정규표현식")

  • split() : 비정형화된 문자열 분리할 때 좋다.
    (공백 문자열 값 포함) -> 배열객체에 담아준다.
    String[] empArr1 = emp1.split("/");
    split("/",나누고싶은토큰개수); -1을 넣어주면 마지막에 공백이 있으면 그것도 표현해준다.

indexOf

str.indexOf()
문자열에서 특정 문자를 탐색해서 처음 일치하는 인덱스 위치를 정수형으로 반환한다. 단, 일치하는 문자가 없는 경우 -1을 반환한다. ()안에 문자, 문자열 다 가능하다.

substring

substring
문자열의 일부분을 잘라내어 새로운 문자열 반환. 원본 영향 x substring(시작index, 끝index +1) ->(0,3)으롤 주면
index 0~2까지 잘린다.


* 설명
한 개의 문장이 주어지면 그 문장 속에서 가장 긴 단어를 출력하는 프로그램을 작성하세요.
문장속의 각 단어는 공백으로 구분됩니다.


*  입력
첫 줄에 길이가 100을 넘지 않는 한 개의 문장이 주어집니다. 
문장은 영어 알파벳으로만 구성되어 있습니다.


* 출력
첫 줄에 가장 긴 단어를 출력한다.
가장 길이가 긴 단어가 여러개일 경우 문장속에서 가장 앞쪽에 위치한 단어를 답으로 합니다.

나는 StringTokenizer를 이용하여 풀었는데, 강의에서는 다른 방법 2가지를 가지고 풀었다.

class Main {

    public String Solution(String str){

        StringTokenizer stoken = new StringTokenizer(str, " ");
        String answer = "";

        while(stoken.hasMoreTokens()){
//            System.out.println(stoken.nextToken());

            String str2 = stoken.nextToken();
            if(str2.length() > answer.length()) answer = str2;
        }

        return answer;
    }

    public static void main(String[] args) {

        Main main = new Main();
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(main.Solution(str));
    }
}

split이용

String answer = "";
int m = Integer.MIN_VALUE:
String[] s = str.split("");
for(String x : s){
    int len = x.lenght();
    if(len > m){
    m = len;
    answer = x;
    }
}

toString / indexOf 이용


* substring을 통해 " "앞까지 계속 잘라서 len을 비교해주고,
원본 str을 앞이 잘린 부분 이후부터 다시 시작한다.
주의할 점은, while( =! -1)을 사용할 경우, 마지막 단어에는 " "가 포함되지 않기때문에
꼭 return문 전에 한 번 더 체크를 해야한다.

  public String Solution(String str) {

      String answer = "";
      int maxLen = Integer.MIN_VALUE, pos;

      while ((pos = str.indexOf(" ")) != -1) {

          String word = str.substring(0, pos);
          int len = word.length();
          if (len > maxLen) {
              maxLen = len;
              answer = word;
          }
          str = str.substring(pos + 1);
      }
      if(str.length() > maxLen) answer = str;

      return answer;

단어 뒤집기

  • 새로 알게된 사실
    char[]를 String으로 바꾸려면 String.valueOf(char[])를 이용한다.

StringBuilder

String은 불변객체라 값이 변하면 계속 객체를 생성하지만,
StringBuilder는 한 번 만들어진 객체(주소값)을 계속 사용하기 때문에 구동이 가벼워진다. 많은 String을 처리해야 할 때에 사용된다.

StringBuffer는 스레드 동기화 기능 제공하는데, 
스레드 동기화가 필요하지 않은 부분까지 다 처리를 하니까 속도가 느려지게 된다.
->StringBuilder로 개선 (스레드 동기화 x)  사용 방법은 같다.
  • StringBuilder에는 .reverse라는 메소드가 있어서, String문자열을 뒤집어준다.
  • String[] str = new String[크기]; 로 선언.
* 설명

N개의 단어가 주어지면 각 단어를 뒤집어 출력하는 프로그램을 작성하세요.


* 입력
첫 줄에 자연수 N(3<=N<=20)이 주어집니다.

두 번째 줄부터 N개의 단어가 각 줄에 하나씩 주어집니다. 
단어는 영어 알파벳으로만 구성되어 있습니다.

* 출력
  1. StringBuilder.reverse를 이용해 해결
public ArrayList<String> solutions(String[] str) {

    ArrayList<String> answer = new ArrayList<>();
    for (String word : str) {
        String tmp = new StringBuilder(word).reverse().toString();
        answer.add(tmp);

    }
    return answer;
}

public static void main(String[] args) {


    Main main = new Main();
    int num = sc.nextInt();
    String[] str = new String[num];
    for (int i = 0; i < str.length; i++) {
        str[i] = sc.next();
    }

    for(String x : main.solutions(str)){
        System.out.println(x);
    }

}

    }
  1. char[]를 이용해 직접 바꾸기
public ArrayList<String> solutions(String[] str) {

	ArrayList<String> answer = new ArrayList<>();
	for (String word : str) {
    char[] chArray = word.toCharArray();
    int sIndex = 0, lIndex = word.length() -1;
    	while(sIndex < lIndex){
    		char tmp = chArray[sIndex];
            chArray[sIndex] = chArray[lIndex];
            chArray[lIndex] = tmp;
            
            sIndex++;
            lIndex--;
    	}
        answer.add(String.valueOf(chArray));
    }
    
    return answer;
}
profile
신입 개발자의 개인 공부 공간입니다

0개의 댓글