Notice
Recent Posts
Recent Comments
Link
개발자는 기록이 답이다
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(문자열_문장 속 단어) 본문
https://cote.inflearn.com/contest/10/problem/01-03
(위의 링크는 인프런 로그인 후, 해당 강의를 사지 않으면 접속이 되지 않습니다)
3. 문장 속 단어
예시 입력 1
it is time to study
예시 출력 1
study
내가 푼 풀이 ( Time : 156ms, Memory 27MB )
- 최댓값을 이용해서 풀었다.
- 사실 나는 문제를 제대로 안읽어서, 가장 길이가 긴 단어가 여러개일 경우라는 조건문을 못 봤는데, 다행히 한번 최대값을 구하면 동일한 길이를 마주할때 갱신해주는 코드가 아니라서 잘 넘어간거 같다. if (max < strings[i].length())
import java.util.Scanner;
public class Main {
public String solution(String str) {
String ans = "";
String[] strings = str.split(" ");
int max = 0;
for (int i = 0; i < strings.length; i++) {
if (max < strings[i].length())
max = strings[i].length();
}
for (String findStr : strings) {
if(findStr.length() == max)
ans = findStr;
}
return ans;
}
public static void main(String[] args) {
Main main = new Main();
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(main.solution(str));
}
}
강의 답안 1 ( Time : 159ms, Memory 27MB )
1. Integer.MIN_VALUE를 하면 제일 작은 숫자를 대입할 수 있다.
2. answer에 답을 넣어주기 위해 또 다시 for문을 넣을 필요 없이 최대값 발견될때마다, 해당 단어들을 answer을 대입해주면 된다
import java.util.Scanner;
public class Main {
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) {
Main main = new Main();
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(main.solution(str));
}
}
강의 답안 2 (Time: 163ms, Memory: 27MB) - indexOf, substring 사용
1. pos(position)위치에 띄어쓰기의 인덱스를 발견했을때를 기준으로 while을 돈다.
2. substring()을 사용해서 문자열을 잘라낸다. 단어의 첫 인덱스와 띄어쓰기 전까지 자른다.
3. 단어 길이가 가잔 긴 최대값을 구한다
4. 검증이 끝낸 단어는 str에서 제거하고 다음 단어부터 다시 str에 넣어준다
5. 마지막 남은 str의 개수가 구한 최대갓보다 크다면 정답. 왜냐하면 마지막 단어 뒤에는 " " 가 없기 때문이다.
import java.util.Scanner;
public class Main {
public String solution(String str) {
String answer = "";
int m = Integer.MIN_VALUE, pos;
// 띄어쓰기 위치를 발견할때는 해당 인덱스값, 발견 못 했을때는 -1
while ((pos=str.indexOf(' ')) != -1) {
// 띄어쓰기 전까지라서 잘라내면 해당 단어까지 자를 수 있다.
String tmp = str.substring(0, pos);
int len = tmp.length();
// >=라고 하면 안되는 이유는?
// '여러개일 경우 문장 속에서 가장 앞쪽에 위치한 단어를 답으로 해라'
if(len > m ) {
m = len;
answer = tmp;
}
// 최대값을 구한 뒤, 띄어쓰기 다음부터 str에 새로 저장
str = str.substring(pos+1);
}
// 마지막 단어 처리 꼭!!! 해줘야함
// 왜냐하면 study(마지막 입력값)뒤에는 띄어쓰기가 없어서 최대값 저장을 못하기에
// 여기서 남은 str의 개수가 구한 최대갓보다 크다면 정답
if(str.length() > m) answer = str;
return answer;
}
public static void main(String[] args) {
Main main = new Main();
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(main.solution(str));
}
}
'알고리즘 > 인프런 - Java알고리즘 입문' 카테고리의 다른 글
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(문자열_중복 문자 제거) (0) | 2023.08.28 |
---|---|
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(문자열_특정 문자 뒤집기) (0) | 2023.08.27 |
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(문자열_단어 뒤집기) (0) | 2023.08.26 |
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(문자열_대소문자 변환) (0) | 2023.08.25 |
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(문자열_문자찾기) (0) | 2023.08.25 |