인프런 커뮤니티 질문&답변

guy t님의 프로필 이미지
guy t

작성한 질문수

it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비

30. 3의 개수는? (large : 제한시간 1초)

문제 설명이 너무너무 난해합니다..

작성

·

354

1

작은 수 부터 차근차근 다시 설명하는 영상이 필요할듯합니다.

왜 저렇게 계산해야하는지 이유는 없고 방법만 있습니다.

좀더 디테일한 영상 다시 부탁드립니다.

답변 3

16

김태원님의 프로필 이미지
김태원
지식공유자

1부터 123까지나 1부터 124까지, 1의 자리에 3이 등장하는 횟수는 같습니다. 1의 자리 하나에서만 3의 개수를 구한다면 똑같은 계산법을 해도 상관없지만  하나의 코드패턴을 반복해서 1의 자리, 10의 자리, 100의 자리, 1000의 자리... 등 각각의 모든 자리에서 3의 개수를  논리적 오류없이 정확하게  답을 구하는 코드패턴을 찾다보니 그런것입니다.

※ cur==3일 때는 마지막의 경우는 따로 카운팅합니다. 왜 그러는지 그 예를 들어보겠습니다.

만약 1부터 536까지 숫자를 쓸때 각 숫자의 10의 자리에 3이 몇 번 등장하는지 계산해 보면  left=5, cur=3, right=6인 상황이며

03*인 경우  별자리에 0부터 9까지 10개

13*인 경우 별자리에 0부터 9까지 10개

23*인 경우 별자리에 0부터 9까지 10개

33*인 경우 별자리에 0부터 9까지 10개

43*인 경우 별자리에 0부터 9까지 10개

53*인 경우 별자리에 0부터 9까지 10개가 생기는 것이 아니라 0부터 6까지 7개만 생기므로 따로 카운팅합니다.

그래서 결과적으로 계산은 left=5, right=6이므로 (5*10)+(6+1)로 계산하는 것입니다. 

※ 1부터 123까지 숫자를 쓸 때 각 숫자의 1의 자리에 3이 등장하는 횟수를 계산할 때는 cur=3이므로 cur==3일 때 계산에 따라 

003, 013, 023, 033, 043, ......103, 113까지 12개와 123인 마지막 경우는 cur뒤쪽의 경우는 따로 카운팅하겠다는 것입니다. 따로 세는데 right값이 0이므로  right+1=1인 이경우가 123숫자의 일의 자리 3을 한 번 카운팅한 것입니다. 1의 자리에서 3을 카운팅할 때만큼은 1230과 같은 경우를 123이라는 숫자의 일의자리 3을 카운팅했다고 생각하시면 좋겠습니다. 결과는 (left*k)+(right+1)= (12*1)+(0+1)=13이 일의 자리에서 3이 등장하는 횟수입니다.

※ 1부터 124까지 숫자를 쓸 때 각 숫자의 1의 자리에 3이 등장하는 횟수를 계산할 때는 cur=4라서 cur>3계산법으로 합니다.

003, 013, 023, 033, 043, ......103, 113, 123 까지 바로 계산되어 (left+1)*k=(12+1)*1=13으로 바로 계산한 것입니다.

cur이 3보다 크면 cur 앞쪽의 경우 (left+1)의 경우 한가지 한가지 마다 cur 뒤쪽의 경우가 무조건 k가지(1, 10, 100, 1000 식으로..)가 생기므로 (left+1)*k로 하는 것입니다.

0

guy t님의 프로필 이미지
guy t
질문자

네 답변 감사드립니다.

세자리 숫자로 혼자 해보고 있으나 쉽지않네요. 특히 1의 자리일때 if문에서 수식이 달라지는 이유를 잘 모르겠습니다. 3의 갯수는 123이나 124나 같은데 말이죠.. 수학문제라면 어떻게 저런 코드가 나왔는지 자세히 설명 부탁드립니다 선생님.

0

김태원님의 프로필 이미지
김태원
지식공유자

29번 풀이처럼 하면 N제한이 커서 시간초과가 나기 때문에 수학으로 풀듯이 코드 접근을 한 것입니다.

사실 입문강좌에 넣기에는 많이 어려운 코드라 넣지 말까 고민도 했던 문제입니다. 코드라기 보다는 수학문제에 가깝습니다. 

지금 이해가 안가시면 잠깐 건너뛰시고 강좌를 다 들은 후 다시 한번 보시기 바랍니다. 

저도 작은 숫자를 가지고 칠판에서 설명하는 영상을 조만간 찍어 올리도록 하겠습니다.

guy t님의 프로필 이미지
guy t

작성한 질문수

질문하기