[LV0] k의 개수
방학을 맞아 메이플 스토리를 시작했다. 200만 찍먹하고 접어야지 케케케
1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ i < j ≤ 100,000
- 0 ≤ k ≤ 9
입출력 예ijkresult
1 | 13 | 1 | 6 |
10 | 50 | 5 | 5 |
3 | 10 | 2 | 0 |
입출력 예 설명
입출력 예 #1
- 본문과 동일합니다.
입출력 예 #2
- 10부터 50까지 5는 15, 25, 35, 45, 50 총 5번 등장합니다. 따라서 5를 return 합니다.
입출력 예 #3
- 3부터 10까지 2는 한 번도 등장하지 않으므로 0을 return 합니다.
사실 문제 자체는 그렇게 어렵지 않았던 것 같다. 다만.....모자랐던것은 나의 능지...?
그렇기에 메이플 스토리를 다시 시작한걸지도!
아무튼, 처음 시도했던 메커니즘은
배열을 문자로 변환 -> includes를 사용해 k가 포함되어 있는지 확인 -> 포함되어있다면 answer을 1씩 더함
function solution(i, j, k) { var answer = 0; for(let a = i; a <= j; a++){ if(a.toString().includes(k)){ answer ++ } } return answer; } |
당연히 정답인줄 알았다.
그런데, 당연히 정답일줄 알았던 코드가 테스트 케이스 1번부터 막히는 것이었다. 오잉?
테스트 케이스 1번은 1부터 13까지 1이 몇번 등장하는지 세는 문제였는데(i = 1, j = 13, k = 1)
아무리 세어봐도 1, 10, 11, 12, 13 총 5개인데 답은 6개라고 하는 것이었다.
이거 문제 오류구나!!! 하고 제보하려던 찰나....마침 통화중이던 GF에게 1부터 13까지 1이 몇개 들어가는지 물어봤는데
오잉???? GF도 6개라고 하는 것이었다!!!
트루먼쇼의 재림인가??? 생각하고 있었는데.....
"오빠 11은 1이 두개잖아!"
11은 1이 두개!!!!!
아하...그래서 1이 총 6개 등장하는 것이었다.
includes() 사용하면 문자열에서 중복된 문자를 찾을 수가 없다. 그래서 생각해 낸 것은 정규 표현식.
//g 정규 표현식을 사용하여 문자열 전체를 스캔한다면 찾을 수 있겠지!
그런데 여기서 또 문제.
정규 표현식을 사용하기 위해 코드를 includes(/k/g)로 고치니...결과가 0이 나와버리는 것이었다.
왜인지 알아본 결과! includes(/k/g)는 변수 k를 찾는것이 아니라 말그대로 문자열 k를 찾는 것이었던 것...!
숫자로만 이루어진 배열에서 k를 찾으려 드니 당연히 한개도 안나올 수 밖에 없는 것이었다..호미!!
그렇다면 정규 표현식에 변수를 사용할 수 있는 방법을 찾아야 한다. 이럴 때 쓰는 것이 바로 RegExp 객체.
RegExp는 Regular Expression, 즉 '정규 표현식'을 나타낼 수 있는 객체이다. 보통은 함수 안에 바로 넣어서 사용할 수도 있지만 이렇게 객체를 사용해서 정규 표현식을 나타내 줄 수도 있는 것 같다. 어려워있!
특히나 변수를 찾고 싶을 떄는 정규 표현식 객체+jQuery를 사용하는 것 같은데...자바스크립트 코딩 테스트에 제이쿼리를 써도 되나?? 검색해 봐야겠다.
아무튼, 이 RegExp 객체를 이용해 k를 정규표헌식으로 나타내주기로 했다.
먼저 check라는 변수 안에 RegExp 객체를 이용해 k를 전역 검색 해주기로 한다
let check = new RegExp(`[${k}]`, 'g') |
이제 check는 /변수k/g와 같은 기능을 하는 변수가 되었다.
그다음, 정규 표현식을 사용할 경우 includes()가 아니라 match()를 사용해 줘야 한다고 한다. 그렇다고 한다고 한다.
includes()의 반환 형태는 boolean. 그러니까 그 문자열이 있는지 없는지만 판단하는 것이고, 개수를 셀 수는 없기 떄문.
하지만 match()의 반환 형태는 list. length를 이용하면 포함하는 문자열의 개수까지 알 수 있다.
그러므로 우리는 includes()가 아니라 match()를 사용해야 하는 것이다.
최종적으로,
배열을 문자로 변환 -> match를 사용해 k가 "몇개" 포함되어 있는지 확인 -> 포함되어있다면 answer에 포함된 문자열의 개수를 더함. OK???
function solution(i, j, k) { var answer = 0; for(let a = i; a <= j; a++){ let check = new RegExp(`[${k}]`, 'g'); if(a.toString().match(check)){ answer += a.toString().match(check).length } } return answer; } |
includes()와 match()의 사용법, 그리고 정규표현식 객체 RegExp의 개념을 알고 나니 또 유용한 스킬을 하나 더 배운 느낌이다.
이 기세를 몰아 5차 전직 가주앙~?