문제

(백준) 1152번 '단어의 개수'

서윤-정 2023. 8. 2. 13:52

import java.util.Scanner;

public class Main{
	public static void main(String[] args){
    	Scanner sc = new Scanner(System.in);
        
        // 문자열 입력 받기
        String input = sc.nextLine();
        
        // 문자열의 앞뒤 공백 제거
        input = input.trim();
        
        // 공백을 기준으로 단어 분리하여 배열로 저장
        String[] words = input.split("\\s+");
        
        // 단어의 개수 구하기
        int wordCount = 0;
        for(String word : words){
        	if(!word.isEmpty()){
            	wordCount++;
            }
		}
        
        System.out.println(wordCount);
        
        sc.close();
	}
}

 

 

 

 

 

✔️ trim()

문자열의 앞과 뒤에 있는 공백(스페이스, 탭 등)을 제거하는 메서드이다.

trim() 메서드를 호출하면 해당 문자열의 시작과 끝에서 공백을 모두 제거한다.

중간에 있는 공백은 제거되지 않는다.

String str = "  Hello, World!   ";
String trimmedStr = str.trim();
System.out.println(trimmedStr); // 출력: "Hello, World!"

 

 

✔️split() 

문자열을 특정 구분자를 기준으로 분리하여 배열로 반환하는기능을 가진 메서드이다.

`split("\\s+")` 여기서 `\\s+` 는 정규표현식으로서 공백을 의미한다.

(정규표현식에서 `\s`는 공백을 의미하며 `+`는 하나 이상의 공백을 의미한다.)

따라서 `\\s+` 는 하나 이상의 공백을 기준으로 문자열을 분리하라는 의미이다.

예를들어, 다음과 같은 문자열이 있다.

String str = "apple   orange banana     grape";

`str.split("\\s+")`을 호출하면 이 문자열은 공백이 하나 이상인 경우를 구분자로 사용하여 분리된다.

결과는 배열로 반환되며 각 원소에는 분리된 문자열이 들어간다.

String[] fruits = str.split("\\s+");

// fruits 배열에는 다음과 같이 문자열이 저장됩니다.
// fruits[0] = "apple"
// fruits[1] = "orange"
// fruits[2] = "banana"
// fruits[3] = "grape"

 

 

✔️ 아래 코드는 `str.split("\\s+")`를 통해 분리된 단어들의 배열 `words`를 순회하면서 각 단어가 비어있지 않으면  

`(!word.isEmpty()`)`wordCount`변수를 증가시키는 기능을 수행한다.

        for (String word : words) {
            if (!word.isEmpty()) {
                wordCount++;
            }
        }

공백으로 분리한 결과를 배열 `words`에 저장한다. 

그 후 `for-each` 반복문을 이용해 `words` 배열의 각 요소인 단어들을 순회하면서 처리한다.

`word.isEmpty()` 는 문자열 'word`가 비어있는지 여부를 확인하는 메서드인다.

즉, 단어가 비어있지 않으면(단어가 존재하면) `wordCount`를 증가시킨다.

예를들어, 아래와 같이 입력 문자열이 있다고 가정한다.

String input = "   apple   orange banana     grape    ";

`split("\\s+")`를 사용하여 이 문자열을 공백으로 분리한다면 다음과 같은 배열 `words`가 생성된다.

words[0] = ""
words[1] = "apple"
words[2] = "orange"
words[3] = "banana"
words[4] = ""
words[5] = ""
words[6] = "grape"
words[7] = ""

이제 `for-each`반복문을 사용하여 각 단어를 순회하면서 비어있지 않은 단어의 개수를 구한다.

총 4개의 비어있지 않은 단어가 존재하므로 `wordCount`는 4가 된다.

 

 

✔️ `for-each` 반복문 

배열 또는 컬렉션의 모든 요소를 순회하는데 사용되는 특수한 종류의 반복문이다.

다른 이름으로 "향상된 for 루프"라고도 불리며, 자바 5 버전 이후부터 지원되는 기능이다.

`for-each` 반복문의 구조는 다음과 같다.

for (자료형 변수 : 배열 또는 컬렉션) {
    // 반복해서 실행할 코드
}

여기서 '자료형'은 배열 또는 컬렉션에 저장된 요소들의 자료형을 의미하며, '변수'는 각 요소를 대표하는 변수이다.

'배열 또는 컬렉션'은 반복하고자 하는 대상을 나타낸다.

예를 들어, 아래는 배열의 모든 요소를 출력하는 `for-each` 반복문의 예시다.

int[] numbers = {1, 2, 3, 4, 5};

for (int number : numbers) {
    System.out.println(number);
}

이 코드는 배열 `numbers`의 모든 요소를 순회하며 각 요소를 `number`라는 변수로 가져와서 출력한다.

`for-each` 반복문을 사용하면 반복 인덱스를 직접 다룰 필요없이 배열이나 컬렉션의 요소들에 간편하게 접근할 수 있어서 코드가 간결해지고 가독성이 좋아진다.

따라서 배열이나 컬렉션을 순회해야 할 때 `for-each` 반복문을 사용하는 것이 권장된다.

'문제' 카테고리의 다른 글

(백준) 2566번 '최댓값'  (0) 2023.08.08
(백준) 2738번 '행렬 덧셈'  (0) 2023.08.08
(백준) 2908번 '상수'  (0) 2023.08.06
(백준) 11718번 '그대로 출력하기'  (0) 2023.08.05