2022. 12. 30. 20:30ㆍcode/[프로그래머스] python
문제
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
입출력 예
입출력 예 설명
입출력 예 #1
- 본문과 동일합니다.
입출력 예 #2
- 10부터 50까지 5는 15, 25, 35, 45, 50 총 5번 등장합니다. 따라서 5를 return 합니다.
입출력 예 #3
- 3부터 10까지 2는 한 번도 등장하지 않으므로 0을 return 합니다.
✔풀이
def solution(i, j, k):
answer = 0
for num in range(i,j+1):
for index_num in range(len(str(num))):
if str(k) in str(num)[index_num]:
answer+=1
return answer
📝설명
문제에서는 i를 시작으로 j까지 (j포함)한 수에서 숫자 k가 몇번 나오는지를 retrun해달라고 하고 있다.
369게임이랑 비슷하다고 생각하면 될 것 같다.
33의 경우 박수를 두 번 치는 것처럼, 만약 k가 1인 상태에서 11을 고려해봐야 한다면 answer에는 2번의 카운팅이 더해져야 한다.
이런 점들을 착안해서 코딩을 짰다.
우선 for문을 통해서 num을 순서대로 꺼내는데, 이 때 반복 범위는 i이상 j이하여야 하니까! range(i, j+1)로 했다.
데려온 숫자 num이 k를 중복해서 가질 수 있는 경우를 고려해서 안에 for문을 또 집어넣었다.
조금 복잡하게 짰다고 생각하는데, 두자리 세자리 숫자를 각각 쪼개는 게 참 난감했다.
그래서 문자열로 바꾼 다음 길이를 len으로 계산하여 반복범위를 돌리도록 했다.
즉, 현재의 num이 만약 23이라면 str(num)으로 "23"으로 만들고, len으로 2와 3을 가지고 있는, 즉 2개의 문자열을 가지고 있다고 해서 range안의 숫자가 2가 되도록 한다는 것이다.
그럼 이 for문에서 index_num은 문자열 num의 길이만큼 반복이 된다.
두자리 숫자라면 두번(index_num으로는 0,1), 세자리 숫자라면 세번(index_num으로는 0, 1, 2),..을 돌면서 숫자안에 k가 있는지 없는지 확인할 수 있다.
k가 있는지 없는지 확인하기 위해서 조건을 담은 if문을 넣었다.
str(num)의 index_num을 통해 num의 숫자 하나하나를 str(k)와 비교하게 했다.
그 이유는 k가 문제에서 int로 줬지만, 비교를 하려면 이 방법이 좋을 것 같다고 판단했기 때문이다.
이게 무슨 말이냐면, 앞에서 예를 들었던 것 처럼 지금의 num이 23이라면 str(num)은 "23"이고, str(num)[0]="2", str(num)[1]="3"인 것인데!!
str(num)의 길이가 2이므로 index_num은 for문에서 0,1로 총 2번을 반복할 수 있다.
그러면 우선 index_num이 0일 때, str(k)인 (k가 3이라고 해보자.) "3"이 str(num)[0]안에 있나요? 라고 if문을 통해 확인한다.
아니니까 넘어가고, 그 다음 index_num인 1로 다시 if문을 돌린다.
str(num)[1]이 "3"이니까 동일하다.
그럼 answer에 1을 더하도록 한다.
이런식으로 한다면 결과를 도출해 낼 수 있다.
➕개선한다면?
👑모범 답안
🔎풀어쓴다면
이렇게 생겼다.. 고놈 참 깔끔하게 생겼군.
문자열로 변환한 i에서 count를 사용해서 str(k)의 개수를 계산했다.
직접 코드를 돌려보니, 내 코드보다 소요시간이 적었다.
이렇게 짜는거군 코딩은..
💻 문제 출처
'code > [프로그래머스] python' 카테고리의 다른 글
[코딩 테스트 연습 입문] 외계어 사전 (0) | 2022.12.30 |
---|---|
[코딩 테스트 연습 입문] 종이 자르기 (0) | 2022.12.30 |
[코딩 테스트 연습 입문] A로 B 구하기 (0) | 2022.12.30 |
[코딩 테스트 연습 입문] 직사각형 넓이 구하기 (0) | 2022.12.29 |
[코딩 테스트 연습 입문] 최댓값 만들기 (2) (0) | 2022.12.29 |