본문 바로가기

알고리즘/인프런

섹션 1. String(문자열)_3. 문장 속 단어

문제

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

입력

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

출력

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

입출력 예제


나름 TDD를 해보기 위해 작은 단위로 쪼개면서 sysout으로 확인하며 풀어보았다.

 

다음과 같이 두 가지 방식으로 풀어보았다.

1. split와 향상된 for 문을 사용한다.

2. indexOf와 substring을 사용한다.

 

1. split / 향상된 for문

먼저 첫번째 풀이방식이다.

Scanner를 사용하여 입력받을 문자열을 선언하고, 실제 작업이 이루어질 메소드를 선언한다.

기존에 next()를 사용하던 것과 달리 이번에는 문자가 아닌 문자열을 입력받아야 하므로 nextLine()을 사용한다.

그 후에 생성한 메소드를 실행할 수 있도록 main에 객체를 생성한다.

(이 때, 생성한 메소드가 static 이 붙어있다면 객체 생성을 해주지 않아도 된다.)

 

이제 메소드를 구현해보자.

특이사항은 max라는 변수이다.

max는 단어의 최대 길이를 저장할 변수인데, Integer.MIN_VALUE를 사용하여 최소값으로 초기화한다.

 

여기서 MIN_VALUE란 다음과 같다.

  • -2의 31제곱(-2,147,483,648) 으로 초기화해주는 메소드이다.
  • MAX_VALUE 를 사용하면 2의 31제곱인 (2,147,483,648)로 초기화해준다.

int max = 0; 으로 초기화해도 동일한 결과가 출력되지만, 강의에서 해당 방식으로 작성하였기에 동일하게 작업했다.

 

다음으로는 String 형태의 배열 word 를 선언한다.

word 안에는 입력받은 문자열을 공백을 기준으로 분리한 단어들이 저장된다.

  • split('  ') : () 안에 입력한 기준으로 문자열을 분리하여 배열에 저장하는 함수이다.

변수 선언을 완료했으면 이제 본격적으로 로직을 구현해보자.

향상된 for문을 사용하여 반복을 돌린다.

(이 때 word는 이미 배열의 형태이므로 그대로 변수명을 작성해도 무관하다.)

변수 str은 word 배열 항목에 대입하여 비교하기 위해 사용한다.

 

str.length()를 사용하여 입력받은 단어의 길이를 저장한다.

입력받은 단어의 길이와 최대길이를 비교한다.

(최대 길이보다 입력받은 단어의 길이가 길다면 결과값에 입력받은 단어를 넣어준다.)

 

수행 결과를 확인한다.


2. indexOf / substring

다음으로는 indexOf와 substring을 사용한 풀이방식이다.

기존 변수 선언은 동일하되, indexOf를 사용하기 위해 pos 라는 변수를 추가로 선언한다.

  • indexOf() : 특정 문자나 문자열에 앞에서부터 처음으로 발견되는 인덱스를 반환한다.
  • indexOf("찾을 특정 문자", "시작할 위치") 형태로 사용하며 위치 생략 시 0부터 찾는다.
  • 찾지 못했을 경우 -1 을 반환한다.

while을 사용하여 공백을 기준으로 하여 단어를 찾되, 더 이상 단어가 나오지 않을 때까지 수행하도록 한다.

 

substring()을 사용하여 0에서 시작하여 pos 전 위치까지의 값을 리턴한다.

그리고 length 변수에 리턴받은 문자의 길이를 저장한다.

리턴받은 문자의 길이와 최대길이를 비교한다.

 

단어를 찾은 후에 ,그 다음 단어를 찾기 위해 pos에 +1을 해준다.

 

마지막으로 주의할 점은 while문이 끝난 후 if문이다.

가장 마지막에 긴 단어가 위치했을 때, 마지막 단어를 출력하기 위해 작성한다.

 

수행 결과를 확인한다.


해당 글은 인프런 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비(김태원)강의를 참고하여 작성하였습니다.