CS/Data Structure & Algorithm

[String] 3. 문장 속 단어

문제

설명

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

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

입력

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

출력

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

단어를 답으로 합니다.

예시 입력 1 

it is time to study

 

예시 출력 1

study

 

틀린 풀이

문장에서 단어를 처음부터 하나하나씩 저장하다가 띄어쓰기가 발견되면 비교해보는 방식으로 접근하였습니다.

하지만 문장 마지막은 띄어쓰기가 없으므로 마지막 단어는 비교를 하지 못하게 됩니다.

다른 방식의 접근이 필요했습니다.

import java.util.*;

class Main {
    public String solution(String text) {
        // 정답 출력 변수
        String answer = "";
        // 비교 변수
        String temp = "";
        for(char t : text.toCharArray()) {
            if(t == ' ') {
                if(answer.length() < temp.length()) {
                    answer = temp;
                }
                temp = "";
            }
            else {
                temp = temp + t;
                System.out.println(temp);
            }
        }
        return answer;
    }

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

 

풀이

1. split()

첫번째로는 String 클래스의 메서드인 split(" ")를 활용하는 것입니다.

split(" ")을 사용하면 매개변수인 " " 띄어쓰기를 기준으로 나눠서 String[] 배열로 리턴해줍니다.

나눠진 문장의 단어들을 이제 for each 구문을 통해 length()를 활용하여 길이를 일일이 비교해주면 됩니다.

* 미관 상 solution() 메서드만 올리겠습니다.

class Main {
    public String solution(String text) {
        // split(" ") 활용
        String answer = "";
        int min = Integer.MIN_VALUE;
        String[] t = text.split(" ");
        for(String s : t) {
            int len = s.length();
            if (len > min) {
                min = len;
                answer = s;
            }
        }
        return answer;
    }

 

2. indexOf(), substring()

이 풀이는 위 틀린풀이의 코드 동작 매커니즘에서 한단계 발전됐다고 생각합니다. 

indexOf(" ") 메서드를 사용하여 공백이 있는 인덱스를 찾고, 그 위치 전까지 substring() 메서드를 통해 별도의 단어로 저장합니다. 그 후 길이를 비교하여 제일 긴 단어를 찾아냅니다.

 

특히 주석에 인덱스 처리라는 부분이 중요한데, 이는 substring(0, pos)가 제대로 동작하기 위해 추가한 코드입니다.

My name is ~~ 라는 문장을 입력했을 때 저 코드가 없다면 계속 무한히 My라는 단어만 비교할 것입니다.

substring()을 이용해 name is ~~라는 새로운 문장으로 시작하게 처리하면 됩니다.

 

마지막 단어는 비교를 안하게 되므로 if문을 통해 비교를 하도록 하였습니다. 

public String solution(String text) {
    // indexOf(), substring() 활용
    String answer = "";
    int min = Integer.MIN_VALUE;
    int pos;
    // 공백이 아예 없을 경우 고려
    while((pos = text.indexOf(" ")) != -1) {
        String temp = text.substring(0, pos);
        int len = temp.length();
        if (len > min) {
            min = len;
            answer = temp;
        }
        // 인덱스 처리
        text = text.substring(pos+1);
    }
    // 누락된 마지막 단어 비교
    if (text.length() > min) answer = text;
    return answer;
}

+ 문제 조건으로 "가장 길이가 긴 단어가 여러개일 경우 문장속에서 가장 앞쪽에 위치한단어를 답으로 합니다." 라는 문장이 있는데, 이를 지키기 위해서는

길이비교할 때의 코드 if (len > min)에서 등호를 붙이면 안됩니다.

등호가 붙여질 경우 계속해서 같은 길이의 뒤쪽에 위치한 단어가 정답으로 들어가게 되서 문제에서 의도한 조건에 부합하지 않게 됩니다.

 

배경지식

String 클래스의 메서드

Scanner 클래스의 메서드

for each문의 사용법

String과 char의 이해