Machineboy空

Excercism - PhoneNumber : Regular Expressions 본문

Computer/Coding Test

Excercism - PhoneNumber : Regular Expressions

안녕도라 2025. 3. 4. 12:02

문제요약

뒤죽박죽 입력되는 전화번호를 하나의 형식으로 변환해라

 

https://exercism.org/tracks/csharp/exercises/phone-number/dig_deeper


난이도

Easy


풀이 포인트

  • 문자열 다루기
  • Regular expression(regex)

https://exercism.org/tracks/csharp/exercises/phone-number/approaches/regular-expression

 

Explore the 'Use a regular expression' approach for Phone Number in C# on Exercism

Explore the 'Use a regular expression' approach for Phone Number in C# on Exercism. Use a regular expression to check and parse the phone number.

exercism.org

  • char.IsDigit() 숫자 체크
  • LINQ

REVIEW

 

멋진 풀이는 아니지만 또 조건을 빠짐없이 만족시킬 수 있는 케이스를 나열하는 조건문으로 풀었다.

주어진 문자열, 즉 문자들의 조합속에서 쿼리로 조건을 만족하는 문자들을 걸러내는 작업이므로

LINQ 연습하기 좋겠다는 생각이 들었고 또 가끔 등장하는 regex에 대해서도 한번쯤 알아두려고 정리한다.


CODE

// Regex 풀이

public static string Clean(string phoneNumber)
{
    var match = Regex.Match(phoneNumber, @"^(\+?1)?[^\d]*?([2-9]\d{2})[^\d]*?([2-9]\d{2})[^\d]*?(\d{4})[^\d]*$");

    if (!match.Success)
        throw new ArgumentException("Invalid phone number", nameof(phoneNumber));

    return $"{match.Groups[2].Value}{match.Groups[3].Value}{match.Groups[4].Value}";
}
// 내 풀이
public class PhoneNumber
{
    // area code + seven-digit local number(exchange code - subscriber number)
    // N : 2~9
    // X : 0~9
    // 가끔 1 +1 prefixed
    public static string Clean(string phoneNumber)
    {
        if(phoneNumber.Length < 10) throw new ArgumentException();

        if(phoneNumber[0] == '+') {
            phoneNumber = phoneNumber.Substring(2);
        }else if (phoneNumber[0] == '1'){
            phoneNumber = phoneNumber.Substring(1);
        }

        int cnt = 0;
        string cleaned = "";
        foreach(char c in phoneNumber)
        {
            if(char.IsDigit(c)){
                if(cnt == 0 || cnt == 3) {
                    if(c < '2' || c > '9') throw new ArgumentException();
                    cleaned += c;
                    cnt++;
                }else {
                    cleaned += c;
                    cnt++;
                }
            }
        }

        if(cleaned.Length != 10) throw new ArgumentException();
        Console.WriteLine(cleaned);
        return cleaned;
    }
}