jkh9615   3년 전

엄.. 안녕하세요! 처음으로 글을 남겨보네요.

우선 제목 그대로 25%에서 틀렸다고 나오네요 ㅠ

한자리수, 백의자리 수, 등 자리수가 바뀌는 경우 및 최소값, 최대값에서 테스트를 해봤을 때

맞았다고 올려져 있는 코드에서의 결과값과 동일했고, 랜덤으로 TC들을 확인해봤으나 모두 동일하여 올리게 됐습니다.

우선 간단한 로직은 다음과 같습니다.

1. arr[n+1]배열을 생성 (각 원소는 0으로 초기화)

2. 1이상 n이하 범위까지 '각 자리수+자기자신' 값을 arr배열의 인덱스에 넣고, i를 값으로 지정합니다.

     ex ) n이 216인 경우 소스코드에서 i가 198일 때 198+1+9+8 = 216을 arr[216] = 198로 저장하게 됩니다.

3. i가 for loop를 돌면서 만약 '각 자리수+자기자신' 이 n보다 커진다면, 그 이후의 값은 n을 넘어서므로 생성자로 사용이 되지 않으므로

    for loop를 break 합니다.

4. 만약 arr[i]의 값이 이미 존재한다면 그 값은 최소 생성자이므로 추가하지 않습니다. 즉 arr[i]의 값이 0 인 경우에만 값을 변경합니다.

5. 마지막으로 arr[n]의 값을 출력하면, 해당 n값의 생성자가 반환

이 되는 구조입니다.

제가 놓친 부분이나 추가적인 TC가 있을지 조언 부탁드립니다 :(

jkh9615   3년 전

자답합니다.

10번 라인에 break를 continue로 바꿔주었더니 통과됐습니다.

'어라 이게 왜 되지...?!'

생성자 자체 + 각 자리수 합이 n을 넘어가는경우 이후에도

검사가 왜 필요한지에 대해서 아이디어가 있으신 분들은 공유 부탁드립니다 흑..

jkh9615   3년 전

앗 이것도 자답합니다.

n=1000으로 두고 break일 때와 continue일 때의 생성자를 비교해봤습니다.

i. n = 997일 때

   실제 생성자 : 980

   for i가 976일 때(즉 생성자가 976일 때) n=998

   977일 때 n = 1000

   978일 때 n = 1002

   979일 때 n = 1004

   980일 때 n = 997

   의 경우가 있으며

ii. n = 999일 때 

   실제 생성자 : 981

   위와 동일하며 for i가 981일 때 999의 값이 나오는 예외가 존재하였습니다.

저와 동일한 방법으로 풀면서 문제를 겪고계실 분들께 작게나마 도움이 되길 희망합니다 :)

lcn0412   3년 전

감사합니다. 저도 break 로 짰는데 이런 반례가 있는 지 몰랐습니다.

댓글을 작성하려면 로그인해야 합니다.