드림오구
article thumbnail

1. 🌊 k의 개수 - Lv.0

1.0.1. 🐤 문제 설명

1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.

 

1.0.2. 🐣 제한사항

  • 1 ≤ i < j ≤ 100,000
  • 0 ≤ k ≤ 9

1.0.3. 🐥 입출력 예

i j k result
1 13 1 6
10 50 5 5
3 10 2 0

 

1.0.4. 🐋 입출력 예 설명

입출력 예 #1

  • 본문과 동일합니다.

입출력 예 #2

  • 10부터 50까지 5는 15, 25, 35, 45, 50 총 5번 등장합니다. 따라서 5를 return 합니다.

입출력 예 #3

  • 3부터 10까지 2는 한 번도 등장하지 않으므로 0을 return 합니다.

1.0.5. 🐳 나의 풀이

첫 풀이시 i를 i~j에 k가 있기만 하면 true를 반환하는 if문을 만들어 result 값을 1씩 올려주었지만, 이렇게 하면 오답이 출력된다. 

<javascript />
const solution = (i, j, k) => { // input i, j, k // for문을 돌리기? let result = 0; for (let num = i; num <= j; num++) { if (String(num).includes(String(k))) { result++; } } return result; }; let output = solution(1, 13, 1); console.log(output); // 5 output = solution(10, 50, 5); console.log(output); // 5 output = solution(3, 10, 2); console.log(output); // 0

 

문제가 요구는 i, j, k가 각 1, 13, 1일 경우 1, 10, 11, 12, 13 총 5개가 아닌 11을 십의 자리와 일의 자리를 각각 세어줘야 한다. 

그래서 문자를 split('')로 분리하여 중첩 for문을 돌려주어 해결했다. 

<javascript />
const solution = (i, j, k) => { // input i, j, k // for문을 돌리기 let result = 0; for (let num = i; num <= j; num++) { const split = String(num).split(''); for (let num2 = 0; num2 < split.length; num2++) { if (split[num2].includes(String(k))) { result++; } } } return result; }

 

1.0.6. 🐬 다른 사람의 풀이

<javascript />
function solution(i, j, k) { let a =''; for(i;i<=j;i++){ a += i; } return a.split(k).length-1; }

너무 간단하게 푼 다른 분의 풀이를 분석해보자.

for문에 늘 let i = 0을 적어 for문 내부에서 변수를 할당해주었는데 부모에게서 받아온 변수를 그대로 써도 된다.. 

문자열 a에 i부터 j까지의 모든 수를 추가하고 k로 split한 후 length - 1을 출력하는 것이 굉장히 깔끔해 보인다.

 

1.0.7. 🦄 알아보기

조금 더 가독성 있는 방법을 고민해볼 것. 

 

profile

드림오구

@드림오구