Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발 일지

2047. Number of Valid Words in a Sentence (문장의 유효한 단어 수) 본문

코딩 테스트/LeetCode

2047. Number of Valid Words in a Sentence (문장의 유효한 단어 수)

포카리tea 2023. 10. 30. 16:22

문장은 소문자('a'~'z'), 숫자('0'~'9'), 하이픈('-'), 문장부호('!', '.', '',', '.'), 공백(')으로만 구성됩니다. 각 문장은 하나 이상의 공백으로 구분된 하나 이상의 토큰으로 나눌 수 있습니다.

토큰은 다음 세 가지가 모두 참일 경우 유효한 단어입니다:

  • 소문자, 하이픈 및/또는 구두점(숫자 없음)만 포함합니다.
  • 하이픈 '-'는 하나만 사용할 수 있습니다. 있으면 소문자("a-b"는 유효하지만 "-ab" 및 "ab-"는 유효하지 않습니다)로 둘러싸여 있어야 합니다.
  • 구두점 표시는 하나만 사용할 수 있습니다 . 있는 경우 토큰 끝에 있어야 합니다("ab", "cd!" 및 "."는 유효하지만 "a!b" 및 "c."는 유효하지 않습니다).

유효한 단어의 예로는 "a-b", "afad", "ba-c", "a!", "!" 등이 있습니다.

문자열 문장이 주어지면 문장 내의 유효한 단어 수를 반환합니다.

 

예시 1:

입력: sentence = "cat and  dog"
출력: 3
설명: 문장에서 유효한 단어는 "cat", "and", "dog" 입니다.

 

예시 2:

입력: sentence = "!this  1-s b8d!"
출력: 0
설명: 문장에 유효한 단어가 없습니다.
"!this"는 문장부호로 시작하므로 잘못되었습니다.
"1-s" 및 "b8d"는 숫자를 포함하므로 유효하지 않습니다.

 

예시 2:

입력: sentence = "alice and  bob are playing stone-game10"
출력: 5
설명: 문장에서 유효한 단어는 "alice", "and", "bob", "are", 그리고 "playing" 입니다.
"stone-game10"은(는) 숫자가 포함되어 있으므로 유효하지 않습니다.

 

조건:

  • 1 <= sentence.length <= 1000
  • 문장에는 소문자 영문자, 숫자, ', '-', '!', '.', '.', '.'만 포함됩니다.
  • 토큰은 적어도 1개는 있어야합니다.

 

정답:

using System.Text.RegularExpressions;

public class Solution {
    public int CountValidWords(string sentence) {
        int result = 0;
        
        string[] sentenceSplit = sentence.Split(' ');
        
        var regex = new Regex(@"^([a-z]+(-?[a-z]+)?)?(!|\.|,)?$");

        foreach (var word in sentenceSplit)
        {
            if (!string.IsNullOrEmpty(word) && regex.Match(word).Success)
            {
                result += 1;
            }
        }
        
        return result;
    }
}

해설: ' '로 구분된 단어가 조건에 성립하는지 그리고 그 조건에 성립하는 단어가 몇개인지 해결하는 문제입니다.

여러가지 조건에 맞추기 위해서 정규식을 사용하는게 좋겠다고 판단하여 단어를 나눈 후 정규식으로 체크하고 갯수를 return하는 방식으로 해결하였습니다.

해당 정규식 ([a-z]+(-?[a-z]+)?)?(!|\.|,)? 에서 [a-z]+는 a부터 z까지 하나 이상 있는지 체크하고 -?는 -이 하나거나 없는 상황을 체크합니다, 그리고 [a-z]+를 또 다시 사용하여 -이 소문자에 둘러쌓여있는지 체크하였습니다.

-을 사용하지 않는 경우도 있을 수 있으니 -?를 사용해주었고 소문자 자체가 없고 구두점만 있는지 체크하기 위해서 ([a-z]+(-?[a-z]+)?)? 전체 괄호 안에 ?를 사용해주었습니다.

그리고 반대로 구두점은 없고 소문자만 있는지 확인하기 위해서 (!|\.|,)?를 작성해주었습니다.

마지막으로 아에 값이 없는 경우를 체크하기 위해 IsNullOrEmpty를 사용하였습니다.