wnsrnek3   2년 전

큰 수 조차 결과가 너무나도 잘나오는데


계속해서 틀렸습니다..라고하는데


출력문제인가싶은데 어떻게해도 결과가 안나옵니다..


부디 도와주십시오..

koosaga   2년 전

13번째 줄이 이상하네요

wnsrnek3   2년 전

먼저, 답변 대단히 감사드립니다!!

그런데 어떻게 이상하다는 말씀이신지 혹시 조금만 자세히 설명해 주실수 있으실까요?

배열 처음 앞부터 충분히 큰 수까지 돌려가면서 확인하는건데...ㅠㅠ

portableangel   2년 전

5번 줄 int res[100]; 을 int res[100]={0}; 으로 바꿔보세요

koosaga   2년 전

음 일단 int res[100] = {0}; 을 하면 아마 예제가 안 나올 거 같은데...

공짜로 주는 건 좀 그렇고 제가 역으로 질문을 하겠습니다. res 배열의 사이즈를 100으로 잡으셨고 0 ~ ii - 1 인덱스까지 원하시는 값을 채우셨습니다. 그리고 0 ~ 99번 인덱스를 보시고 계시는데, ii ~ 99번 인덱스에 무슨 값이 들어가길 원하시는 건가요? 무슨 값이 들어가는 상황을 가정하셨나요?

wnsrnek3   2년 전

@portableangel

  답변감사합니다.. 근데 18번째 줄을 살펴보면, 말씀하신대로 처리했을경우 res배열안에 0로 초기화될텐데, 그러면 그 0을 유효숫자로 보게되어 결과가 이상해집니다..


@koosaga

100이라는것은 충분히 큰수로서 정한것이죠. 왜냐하면 10억까지만 입력을 받는다고 하였고, 이를 2진수로 나타낸다 하여도 32비트 안에 모두 표현할수 있구요. 32보다 적당히 큰 100을 그냥 임의로 잡은것이구요(32정도 만 해도 상관없겠네요).


전체적인 코드 로직을 말씀드리자면, 먼저 while문에서 나머지를 구해나갑니다.(초/중등수학때 배운 진법변환 하듯이요)

그리고 그 나머지들을 res배열에 int형태로 저장해두고, 후에 그것을 char로 바꾸어 res2에 저장해두는 것이 저 for문이 하는 일입니다. 자릿수는 최대 32비트라고 말씀드렸으므로 그냥 적당히 큰 수인 100으로 두었고, 저장된 범위를 벗어나게 되면 100까지도 가기 전에 else를 통해 for문을 탈출하는 것이지요.


흐음....ㅠ


wnsrnek3   2년 전

일단 문제는 해결했습니다.


초기화를 아예 안했을때에는 코드가 작동하지 않았는데, (0이 아닌) -1로 초기화하여 처리하니, 정상적으로 작동합니다.


wnsrnek3   2년 전

제생각엔 아마 컴파일러에 따라 초기화 하지 않은 변수를 0으로 초기화하였기에, for문을 정상적으로 탈출하지 못하는 경우가 발생하지 않았나 싶습니다.


제대로된 초기화의 중요성.

koosaga   2년 전

전역 변수로 배열을 잡으면 0으로 초기화되고, 지역 변수로 배열을 잡으면 랜덤한 값으로 초기화 됩니다. 컴파일러에 따른 내용이 아니라 C 표준입니다. 어떤 값으로 초기화 된다고 생각하셨는지 궁금해서 질문을 드린건데 답변은 완전히 관련이 없는 얘기네요.. 해결하셨으니 다행입니다. 

wnsrnek3   2년 전

@koosaga 님,

어떤 내용에 대한 질문투척이신지 이해를 잘 못해서 다른부분에대해 설명을 장황하게 펼쳐버렸군요..
지금 다시 읽어보니, 그 빈부분에 대한 값 셋팅이 가장 중요한 문제였네요. 

훌륭한 지적을 잘 캐치해내지 못해서 부끄러울 따름입니다..(ㅠㅠ)

답변 대단히 감사드립니다 ! ㅎㅎㅎ


그런데, 갑자기 의문이 생겼는데요..

제 생각으로는 int res배열은 초기화하지 않았으므로 나머지 정보가 없는 곳에는 

쓰레기값이 들어가있다고 판단해서 0~35 이외의 값이 있을거라고 가정했고,

그렇게 0~35 이외의 범위의 값일 경우. 쓰레기값을 만났을경우. 정보가 없는 곳에 도달할 경우.

를 마지막으로 판단했는데

그렇게 되지 않은 이유는 무엇이었을까요...? ㅠ

(+ 아, 실제로 제 VS2015에서는 결과는 정상적으로 나오는데, 저지에 제출했을때는 오답으로 뜨는 이유가...ㅠㅠ 무엇일까요)

koosaga   2년 전

"쓰레기값이 들어가있다고 판단해서 0~35 이외의 값이 있을거라고 가정했고,"

쓰레기 값이 쓰레기 값인 이유는 그 값에 어떤 게 들어갈 지 모르기 때문입니다. 0~35 이외의 값이 있을 거라고 가정할 이유가 전혀 없습니다. 당연하지만 증거가 없을 때는 함부로 가정하면 안됩니다. 아니면 그 가정에 책임을 지셔야 합니다.


참고로 쓰레기 값으로 들어갈 확률이 가장 높은 값은 0입니다. 컴퓨터를 껐다 키면 메모리가 휘발되었을 테니 다 0으로 차있죠. 그러면 아무데나 집으면 0일 가능성이 제 주민번호 앞자리일 가능성보다는 훨씬 크겠죠...?

wnsrnek3   2년 전

그렇군요.... 감사합니다!

실제로 제 VS에서 디버깅했을때는 -85......이 뜨길래 이런식으로 구현해도 상관없겠구나 했는데,

항상 이렇다고 정해져있는게 아니라, 말씀하신것처럼 0으로 쓰레기값이 들어갈수도있겠네요 (환경이 달라지거나 했을경우..)

말씀하신논리 잘기억하고 앞으로 더 열심히 공부하겠습니다 ㅎㅎ 다시한번 감사드려요

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