벌써 어제 말한 내일이 되었는데 답을 주신 분이 아무도 없어서 좀 뻘쭘하네요. :-P 그리고 어제 문제에 O(1)이라고 적었는데 엄밀히 얘기하자면 O(log 10 n)이라고 적었어야 했네요. 죄송합니다. ... 문제를 잠시 생각해보면 1~n까지의 수들 중 1의 개수를 얻기 위해서는 해당 숫자 n의 각 자리의 1의 개수가 모두 몇개나 될지를 구해서 더하면 된다는 사실을 알 수 있습니다. 예를 들어 13이라는 수를 생각해 보면 1~13까지의 수에서 1의 자리에는 1이 모두 몇개나 되는지와 10의 자리에는 모두 몇개나 되는지를 구해 이 값을 더하면 됩니다. 먼저 1의 자리를 생각해 보면 1, 11의 두 개가 있으며 10의 자리의 경우, 10, 11, 12, 13의 네 개가 있습니다. 따라서 2+4=6이라는 값을 구할 수 있습니다. 이번엔 234라는 수에서 10의 자리를 예로 들어 살펴 보겠습니다. 1~234라는 수들 중 10의 자리에 1이 들어가는 수는 10, 11, ..., 19, 110, 111, ... 119, 210, 211, ..., 219들로 모두 30개가 있음을 알 수 있습니다. 이 규칙들을 보면 해당 자리수의 1의 개수를 구하는 공식을 만들 수 있습니다. 234의 10의 자리에 해당하는 1의 개수는 ((234/100)+1)*10이 됩니다. 여기서 +1은 해당 자리수의 수가 0이 아닌 경우에만 더해집니다. 예를 들어 204라면 ((204/100)+0)*10으로 30개가 아닌 20개가 됩니다. 이런 방식으로 234의 각 자리수의 1의 개수를 구하면 1의 자리에 해당하는 1의 개수는 ((234/10)+1)*1=24개가 되고 100의 자리에 해당하는 개수는 ((234/1000)+1)*100=100이 됩니다. 이들 세 수를 모두 합하면 24+30+100=154개가 됩니다. 한가지 추가로 생각해야 할 점은 제일 큰 자리의 수가 1인 경우 위의 공식이 아닌 다른 공식이 필요하다는 점입니다. 예를 들어 123에서 100의 자리에 해당하는 1의 개수는 ((123/1...
벼랑끝 전술... ;ㅁ;
ReplyDelete펜과 종이로 재현하는건.. 제 고등학교 시절이 생각나는... 자습시간때문에 컴퓨터 앞에 앉을 시간이 없어서, 주중에는 노트에 코딩하고 주말에 허락된 2시간여동안 타이핑을 쳐서 실행시켜보는게 인생의 낙이었다죠. (덕분에 뇌의 일부분이 Java 인터프리터가 되어버렸었다는... 당시엔 Java공부중이었거든요 ㅋ)
벼랑끝 전술... 회사에서 저한테 쓰면 어떻게 하지 하는 걱정에 한줄 넣어두었습니다.
ReplyDelete가끔 현장에서 core dump가 나며 프로그램이 죽게 되면 저희 윗분께선 이런 말을 하십니다. "따라 죽어라." 물론 진담은 아닙니다만... 가시가 있죠.
전 중/고딩때는 집에서 컴퓨터를 안사주셔서... 잡지책만 보면서 서러움을 달랬었죠. 대학교 들어가고 나서 집에 온 컴퓨터는 고3 올라가는 사촌이 압수당한 놈이었다죠. ;-)
그러고보니 까막님도 자습시간에 공부는 잘 안되었겠네요. :-D
잡지책만 보면서 서러움을 달래다.. 동감 100%!
ReplyDelete잘안되지만, 노트에 코딩하는 것도 한계가 있어서... 할게 없어 공부를 했다는 우울한.. 이야기가 전해져 오지요. 물론, 할게 없다는건 만화책과 무협지를 모두 보고 나서라는 전제조건이 붙지만요. :)
중학교 시절에 은하영웅전설 sp3의 크랙파일을 디스어셈블해서 공부하던 생각이 문득.. ( '')