Ayden's journal

문자열 바꿔치기

문제 : 프로그래머스 레벨 1 - 숫자 문자열과 영단어

 

나의 풀이

사실 이 문제는 오늘이 두 번째 풀어보는 거다. 자바스크립트 처음 입문했을 쯤에 아주 간단해보여서 시도했다가 크게 엿을 먹고 도망쳤던 기억이 있다. 이후로 반년 정도가 지났고, 알고리즘 공부한지 한 2주 정도 된 지금 시점에서는 아주 간단하게 풀 수 있었다.

문자를 하나씩 받으면서 stack에 넣어주다가 해당 stack의 문자열이 switch의 특정 문자열과 일치하면 answer에 담아주고, 마지막에 이 answer의 문자를 숫자형으로 바꿔주기만 하면 끝이다.

function solution(s) {
var answer = "";
let stack = ""
for (const i of s) {
if (!isNaN(i)) {
answer+=i
} else {
stack += i
switch (stack) {
case "zero":
answer += "0"
stack = ""
break;
...
}
}
}
return Number(answer);
}

switch 조건문에다가 zero부터 nine까지 10개의 경우를 모두 박아버려 너무 길어져서 위의 코드에서는 생략했다.

 

split과 join은 생각보다 더 강력하다

늘 그렇듯 더 좋은 풀이가 있는지 확인하기 위해 다른 사람들의 코드를 둘러보다가 큰 충격을 받았다. 같은 문제를 해결한 방식이라고는 도저히 믿어지지 않았다.

function solution(s) {
let numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
var answer = s;
for(let i=0; i< numbers.length; i++) {
let arr = answer.split(numbers[i]);
answer = arr.join(i);
}
return Number(answer);
}

나는 이 메소드들을 각각 split("")과 join()으로만 사용해왔다. 그냥 문자열을 잘게 분해하여 특정한 로직으로 item을 처리하고, 이렇게 처리된 배열을 다시 하나의 문자열로 합치는 데에만 사용해온 것이다. 그러나 이 사람은 그 이상을 보여주었다.

 

split 메소드는 아규먼트로 받은 문자열을 기준으로 하나의 문자열을 배열로 변환해준다. 만약 아규먼트로 들어온 문자열이 기존의 문자열에 존재하지 않는다면 기존의 문자열을 통채로 item으로 가지고 있는 길이 1짜리 배열이 된다.

function spliter(str) {
let arr = str.split("Z");
return arr;
}
console.log(spliter("ABC")) // ["ABC"]
console.log(spliter("ABZC")) // ["AB", "C"]
console.log(spliter("ZABZC")) // ["", "AB", "C"]

여기서 주의깊게 보아야 할 것은 크게 두 가지이다. 우선 한 가지는 조건에 맞는 문자("Z")가 있는 경우 split 메소드는 해당 문자를 기준으로 문자열을 나누게 되며, 조건에 맞는 문자는 사라진다는 점이다.

그리고 다른 한 가지는 조건에 맞는 문자가 맨 앞에 있을 경우 빈 문자열과 나머지 문자열로 나눠지게 된다는 것이다. 이는 곧 split 메소드로 생성되는 배열의 길이는 조건에 맞는 문자의 갯수 + 1이 된다는 의미이기도 하다.

 

반대로 join 메소드는 배열을 문자열로 합치는 과정에서 item과 item 사이에 특정 조건의 문자를 삽입할 수 있다. 따라서 str.split("").join()으로 사용할 경우 ─ 조건이 빈 문자열이기 때문에 ─ 각각의 문자를 조각 내서 배열로 만들고, 이를 다시 합치는 과정에서 item과 item 사이에 아무것도 넣지 않는 것이다.

 

그런데 이 메소드를 조합하면 조건에 맞는 문자를 없애고, 그 자리에 원하는 문자를 넣는 식으로 사용할 수 있는 것이다. 뭐랄까 코페르니쿠스적 전환이라는 게 대충 이런 느낌일까 싶었다.

 

오늘의 기억할만한 코드

// 문자열에서 A와 일치하는 문자열을 B로 변경
str.split(A).join(B)

 

블로그의 프로필 사진

블로그의 정보

Ayden's journal

Beard Weard Ayden

활동하기