Machineboy空

Excercism - ISBN Verifier : 문자열 다루기 Split, Concat, Replace, IsDigit 본문

Computer/Coding Test

Excercism - ISBN Verifier : 문자열 다루기 Split, Concat, Replace, IsDigit

안녕도라 2025. 2. 13. 12:28

문제요약

유효한 ISBN 문자인지 확인하라.

 

https://exercism.org/tracks/csharp/exercises/isbn-verifier

 

ISBN Verifier in C# on Exercism

Can you solve ISBN Verifier in C#? Improve your C# skills with support from our world-class team of mentors.

exercism.org


난이도

Medium


풀이 포인트

  • 문자열 다루기
//Split
string[] strs = str.Split('-');

//Replace
string str1 = str.Replace("-","");

//Concat
string str2 = string.Concat(strs);
  • 문자 숫자 변환
char c = '8';

// 문자(char)에서 숫자(int)변환
Int.Parse(c.ToString());	// 8

// 문자(char)가 숫자인지 확인
char.IsDigit(c) // true

REVIEW

 

문자열을 자유자재로 다루는 것이 아직 부족하다.

3-598-21507-X 형태의 문자에서 -를 제외하고 규칙에 따라 셈을 해 주어야 하는데,

나는 - 기준으로 문자열을 split한 후에 다시 concat으로 문자열을 이어준 다음 나머지 연산을 해 주었고,

모범풀이 1에서는 replace("-","")로 아예 원본 문자열을 변형하였으며,

모범풀이 2에서는 문자열을 따로 만들지 않고, 현재 탐색하는 문자열이 -라면 넘어가는 식으로 구현하였다.

 

문자열에 대한 능숙도에 따라 코드가 이렇게 너저분해질 수 있음..


CODE

//나의 너저분 풀이
using System;

public static class IsbnVerifier
{
    public static bool IsValid(string number)
    {
        string[] numChunks = number.Split('-');
        string onlyNum = string.Concat(numChunks);
        if(onlyNum.Length != 10) return false;
        
        string onlyNum9 = onlyNum.Substring(0, 9);

        int a = 10, sum = 0;

        foreach(char c in onlyNum9){
            int num = -1;
            if(c <= 'Z' && c >= 'A'){
                return false;
            }
            else
            {
                num = int.Parse(c.ToString());
            }
    
            sum += num * a;
            a--;
        }

        if(onlyNum[9] == 'X') 
        {
            sum += 10;
        }else{
            if(onlyNum[9]<='9' && onlyNum[9] >= '0')
            {
                sum += int.Parse(onlyNum[9].ToString());
            }else{
                return false;
            }
        }
        
        return sum%11 == 0;
    }
}
using System;

public static class IsbnVerifier
{
    public static bool IsValid(string number)
    {
        int idx = 10, sum = 0;
        foreach (char ch in number)
        {
            if (ch == '-')
                continue;
            if (idx == 0 || (ch == 'X' && idx != 1))
                return false;
            if (!char.IsDigit(ch) && ch != 'X') // 🔹 숫자가 아니고 'X'도 아니면 잘못된 입력!
                return false;
            
            int num = ch == 'X' ? 10 : ch - '0';
            sum += num * idx--;
        }
        return sum % 11 == 0 && idx == 0;
    }
}