본문 바로가기

Programming

[Python3] 제곱해서 같은 수 - 1 10,000 미만 자연수 중에 제곱해서 끝자리가 제곱한 자연수인 수를 찾아라예를들어 15를 제곱하면 225이고, 25는 15와 같지 않으니 이 조건에 만족하지 않는다. 재밌는 문제라고 생각한다. 이 문제를 다음과 같은 방법으로 접근할 수 있을거라 생각한다. n의 제곱 빼기 n을 이용한다. 이게 무슨말이냐, 이 조건에 만족하는 수 하나인 5를 생각해보자, 5의 제곱은 25이고 25에서 5를 빼면 20이다. 이것은 10의 배수이다. 만약 69랑 숫자의 제곱이 3,269 라면 3,200만 남아서 100의 배수라는 의미의다. 따라서 다음과 같이 생각할 수 있다. 위 조건을 만족하는 n이 k자리 자연수라면, n^2 - n이 10^(k+1)의 배수이다. 프로그램은 다음과 같다.for i in range(1,9999.. 더보기
[Python3] 피보나치 수 피보나치 수는 0과 1로 시작해서 그 다음 숫자가 마지막 두개의 숫자의 합인 수열이다. 점화식으론 다음과같다.[사진 출처-위키백과] 점화식만 놓고 보자면 실제 구동하는 코드와 유사해서 다음과 같이 금방 짤 수 있을 것이다.def fibo(n): if(n == 0): return 0 if(n == 1): return 1 return fibo(n-1) + fibo(n-2) 하지만, 조금만 생각해보면 이 코드는 사람이 이해하고 읽기는 쉽지만 컴퓨터에겐 매우 복잡한 식이란걸 알 수 있다. fibo(5)를 호출하면 다음과 같은 일이 발생한다. 엄청나게 복잡해지는 연산을 컴퓨터가 해야한다. 물론 컴퓨터라 이정도는 빠를지 몰라도, 숫자가 무지막지하게 커지면 컴퓨터의 연산 실행 시간은 상상을 초월한다. 헌데, 저 순서.. 더보기
프로세스 - 2 운영체제의 여러가지 일을 도와주는 커널의 역할중 하나는 상태를 관리해주는 것이다.프로세스의 상태전이(프로세스의 실행흐름)는 다음과 같다. (파워포인트로 부족하게나마 그려봤다, 프로세스를 작업이라고 표기했다) 실행이라 써진 화살표가 커널이다. CPU는 여러개의 작업을 준비 리스트라는 곳에 쌓아두고 순서대로 처리한다. 우선, 준비리스트의 맨 앞에 있는 작업이 CPU를 점유해서 준비 상태에서 실행상태로 바뀐다. 이것을 디스패치라고 한다. 이때, 실행된 작업은 일이 너무 많아서 혼자만 CPU를 독점하면 안되니 시간제한을 둔다. 시간제한이 끝나면 CPU를 반납하고 준비 상태로 바뀐다. 헌데, 시간을 다 쓰기 전에 입/출력 동작이 있으면 CPU를 반납하고 보류상태(블록,block, 이라고도 한다)가 된다. 그후, .. 더보기
프로세스 - 1 프로세스는 컴퓨터에서 실행되고 있는 프로그램들을 가르킨다. 다시 말해서 프로그램은 컴퓨터 저장장치에 저장되어 있는 파일들이고, 프로세스는 그것들을 실행시켰을 때 실행되고 있는 작업의 단위인것이다.태스크(Task)도 같은 의미라고 보면 된다. 따라서, 위 사진처럼 작업관리자를 영어로 'Task Manager'라고 한다. 프로세스는 작업의 단위이기에 컴퓨터는 이것을 프로세스 제어 블록(Process Control Block)이라는 자료구조에 저장해 관리한다. 이 자료구조에는 다음과 같은 정보가 저장되어 있다.● PID 프로세스 식별자(Process IDentification): 프로세스들끼리 구분하기위해 컴퓨터가 부여한 식별번호다.● 프로세스 상태(Process State): 생성, 준비, 실행, 대기, 완.. 더보기
클립보드 안드로이드에서 캡쳐를 해봤다면 이런 화면을 본적이 있을 것이다. 이는 캡쳐된 사진을 클립보드에 복사했다가 언제든 다시 사용하게 하겠다는 의미이다. 이처럼, 클립보드의 역할은 데이터를 잠깐 저장해 놓았다가, 필요할 때 언제든 사용하는 프로그램이다. 주로, 텍스트 복사를 하게 되면 클립보드에 데이터를 저장하게 되고 붙여넣기를 할때 맨 마지막으로 클립보드에 들어간 데이터가 불러와지는 방식이다. 초기에 클립보드는 오직 텍스트만 복사가 되었는데, 이후 데이터 용량이 늘어나면서 텍스트를 글꼴, 색과 함께 저장하거나, 사진도 클립보드에 넣을 수 있게되었다. 또, 한번에 하나만 클립보드에 넣을 수 있었던 예전과 달리, 안드로이드에서 입력창을 길게 터치하여 클립보드를 선택하면, 여러개가 들어가있는것을 확인할 수 있다. .. 더보기
복사 붙여넣기 1970년대 초, 인류에 새로운 혁명을 일으키는 기능이 텍스트 편집기에 추가가 되었는데, 그 기능은 바로 복사 붙여넣기 기능이다. 물론 복사 기능은 천공카드가 있었을 무렵에도 있었다. 하지만 대중들이 사용하기엔 아직 무리가 있는 기능이었다.이 기능은 1973년부터 Larry Tesler와 Tim Mott등에 의해서 대중이 쉽게 사용하도록 개발되었고, 본격적으로 대중에게 전파된건 1983년 리사 컴퓨터를 통해서인걸로 알려져있다.복사 붙여넣기 기능을 만들 뿐 아니라 실행취소와 잘라내기 기능도 함께 만들었다.또, Copy(복사), Paste(붙여넣기), Undo(실행취소), Cut(잘라내기) 를 단축키로 만들어 빠른 수정에 용이하게 만들었다.단축키는 윈도우 기준으로 각각 Ctrl+C, Ctrl+v, Ctrl+.. 더보기
갈색눈과 빨간눈 이 문제는 실제 면접장에서 물어봤던 문제와 유사한 문제이다.'누워서 읽는 알고리즘'에 있던 문제이며, 꽤나 재미있는 문제여서 올려본다.어느 섬에 사람들의 눈 색은 빨간눈이거나 갈색눈이다.섬에 거울같은 자신을 볼 수 있는 물체가 하나도 없어서 사람들은 자신의 눈 색깔을 스스로 알아 낼 수 없었다.또, 사람들은 마법에 걸려서 자신이 빨간눈이라는 사실을 깨달으면 그날 밤 섬을 떠나야 한다. (마법인지라, 자신의 눈이 빨갛다는 것을 깨달으면 무조건 섬을 떠나야한다)따라서 사람들은 서로의 눈색깔을 말하지 않는 규칙을 정하고 잘 살고 있었다. 어느날 이 규칙을 모르는 관광객이 한명 찾아오고 다음과 같이 말하고 다른 섬으로 갔다.당신들 중 적어도 한명은 빨간눈이군요이때, 이 말을 받아들인 섬의 사람들은 어떻게 될까?.. 더보기
확장자 확장자는 .txt나 .exe처럼 파일의 종류와 그 파일이 무슨 역할을 하는지 표기하는 부분이다. MS-DOS 시절에도 존재하였을 정도이다.보통 3글자인 경우가 많은데, 그 이유가 예전에 FAT파일 시스템(현재는 FAT32나 exFAT정도가 쓰인다)에서 파일명은 8바이트 파일확장자는 3바이트까지 사용한다는 법칙이 전해져 내려온 것이다.이후, VFAT라는 새로운 파일 시스템이 개발되어 확장자 3바이트 제한이 완화되어 255바이트 까지 쓸 수 있다.확장자를 잘못 표기한 경우에도 파일 헤더에 자신이 무슨 파일 확장자를 가지는지 명시하는 파일들이 몇가지 있기에 분석이 가능하다.윈도우에서 기본설정이 파일확장자를 표시 안하는 것인데, 이를 이용해 바이러스가 .exe를 숨기고 사용자로 하여금 안심하고 누르게 한다. 그.. 더보기
[Python3] 소수리스트2 1을 제외한 자연수 중 약수가 1과 자기자신 밖에 없는 수를 소수라 한다. 1보다 큰 자연수가 주어질 때 그 수 까지의 소수리스트를 구하여라 이 방법은'에라토스테네스의 체' 라고 불리는데, 소수 구하는 알고리즘 중 최적의 알고리즘이라고 알려져 있다. 방법은 다음과 같다.2부터 구하고자 하는 구간의 모든 수를 나열한다.2를 소수리스트에 적고 2의 배수를 모두 지운다.그 다음 숫자인 3을 소수리스트에 적고 3의 배수를 모두 지운다.차례로 지워지지 않은 숫자에 대해 이 작업을 반복하면 소수를 구할 수 있다. 코드는 다음과 같다.n = int(input()) num = [] for i in range(1, n + 1): num.append(i) prime = [] for j in range(1, n + 1): .. 더보기
[Python3] 소수리스트 1을 제외한 자연수 중 약수가 1과 자기자신 밖에 없는 수를 소수라 한다. 1보다 큰 자연수가 주어질 때 그 수 까지의 소수리스트를 구하여라 소수에 관심이 많아서 평소에 생각하고 있던 문제이다. 아직 소수사이에 무슨 규칙이 있는지 수학적으로 밝혀지지 않았지만, 무식하게 소수를 구하는 방법은 많다. 내가 고안한 방법은 소수가 아닌 수들은 소수로 이루어져있다는 생각에서 온것이다. 예를 들어 소수가 아닌 18은 2*3*3으로 나타낼 수 있다. 반면 17은 1*17 이다. 따라서, k가 소수인지 알려면 k-1까지의 소수들로 나눠떨어지지 않는지 확인하면 된다. 코드는 다음과 같다. prime_list = [2] n = int(input("prime!: ")) for i in range(3, int((n)) + 1.. 더보기