네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
쉽게 말해서 "one4seveneight"
라는 값이 주어지는데 이를 모두 숫자로 바꾸면 된다.
한 번에 유레카! 하면서 이렇게 하면 되겠다 하고 푼건 아니라 중간에 코드를 바꿔가면서 풀었다.
먼저 숫자인지, 문자인기 구분하기 위해 string을 char 배열로 바꾸었고
public int solution(string s)
{
char[] _numbers = s.ToArray();
}
이를for
문을 사용해서 하나씩 검사하며 문자라면 어딘가에 쌓아두고, 숫자라면 그대로 쌓는 방식을 활용하고자 했다.
숫자, 문자 검증은int.TryParse()
를 활용해서 간단하게 했다. 만약 위 값이 false. 즉, 문자라면 다음이 숫자일 때 까지 반복하며 값을 합쳐서 확인을 해보고자 했다.
이때는 숫자 저장용 stringBuilder
와 상단에 zero = 0으로 치환된다는 조건은 Dicitionary
에 넣어두고 활용했다.
이제 for을 돌면서 가장 먼저 stringBuilder에 저장해놓은 값과, Dictionary의 조건을 비교하며 값을 담아주고
문자 일 때는 sb에 저장, 숫자일때는 그대로 저장하며 반복문을 돈다. 마지막으로 반복문을 나와서 sb에 남은 값이 있다면 한 번 더 찾아보고
int 형 list를 int로 변경해주면 끝이다.
낭비되는 변수
int[] _answer = new int[_numbers.Length]; if (!int.TryParse(_numbers[i].ToString(), out _answer[i]))
이렇게 out을 위해서만 사용되는 answer이 너무 아깝게 느껴졌다. 이걸 어떻게 활용할 수도 있지 않았을까?
두 번 반복되는 같은 코드
stringBuilder로 Dictionary를 체크하는 코드가 마지막에 한 번 더 들어가는데, 이를 함수로 따로 구분해서 해야할 필요가 있을까 고민이 된다.
변수 이름의 문제
자꾸 혼자만 보는 코드라 생각해서 그냥 dic, list 이런 식으로 이름을 짓는것 좋지 않다고 보인다. 미리 습관을 잘 들여두자.