<1.3> 문장 속 단어

mutexlocking·2022년 6월 5일
0

문제
: 한 개의 문장이 주어지면, 그 문장속에서 가장 긴 단어를 찾아 출력하기
(단 문장 속 각 단어는 공백으로 구분됨)
(길이가 가장 긴 단어가 여러개인 경우, 가장 앞쪽의 단어를 출력)

이 문제의 요구사항은 문제에서 언급하는 그대로 이다.

입력한 문자열 중에서, 가장 앞쪽에 있으면서 && 길이가 가장 긴 단어
(공백으로 구분되는)를 찾기!

이 문제에 대한 나의 해결로직은 이와 같았다.

  1. 입력한 문자열에서 공백을 구분자로 하여 각 단어를 구분하고
  2. 각 단어들을 문자열 길이를 기준으로 내림차순 정렬했을 때,
    가장 앞선 단어를 출력하자

그래서 위 로직을 기반으로 이렇게 코드를 작성하였는데

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class Main {

    public static String solution(String[] subStrings){

        //1. 스트림을 사용하여 , 분리된 각 subString 들을 길이순 내림차순으로 정렬
        List<String> sortedSubStrings = Arrays.stream(subStrings)
                .sorted((s1, s2) -> s2.length() - s1.length())
                .collect(Collectors.toList());

        //2. 그렇게 길이순 내림차순으로 정렬된 subString 중, 길이가 가장 긴 subString을 반환
        return sortedSubStrings.get(0);
    }
    public static void main(String[] args){

        //0. Scanner 준비
        Scanner sc = new Scanner(System.in);

        //1. 문자열 입력
        String str = sc.nextLine();

        //2. 문자열들을 공백을 기준으로 토큰화
        String[] subStrings = str.split(" ");

        //3. solution에 넘겨 , 길이가 가장 긴 문자열을 반환
        String resultString = solution(subStrings);

        //4. 출력
        System.out.println(resultString);
    }
}

코드를 작성하면서 알게 된 점 4가지가 있었다.

  1. 공백이나 줄바꿈을 구분자로 하여 콘솔 입력받을 때는 next()를 쓰는게 맞지만,
    공백을 포함한 문자열 전체를 콘솔 입력받을 때는 nextLine()을 써야한다는 점.
  2. 문자열.split() 메서드를 호출하면,
    인자로 넘긴 구분자에 의해 구분된 각 토큰들로 구성된 배열 이 반환된다는 점 (즉 String[])
  3. 정렬 기준이 되는 Comparator<? super T> 인터페이스의 compare() 메서드를 오버라이딩 할 때,
    (s1, s2) -> s1.length() - s2.length() 로 하면 오름차순 정렬이 되고,
    (s1, s2) -> s2.length() - s1.length() 로 하면 내림차순 정렬이 된다는 점
  4. sorted()를 써서 스트림내 element들을 정렬할 때, 같은 값은 기존 순서를 유지하면서 정렬된다는 점.
    ("a" , "A" 가 기존 순서였다면 -> 정렬이후 순서도 "a" , "A" 순서로 위치)

이 문제를 선생님은
1) split()을 사용하여 단어들로 구분하고 그 단어의 길이의 최댓값을 가지고 구하는 방법과,
2) indexOf()와 substring()으로 각 단어를 구분한 후 단어 길이의 최댓값을 가지고 구하는 방법으로 해결하셨다.
선생님의 코드와 나의 코드의 핵심 로직 자체는 유사하기 때문에 ,
따로 선생님 코드를 쓰지는 않겠다.

profile
개발자가 되고자 try 하는중

0개의 댓글