[Bronze II] 단어의 개수 - 1152
성능 요약
메모리: 33624 KB, 시간: 496 ms
분류
구현, 문자열
제출 일자
2024년 5월 30일 09:36:51
문제 설명
영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
입력
첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.
출력
첫째 줄에 단어의 개수를 출력한다.
풀이
- 결과 : 성공
- 과정 :
- 1차 시도 : 스캐너 클래스를 임포트하여 처리 하지 않음
- 2차 시도 : 스캐너를 넣고 테스트 케이스를 콘솔에 입력하고 로컬에서 정상 확인, But 백준 FAIL. 원인 식별 불가
- 3차 시도 : 문자열 입력 시 앞뒤로 공백에 추가 될 수 있다는 말에 스캐너로 받은 객체를 문자로 변형후 바로 trim처리 했지만 fail
- 4차 시도 : split().length() 메서드로 한줄 처리한 코드를 for문과 count 변수를 정의하여 처리 후 성공
- 코드
import java.util.Scanner;
public class Main {
/**
* 시간 복잡도 : O(n)
* - 이유 : 입력 문자열의 길이에 선형적으로 비례하여 실행 시간이 증가하기 때문입니다.
*
* 공간 복잡도 : O(1)
* - 이유 : 입력 문자열을 단어로 분할하여 루프를 실행하므로 추가 메모리가 필요하지 않습니다.
* 따라서 공간 복잡도는 입력에 관계없이 상수 크기의 메모리를 사용합니다.
*
* @param String strList : 스캐너를 통해 입력 받는 문자열
* @return int count : 정수 반환 값
*
*/
public static int solution(String strList) {
int count = 0;
boolean prevSpace = true; // 이전 문자가 공백인지 여부를 나타내는 플래그
for (char c : strList.toCharArray()) {
if (c == ' ') {
prevSpace = true; // 공백 문자를 만나면 플래그를 설정
} else {
// 공백 문자를 만나지 않은 경우, 이전 문자가 공백이었다면 단어 수를 증가시킴
if (prevSpace) {
count++;
}
prevSpace = false; // 이전 문자가 공백이 아님을 나타내는 플래그 설정
}
}
return count;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine().trim();
System.out.println(solution(s));
scanner.close();
}
}
---
'여러가지 > 알고리즘 & 자료구조' 카테고리의 다른 글
[백준] 상수 - 2908번 (0) | 2024.05.30 |
---|---|
[백준] 할리갈리 - 21760번 (0) | 2024.05.30 |
스택: 데이터를 차곡차곡 쌓기 (0) | 2021.11.29 |
🛩동적 배열이란? (0) | 2021.11.29 |
Differences between Stack and Heap (0) | 2021.11.29 |