Problem Solving/Algorithm Concepts

[Java Algorithm] 1-3 문장 속 단어( for each문, split(), indexOf(), substring())

대범하게 2021. 8. 16. 01:51
반응형

* 문제 설명

문장 속의 각 단어는 공백으로 구분되고 한 개의 문장이 주어지면 그 문장 속에서 가장 긴 단어를 출력하는 문제

 

(출력: 첫 줄에 가장 긴 단어를 출력하고 가장 길이가 긴 단어가 여러개일 경우 문장속에서 가장 앞쪽에 위치한 단어를 답으로 함.)

 

예시 입력 1 

it is time to study

예시 출력 1

study

 

* 소스코드1

풀기 전 생각)

공백을 기준으로 나누면 되지 않을까? => split()
먼가 생각으로는 처음 나온 공백을 기준으로 앞 글자들을 묶고 공백이 나올 때마다 반복한 다음 

그 묶여진 단어들을 배열에 넣어서 비교하면 되지 않을까? 싶음 => String[] arr = str.split(" ");

 

1. 공백으로 구분된 단어들을 입력받고

2. 해당 단어를 " "으로 split해서 String Array를 만든다.

3. 만든 String Array를 for loop 돌리면서 현재 length가 제일 큰 값을 찾아내서 출력.

주의) 단어를 한 줄을 입력받을 때는 nextLine()을 사용한다.

 

import java.util.Scanner;

public class Main3 {
	public String solution(String str){
		String answer = "";
		String[] arr = str.split(" ");
		
		for(String splitString : arr) {
			if(splitString.length() > answer.length()) {
				answer = splitString;
			}
		}
	
		return answer;
	}
	
	public static void main(String[] args) {
		Main3 T = new Main3();
		Scanner kb = new Scanner(System.in);
		String str = kb.nextLine();
		
		System.out.println(T.solution(str));
		kb.close();
	}
}

 

* 소스코드2

import java.util.Scanner;

public class Main3 {
	public String solution(String str){
		String answer = "";
		int m = Integer.MIN_VALUE; //??? => 굳이 이렇게 하는 이유가 궁금함.
		
		String[] s = str.split(" ");
		
		for(String x :s) {
			int len = x.length();
			if(len > m) {
				m = len;
				answer = x;
			}
		}
	
		return answer;
	}
	
	public static void main(String[] args) {
		Main3 T = new Main3();
		Scanner kb = new Scanner(System.in);
		String str = kb.nextLine(); //문장을 입력받기 때문에 nextLine()으로 받는다.
		
		System.out.println(T.solution(str));
		kb.close();
	}
}

 

* 추가공부

1) for each문 (1-2 복습)

  • for문의 기본형식 -> for(초기화식; 조건식; 업데이트식) 실행부분;
  • for each문의 형식 -> for(변수타입 변수이름 : 배열(혹은리스트)이름) 실행부분;

for each문은 배열의 항목 수만큼 실행부분을 반복하며 반복이 이루어질 때마다 배열의 항목을 순서대로 꺼내어 변수에 자동으로 대입해준다.

 

//for each문의 간편성을 알 것만 같기도 하고..
for(String splitString : arr) {
			if(splitString.length() > answer.length()) {
				answer = splitString;
			}
		}

 

2) split() 

    • String.split()의 경우 특정 문자나 문자열을 기준으로 문자열을 잘라주는 함수이다.
#how to use method
String str = "Beenzino#Dok2#The Quiett"; 
String[] splitData = str.split("#"); 
for(int i=0; i<splitData.length; i++) { 
	System.out.println("splitData"+i+" : " + splitData[i]); 
}

위의 코드를 예제로 split 함수를 살펴보면

 

str 변수에 "Beenzino#Dok2#The Quiett" 문자열이 들어가고 splitData 배열에 "#" 문자 기준으로 str 문자열을 잘라 넣어줍니다.

 

split 함수의 리턴 값은 String[] 이기 때문에 splitData 변수는 스트링 배열값으로 선언해 주어야 정상적으로 값이 저장됩니다.

 

(*참고사이트: https://heisanbug.tistory.com/14)

 

* 소스코드3 

이해가 안 됨.. 나중에 다시 공부하기

import java.util.Scanner;

public class Main3 {
	public String solution(String str){
		String answer = "";
		int m = Integer.MIN_VALUE, pos; //???
		
		while((pos = str.indexOf(' '))!=-1) {
			String tmp = str.substring(0, pos);
			int len = tmp.length();
			if(len > m) {
				m = len;
				answer = tmp;
			}
			str = str.substring(pos+1);
		}
		if(str.length()>m) answer=str;
		return answer;
	}
	
	public static void main(String[] args) {
		Main3 T = new Main3();
		Scanner kb = new Scanner(System.in);
		String str = kb.nextLine(); //문장을 입력받기 때문에 nextLine()으로 받는다.
		
		System.out.println(T.solution(str));
		kb.close();
	}
}

07/21 복습

// 한 개의 문장이 주어지면 그 문장 속에서 가장 긴 단어를 출력
// 문장 속의 각 단어는 공백으로 구분됨
// 첫 줄에 가장 긴 단어를 출력, 가장 길이가 긴 단어가 여러 개일 경우 문장 속에서 가장 앞쪽에 위치한 단어를 답으로
import java.util.*;

public class Practice_03_num2 {
	public String solution(String str) {
		String answer="";
		String[] s = str.split(" "); //문자열을 공백을 기준으로 나눈 배열
		//it is time to study
		//["it", "is", "time", "to", "study"]
		
		for(String x : s) { // for each문에서는 배열을 넣어야함.
			if(x.length() > answer.length()) {
				answer = x;
			}
		}
		return answer;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Practice_03_num2 T = new Practice_03_num2();
		Scanner kb = new Scanner(System.in);
		String str = kb.nextLine(); //문자열을 입력받아야하기 때문에 nextLine() 사용
		System.out.println(T.solution(str));
	}
}