[프로그래머스 | 0단계] 숫자, 문자열 데이터 가공 TIL
오늘 푼 5가지 문제는 숫자, 문자열 데이터를 골라내서 가공하는 문제였다.
[푼 문제 목록]
- 숨어있는 숫자의 덧셈
- 순서쌍의 개수
- 문자열안에 문자열
- 자릿수 더하기
- 모음 제거
각각의 요소를 조작해야 할 경우, 매개변수로 들어온 값이 string일 때에는 주로 배열로 변환해서 배열 내장 메서드를 활용한다.
String.prototype.split()
문자열을 한 char 단위로 쪼개고싶을 때에는 .split("") 을 해주면 된다. split(구분자) 구분자가 공백이 될수도 있고 ""아무것도 없는 따옴표를 넣어주면 apple -> a,p,p,l,e로 쪼개준다. 새배열을 반환하는 것은 아니므로 변수에 담아줘야 한다.
내 경우는, 숫자로 들어온 매개변수 n값을 toString()을 통해 형변환 시켜준 뒤 ... (전개 연산자)를 통해서 각 요소를 쪼갰다.
let answer = [...n.toString()];
Array.from()
참고로 데이터가 문자열이고 각각의 char요소로 쪼개고싶을 때는 Array.from()을 활용하면 손쉽게 쪼갤 수 있다.
console.log(Array.from('foo'));
// Expected output: Array ["f", "o", "o"]
Array.prototype.reduce()
reduce는 누적된 값을 반환할 때 좋다. 초기값을 설정해줄수도 있으며 생각지도 못한 부분은 만약 배열의 요소가 string값이고 number로 형변환 한 뒤, 더한 값을 return해야 한다면 앞 뒤에 Number()로 형변환 할 필요없이 초기값을 0으로 주면 acc 의 값은 숫자가 된다. cur 값만 Number로 형변환해주면 number + number 연산이 되기 때문에 두 값을 더한 값을 리턴해줄 수 있다. 글로 이해가 잘 안되기 때문에 아래의 예시를 보면 이해가 잘 될 것이다.
// 내 코드
function solution(n) {
let answer = [...n.toString()];
return answer.map((a) => Number(a)).reduce((a, b) => a + b);
}
- 내 코드에서는 map을 통해서 모든 배열의 값들을 number로 형변환 해준 뒤 reduce를 사용했다.
// 남의 코드
function solution(n) {
return n
.toString()
.split('')
.reduce((acc, cur) => acc + Number(cur), 0);
}
- 다른 풀이에서는 map을 쓰지않고 reduce내에서 cur값만 Number로 형변환해줬다.
String.prototype.replace() + 정규 표현식
function solution(my_string) {
return my_string.replace(/a|e|i|o|u/g, '');
// replace(/[aeiou]/g, "") 와 동일
}
- replace는 인자로 패턴(string 혹은 정규표현식)과 대체할 값(string 혹은 function), 2개의 인자를 받는다.
- 나는 string에서 모음인 a,e,i,o,u를 걸러내야 했는데 정규표현식 관련 내용을 찾아보니 |가 or연산자인 것을 발견해서 위와 같이 작성했다.
- 타인의 코드에서는 [aeiou] 로 해결했길래 무엇인지 찾아보니 2가지 방법이 있는 거 같았다.
- 정규 표현식 개념 사이트 링크
[정규식] 핵심만 모아놓은 Cheat Sheet
예제를 통하여 정규식의 핵심적인 내용만 깊이있게 알아봅니다
chrisjune-13837.medium.com
Array.prototype.includes() // ES6
매개변수로 str1, str2 두 개의 string 값을 받고 str1에 str2가 포함되는 지 확인할 때 includes를 활용했다.
특이한 점은 split()을 통해서 코드를 작성한 사람도 있었는데.. 저렇게 나눴을 때 어떤 값이 나오는 지 확인해봐야 한다.
// 남의 코드: str1에 str2가 포함되면 return 1 아니라면 2
function solution(str1, str2) {
return str1.split(str2).length > 1 ? 1 : 2;
}
다른 사람들은 search(), indexOf(), match()등을 활용했다. 내 경우는 true false값을 반환하는 직관적인 내장 메서드가 좋을 거 같아 includes를 사용했다.