분류 전체보기
[Codility] TapeEquilibrium
2017.11.060. 문제 비어있지 않은 리스트 A에 N개의 숫자가 있다.(N은 2와 100,000 사이의 숫자) 그리고 0 < P < N 의 조건을 가지는 자연수 P가 있다. 자연수 P에 의해 리스트 A는 이렇게 둘로 나눠지게 된다. A[0], A[1], ..., A[P − 1] A[P], A[P + 1], ..., A[N − 1] 이때 |(A[0] + A[1] + ... + A[P − 1]) − (A[P] + A[P + 1] + ... + A[N − 1])| 의 가장 작은 값을 구하라. 1. 답변 처음에 답변은 다 맞췄으나 TimeoutError가 났다. for p in range(1, len(A)): diff = abs(sum(A[:p]) - sum(A[p:])) 위와 같이 간지나게 풀었는데... 루프를 돌 때마다..
[Codility] PermMissingElem
2017.11.050. 문제 주어진 리스트 A는 N개의 서로 다른 숫자로 이루어져 있다. 그리고 이 리스트에는 [1..(N + 1)] 이렇게 1부터 N+1까지의 숫자가 무작위로 섞여있는데 항상 하나의 숫자가 빠져있다. 이 빠진 숫자를 구하시오. 1. 답변 주의할 점은... - 리스트 아이템이 하나일 경우 - 첫 번째(1) 혹은 마지막(N+1)이 빠졌을 경우 이걸 감을 못잡아서 계속 고쳤다... def solution(A): if A: sorted_A = sorted(A) for idx, n in enumerate(sorted_A, 1): if idx != n: return idx return sorted_A[-1]+1 else: return 1 enumerate() 는 내장함수인데 실제 업무에서도 굉장히 유용하게 쓰고 있다.
[Codility] CyclicRotation
2017.11.040. 질문 인자 값으로 리스트 A와 상수 K를 받는다. 리스트 A의 값들은 K만큼 오른쪽으로 이동하며 리턴값은 전부 이동하고 난 뒤의 A이다. 1. 답변 def solution(A, K): if A: if len(A)
[Codility] OddOccurrencesInArray
2017.11.020. 문제 1개 이상의 숫자가 들어있는 리스트 A가 주어진다. 여기 리스트 A에서는 모든 아이템들이 2개, 혹은 4개, 6개 이렇게 짝수 개의 짝을 이루고 있다. 딱 하나만 빼고. 예를 들자면 이렇다.A = [1, 9, 6, 3, 3, 1, 7, 6, 9]여기서 짝이 없는 하나의 숫자를 찾아 리턴해야 한다. 1. 답변 꽤 빠르게 짰는데, 처음엔 리스트 A를 set으로 중복 제거하고, 이 set을 for loop로 돌려 A.count(num) 이런 식으로 리스트 A 내의 숫자를 카운트하게 했는데... 너무 느려서 performance에서 점수 깎임. 검색해보니 sorted(리스트) 이 함수가 정말 빠르다고 해서 사용했다. 아이템이 짝수이거나 리스트의 길이가 1인 경우 등의 예외사항을 모두 try/excep..
[Codility] BinaryGap
2017.11.010. 코딩 소모임에서 코딜리티codility, 해커랭크hackerrank 를 알게되었다. 코딜리티는 여기저기서 들어보긴 했는데 가입해서 문제를 풀어보는 건 처음이었다. 자동 채점 방식을 그닥 좋아하지 않아서 프로젝트 오일러를 좋아했었는데, 이것도 익숙해지면 괜찮을 듯. 1. 문제 binary gap은 1000010001과 같은 2진법 수에서 1과 1사이에 있는 0의 개수이다. 리스트 N이 주어지면 여기에서 가장 긴 binary gap을 찾아야 한다. - 마지막이 1이 아닌 0으로 끝날 경우를 체크해주어야 한다. 이걸 체크 안해서 틀림 2. 답변 def solution(N): bin_str = bin(N).replace('0b', '') bin_gap_list = list(filter(None, bin_s..
api 문서화, 좋은 예시
2017.10.310. api 자급자족할 때는 딱히 신경쓰지 않았는데, 간만에 다른 사람이 쓸지도 모르는 상황이 돼서, api 문서화를 찾아봤다. 1. swaggerhttps://swagger.io/ 이전 회사에서 쓰던 api 문서화 프레임워크. 베트남에 안드로이드/아이폰 어플 만드는 외주를 맡겼었는데 이 swagger가 정말 유용했다. 우리쪽에서 api를 만든 뒤, swagger를 업데이트해서 주면 따로 말로 설명할 필요가 없었다. 다만, 처음 사용이 좀 복잡하고...경우에 따라 작성/수정에 좀 오래 걸릴 수도 있다. django에 swagger 관련 모듈이 있다! 근데 사용법을 잘 몰라서 몇 번 끼적여보다가 포기. 간지나던데...다음에 다시 도전! 2. Asciidoctorhttp://asciidoctor.org/As..
[python] is 와 == 의 차이점
2017.10.27나는 비교 대상이 None이 아닌 이상 대체로 ==를 사용하기 때문에 이 둘의 차이점을 깊게 생각해본 적이 없다. 근데 오늘 스택오버플로우를 서핑하다가 이와 관련된 글이 눈에 띄어서 읽어봤는데 재밌었다. is는 reference equality. 메모리 상의 두 object를 비교한다. 두 reference가 같은 object를 가리키는지 확인할 수 있다. ==는 value equality. 값을 비교한다. 두 object가 같은 값을 가지는지 알 수 있다. 예시를 보자. >>> foo = 10 >>> dir(foo) == dir(10) True >>> dir(foo) is dir(10) False 동일한 변수의 dir()을 가져왔음에도 이들은 같은 값을 가질 뿐, 같은 object는 아니기 때문에 is..
[python] print와 return의 차이점
2017.10.27print와 return은 모두 function이 아닌 statement다. 뭐 이건 제쳐두고, print와 return의 가장 큰 차이점은 함수 및 프로그램에 영향을 주느냐 마느냐이다. print는, 그저 값을 출력할 뿐, 컴퓨터가 이 값을 가지고 무얼 하진 못한다. 변수가 어떤 값을 가지는지 사용자 측에서 편하게 보기 위함이지 함수에는 전혀 영향을 끼치지 않는다. return은, 함수가 값을 반환하는 가장 주된 방법이다. 모든 함수는 어떠한 값을 return하며, 이 return(혹은 yield)이 명시되어 있지 않은 경우에는 None을 return한다. 이 반환된 값은 다른 함수에서 사용될 수 있으며 변수에 저장될 수도 있다. def function_that_prints(): print("I pri..
[GitHub] Star와 Fork(Fork와 Clone)
2017.09.280. 최근 오픈소스에 관심이 생겨 이것저것 찾아보다가 GitHub가 오픈소스 프로젝트에 얼마나 많이 기여하는지 알게 되었다. 언젠가 친구가 나에게 'GitHub가 뭐냐'라고 물었을 때 '코드 공유 사이트다'라고 답한 적이 있는데, 뭔가 시원찮았다.아주 틀린 말은 아니지만 이것만으로는 Github의 역할을 전부 설명할 수 없다. 어쨌든 여차저차한 이유로 GitHub의 기능들을 차근차근 살펴보고 있다. 1. 본론에 앞서 Git과 GitHub의 차이점을 짚고 넘어간다. Git은 분산 버전 관리 시스템(DVCS; Distributed Version Control System)이며, GitHub는 Git을 사용하는 프로젝트를 지원하는 웹 호스팅 서비스이다. Git을 호스팅할 수 있는 사이트는 GitHub 말고도 ..
프로그램 성능 개선: 코드 미세조정
2017.09.25- 공통된 부분 표현식을 하나로 모으라 - 비싼 연산을 싼 연산으로 대체해라: 연산강도의 감축(reduction in strength) ex. 나눗셈과 나머지 연산은 곱셈보다 훨씬 느리다. 따라서 나눗셈을 곱셈의 역연산으로 대체한다든가, 나누는 수가 2의 승수일 때 마스킹 연산(AND 연산)으로 나머지 연산을 대체하면 성능을 개선할 수 있을 것이다. - 루프를 펼치거나 제거하라 루프를 준비하고 실행하는 데에는 시간과 메모리가 든다. 만약 루프가 너무 길지 않다면, 반복주기 내용을 쭉 장성하는 게 더 효율적일 수 있다. for i in range(3): a[i] = b[i] + c[i] 대신 a[0] = b[0] + c[0] a[1] = b[1] + c[1] a[2] = b[2] + c[2] 을 사용하면 ..
프로세스(Process)
2017.09.200. 서버 개발을 하면 언젠가 반드시 마주치는 주제. 컴퓨터 공학을 전공했다면 학부생 때 배웠겠지만 비전공자 프로그래머는 스스로 공부하지 않으면 잘 모른다. 1. 프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 프로그램과 프로세스는 약간 다른 개념인데, 프로그램은 일반적으로 하드디스크에 저장돼 있는 실행코드를 뜻하고, 프로세스는 프로그램이 메모리 상에서 실행될 때의 작업 단위이다. 예를 들어, 하나의 프로그램을 여러 번 구동하면 여러 개의 프로세스가 메모리 상에서 실행된다. 이해가 잘 가지 않는다면 ctrl + alt + Del 을 눌러 작업 관리자에 들어가보자. 프로세스 탭을 보면 내가 사용하고 있는 프로그램들이(보이지 않는 것들까지) 죽 나열돼있다. 각각의 프로그램들의 CPU..
[python] Python을 web에서 컴파일하는 여러 가지 방법
2017.09.130. pypy.jshttps://github.com/pypyjs/pypyjs (1,135 stars) input()을 하면 EOFError를 일으킨다! 1. brythonhttp://brython.info/index.html (공식 사이트가 느리고 허접하다. 그래도 에디터나 콘솔을 테스트해볼 수 있음) https://github.com/brython-dev/brython (1,308 stars)만약 웹에서 파이썬 에디터나 콘솔을 만들고 싶다면 pypy.js보다는 이걸 더 추천한다. 사용한 지 좀 돼서 가물가물하긴 하지만, pypy.js보다 사용 방법이 더 간단하고 input()처리가 가능하다. 다만 input()을 웹 alert 창으로 받아서...좀 읭스럽긴 하다. html에 이렇게 brython.js를..