알고리즘 문제풀이/Beakjoon

[자바 알고리즘] String - 문장 속 단어 : 문장 속에서 가장 긴 단어를 출력하기

joah.k 2022. 1. 24. 18:25
728x90
3. 문장 속 단어

 

[설명]

한 개의 문장이 주어지면 그 문장 속에서 가장 긴 단어를 출력하는 프로그램을 작성하세요.

문장속의 각 단어는 공백으로 구분됩니다.

 

[입력]

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

 

[출력]

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

단어를 답으로 합니다.

 

 


문자열이 특정 구분자로 연결되어 있을 경우, 구분자를 기준으로 문자열을 분리하기 위해서는 

String의 Split() 메소드를 이용하거나, 

java.Util 패키지의 StringTokenizer 클래스를 이용할 수 있다. 

 

 

>>>>>  방법 1. Split() 이용

배열로 리턴해 바로 비교 

public static void main(String[] args) throws IOException {

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String str = br.readLine();
    String answer = "";
    for(String s : str.split(" ")){
        if(s.length() > answer.length()){
            answer = s;
        }
    }
    System.out.println(answer);

}

 

 

>>>>> 방법 2. StringTokenizer 이용 

문자열로 리턴 -> 배열로 파싱하여 비교 

  public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();   

        StringTokenizer st = new StringTokenizer(str); // 구분자 입력하지 않을 경우 공백
        // 문자열 ->> 배열로 파싱

        // (1) hasMoreTokens()로 총 토큰의 개수를 구하고
        int tokens = st.countTokens();

        // (2) token들 담을 배열을 만들고
        String[] strArr = new String[tokens];
        // (3) nextToken()으로 한 토큰씩 꺼내서 배열에 저장
        int idx = 0;
        while(st.hasMoreTokens()){
            strArr[idx++] = st.nextToken(); // 인덱스 하나 하나에 저장
        }
      //  System.out.println(Arrays.toString(strArr));
        // (4) 배열 비교
        String answer = "";

        for(String s : strArr){
            if(s.length() > answer.length())
                answer = s;
        }

        System.out.println(answer);
   }

그러나, 문자열의 길이가 길어지거나, 구분자가 공백이 아닌 다른 문자가 되면 StringTokenizer의 성능이 Split 보다 낮아지는 것을 알 수 있다. 그냥 편하게 애초에 배열로 리턴하여 비교하는 것이 빠를 듯..  

 

>>> 방법 3. IndexOf() 이용 

public static void main(String[] args) throws IOException {
    // IndexOf 이용 - 문자열 내에서 특정한 문자열의 index 값을 리턴한다.

    // 특징1. index는 0부터 시작
    // 특징2. 찾는 문자열이 없을 경우 -1 을 리턴

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String str = br.readLine();
    String answer="";

    int max = Integer.MIN_VALUE, pos;
    while((pos = str.indexOf(" ")) != -1){ // 띄어쓰기를 발견 못하면 -1 리턴하니까..
        // 발견하면 index 번호 리턴
        String tmp = str.substring(0, pos);
        int length = tmp.length();
        if(length > max){ // 길이가 같다면 앞 단어로..
            max = length;
            answer = tmp;
        }
        str = str.substring(pos+1);
    }
    if(str.length() > max) answer=str; // 마지막 단어 처리!

    System.out.println(answer);
}
728x90