문제
: 한 개의 문장이 주어지면, 그 문장속에서 가장 긴 단어를 찾아 출력하기
(단 문장 속 각 단어는 공백으로 구분됨)
(길이가 가장 긴 단어가 여러개인 경우, 가장 앞쪽의 단어를 출력)
이 문제의 요구사항은 문제에서 언급하는 그대로 이다.
입력한 문자열 중에서, 가장 앞쪽에 있으면서 && 길이가 가장 긴 단어
(공백으로 구분되는)를 찾기!
이 문제에 대한 나의 해결로직은 이와 같았다.
- 입력한 문자열에서 공백을 구분자로 하여 각 단어를 구분하고
- 각 단어들을 문자열 길이를 기준으로 내림차순 정렬했을 때,
가장 앞선 단어를 출력하자
그래서 위 로직을 기반으로 이렇게 코드를 작성하였는데
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가지가 있었다.
- 공백이나 줄바꿈을 구분자로 하여 콘솔 입력받을 때는 next()를 쓰는게 맞지만,
공백을 포함한 문자열 전체를 콘솔 입력받을 때는 nextLine()을 써야한다는 점.- 문자열.split() 메서드를 호출하면,
인자로 넘긴 구분자에 의해 구분된 각 토큰들로 구성된 배열 이 반환된다는 점 (즉 String[])- 정렬 기준이 되는 Comparator<? super T> 인터페이스의 compare() 메서드를 오버라이딩 할 때,
(s1, s2) -> s1.length() - s2.length() 로 하면 오름차순 정렬이 되고,
(s1, s2) -> s2.length() - s1.length() 로 하면 내림차순 정렬이 된다는 점- sorted()를 써서 스트림내 element들을 정렬할 때, 같은 값은 기존 순서를 유지하면서 정렬된다는 점.
("a" , "A" 가 기존 순서였다면 -> 정렬이후 순서도 "a" , "A" 순서로 위치)
이 문제를 선생님은
1) split()을 사용하여 단어들로 구분하고 그 단어의 길이의 최댓값을 가지고 구하는 방법과,
2) indexOf()와 substring()으로 각 단어를 구분한 후 단어 길이의 최댓값을 가지고 구하는 방법으로 해결하셨다.
선생님의 코드와 나의 코드의 핵심 로직 자체는 유사하기 때문에 ,
따로 선생님 코드를 쓰지는 않겠다.