개발자는 기록이 답이다

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(문자열_문장 속 단어) 본문

알고리즘/인프런 - Java알고리즘 입문

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(문자열_문장 속 단어)

slow-walker 2023. 8. 25. 19:10

 

 

https://cote.inflearn.com/contest/10/problem/01-03

 

OnlineJudge

 

cote.inflearn.com

(위의 링크는 인프런 로그인 후, 해당 강의를 사지 않으면 접속이 되지 않습니다)

 
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));
    }
}