Practice/알고리즘

CodingTest_ch.01_03 (문장 속 단어)

밍미a 2022. 9. 30. 12:11
728x90
더보기
3. 문장 속 단어
 

설명

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

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

입력

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

출력

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

단어를 답으로 합니다.

예시 입력 1 

it is time to study

예시 출력 1

study​

 

 한 개의 문장이 주어지면 이랬으니까 일단 String으로 받는다는건 이제 알겠다..! 
가장 긴 단어 를 출력하라고 했으니까 길이를 구하는거겠네... 길이면..length를 쓰던데..
각 단어는 공백으로 구분 된다고 했으니까.. 공백이 기준이 되는건가..? 
그럼.. 단어를 공백을 기준으로 끊어서 배열을 만들어주는 함수가 있나..? 음.. 모르겠다 ㅠㅠ

가장 길이가 긴 단어가 여러개일 경우 문장속에서 가장 앞쪽에 위치한
단어를 답으로 합니다.  이건 무슨말이지..;; ?

 

알고 넘어가야 할 이론:

 

1. str.split()

split(" ") 메서드는 구분자를 기준으로 문자열을 잘라 배열로 입력할때 쓰는 메서드이다. 사용법은다음과 같다.

split(String regex); 구분자를 바탕으로 배열형식으로 문자열을 잘라준다.

split(String regex int limit);  구분자를 바탕으로 배열형식으로 문자열을 잘라주는데 limit 숫자만큼 잘라준다.

 

2.Integer.MIN_VALUE

Integer.MIN_VALUE  는 정수의 최소값을 출력한다. Integer의 최솟값인 -21억 어쩌구

반대로 Integer.MAX_VALUE 가 있다. 이것은 최댓값을 출력하는 것이다. 21억 어쩌구

 

3.Scanner.nextLine()

Scanner.nextLine() 은 키보드에서 문장을 입력받을 때 사용한다.

문제풀이 :

import java.util.*;

public class Main {
	public String solution(String str){
		String answer=" "; // 답을 저장하기 위한 변수
		int m = Integer.MIN_VALUE; //가장 작은 단어의 길이(최솟값)에서 시작한다.
		String[] s = str.split(" "); // 들어온 문장을 공백을 기준으로 쪼개서 배열에 넣어준다.
		for(String x : s) {
			if(x.length() > m){
				// 만약 문자열x 의 길이가 m보다 클때,
                answer = x;  //x를 answer에 넣어주고,
				m = x.length(); // m을 x.length()길이만큼으로 갱신해준다.
			}
		}
		
		
		
		return answer;
	}
	public static void main(String[] args){
		Main T = new Main(); //Main 클래스를 객체생성해서 T변수에 넣어준다.
		Scanner kb = new Scanner(System.in); //키보드에서 입력받은 값을 kb변수에 넣는다.
		String str = kb.nextLine(); // 받아오는 글자가 문장이니까 nextLine으로 받는다.
		System.out.println(T.solution(str)); //입력받은 값이 매개변수로 있는 solution메서드를 실행한다.
	}
}
더보기

3. 문장 속 단어

 

설명

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

//한개의 "문장"으로 데이터값이 주어진다고 했으니까, Scanner 클래스로 받을때, next() 메서드가 아닌 nextLine메서드가 실행될것이라는 것을 유추할 수 있어야 한다.

//가장 긴 단어를 구분하려면 그 단어의 길이를 알 수 있어야 한다. "length()"

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

// 문장의 각 단어를 공백을 기준으로 잘라주어 배열로 넣어주어야 하는데 이때 str.split() 메서드를 쓴다는것을 알 수 있어야 한다. 

입력

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

출력

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

단어를 답으로 합니다.

더보기

백엔드에서 첫 발을 떼는것은 데이터가 어떻게 받아오고 어떻게 표현되느냐를 먼저 생각해야 해.
여기서 받아와야 할 데이터는 무엇이고 어떻게 보내줄 것인지 먼저 생각해봐...
데이터를 받아왔으면 어떤 변수에 담을 것인지 생각하고, 그 변수를 어떻게 요리할것인지 고민해야지...
변수를 요리한다는건 함수나 메서드 등을 사용해 기능을 부여하는것이고, 어디에 담아서 보내줄건지 생각하다보면
백엔드 뚝딱! 지금 문제도 문장을 받아와서 가장 긴 단어를 보내주는 것 이니까..String값으로 받아와서 뭔가 하고(?) 보내주겠네..
클래스에서 뭔가 요리한것을 보여주기 위해서는 객체를 새로 만들어서 그 클래스가 하는 일을 또 변수에 담아줘야 하고, 그게 바로 
public static void main에서 하는 new Main() 이거야..
그리고 키보드로 받아오는 데이터도 입력해줘야 하니까 그게바로 Scanner 클래스
근데 생각해봐, 클래스를 사용할때는 무조건 객체생성 해야 한다 했잖아.. 그러니까 Scanner클래스도 객체를 생성해서 변수에 담아줘야지..
그 클래스 안에 있는 메서드를 사용하려면 점 찍어서 사용하잖아. 그것처럼 아까 Scanner 클래스를 kb에 담아줬으니, 
kb.nextLine이렇게  입력한 문장을 또다시 새로운 변수에 담아주는거야. 뭐 하나하나 할때마다 변수에 담고 변수에 담고 변수에담고 변수에...
이 기능을 하기 위해서 몇개의 변수가 필요할지 생각해보는것도 좋을 것 같다.. 하다보면 알게되는건가..?
하다가 잘 모르면 얘릃 변수에 담아야되나? 를 생각해보면 좀 도움이 되려나...? 
----------------------------------------------------------------------------------------------------------------------------------------------
이제 뭘 출력해줘야 할지 만들어줬으니까, 요리를 해보자.
String answer은 답을 저장하기 위해서 만든 변수이고. 가장 긴 단어 를 찾기위해서는 처음에는 가장 작은 단어에서부터 시작을 해야해.. 왜냐하면 계속 큰 값을 갱신을 해줘야 하는 것이니까... 그리고 그 다음에는 긴 문장을 쪼개서 배열로 만들어 줘야지 그래야 그 단어 하나하나 비교할거아냐..
 긴 문장을 띄어쓰기 기준으로 쪼갤 수 있는 메서드는 split(" ")이 있어. split 메서드는 () 안에 입력된 문자를 기준으로 문자열을 쪼개주는 메서드야
문제에서 공백을 기준으로 단어를 나눈다고 했으니까 split(" ") 괄호안에는 공백을 넣으면 되겠지.. 이제 공백으로 나눈 단어의 배열을 
for문이나 while문을 돌려서 뭐가 제일 큰지 비교해봐야겠지, 그리고 그 값을 아까 설정해둔 변수 m에 계속 갱신하면서 대입해주는거야..
이때 for문에서 긴 단어를 찾았을때 m에 length()를 계속 갱신해서 저장해주기도 해야겠지만, 그 단어를 answer 변수에 넣어줘야 답도 갱신되겠지 그래서 코드로 써보면 for문이 

		for(String x : s) {
			if(x.length() > m){
				answer = x;
				m = x.length();
			}
		}

이런식으로 작성되는거야...