-
[C#] 문자열 다루기 기본 ( TryParse(), 유니코드 )C# Algorithm 2024. 1. 31. 20:17
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12918#
문제를 보고, TryParse() 메서드를 이용하면, 간단하게 완성시킬 수 있을것 같았다.
TryParse는 캐스팅(형변환)한 값을 받지 않고, bool 값을 반환 받습니다. (성공시 true, 실패시 false)
public class Solution { public bool solution(string s) { int isInt; return int.TryParse(s, out isInt); } }
한줄로 간단하게 완성한 것 같아 뿌듯한 마음에 테스트를 해보았는데, 테스트 5, 6, 28, 29 에서 실패하는 결과가 나왔다.
실패의 원인을 찾지 못하고, 일단 다른 방법을 찾아서 테스트를 해보고, 실패 원인을 다시 찾아보기로 하였고, 반복문을 사용하여 문자열의 문자 하나하나의 크기를 확인하는 방법으로 바꿔보았다.
문자는 유니코드 문자인코딩 방식중의 하나인 UTF-16의 규칙을 따르고 있기때문에 각각의 문자는 유니코드 고유값을 가지고 있고, 컴퓨터는 이 고유값을 Binary(2진)으로 변환해 0000000000110110 이런식으로 읽어들인다.
// unicode binary value // a = 0000000001100001 // b = 0000000001100010 // c = 0000000001100011 // d = 0000000001100100
아래에는 UTF-16으로 표현가능한 문자들의 Binary, Hex, Decimal 등 구체적인 값들을 표시해놓은 사이트 이다.
링크 : UTF-16 Table
문자(char)와 숫자(int)에 비교연산자를 사용을 해보니, 문자를 유니코드의 Decimal(10진수)값으로 암시적 형변환을 하여 비교하고 있었다.
문자 '0' 부터 '9'의 10진수 값은 48 부터 57이고, 알파벳 대,소문자는 모두 이보다 값이 큰 것으로 확인이 되어, 이를 이용하여 문자의 크기를 비교하는 방식으로 문제를 풀어보았다.
public class Solution { public bool solution(string s) { for(int i = 0; i < s.Length; i++){ if(s[i] > 57){ return false; } } return true; } }
그 결과, 테스트의 전체적인 연산 속도는 줄어들었지만, 이번 역시 같은 구간에서 실패가 나왔다.
원인을 모른채, 다시 문제를 읽어보는데...
문제의 가장 첫 문장에 적힌 조건을 빠트린채 풀고 있던 것이었다. ( 문자열 s의 길이가 4 혹은 6이고, )
빠르게 조건을 추가하여 코드를 작성해 보았다.
public class Solution { public bool solution(string s) { if(s.Length == 4 || s.Length == 6){ for(int i = 0; i < s.Length; i++){ if(s[i] > 57){ return false; } } return true; } return false; } }
결과는 모든 테스트를 통과하였다.
문제의 조건과 제한사항을 꼼꼼히 살펴보지 않아서 길을 크게 돌아가는 경험을 하였다..
앞으로 문제 풀기에 앞서 조건과 제한사항을 명확히 인지해야겠다 생각이 들었다.
*하지만 덕분에 TryParse() 메서드가 생각보다 연산속도가 느리다는 것 과, 문자의 유니코드에 대해 학습하게 되었다. ( 문자와 숫자에 비교연산자 사용시, 문자의 형변환에 대해서도.. )
'C# Algorithm' 카테고리의 다른 글
[C#] 부족한 금액 계산하기 ( 등차수열 ) (0) 2024.02.05 [C#] 하샤드 수 확인하기 (1) 2024.01.15 [C#] 자연수 뒤집어 배열로 만들기. (0) 2024.01.12 [C#] LeetCode 문제 번호 84 ( X ) (0) 2024.01.05