https://www.acmicpc.net/problem/10826

 

10826번: 피보나치 수 4

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n>=2)가 된다. n=17일때 까지 피보나치 수를 써보면 다음과 같다. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597 n이 주어졌을 때, n번째 피보나치 수를 구하는

www.acmicpc.net

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n>=2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 10,000보다 작거나 같은 자연수 또는 0이다.

출력

첫째 줄에 n번째 피보나치 수를 출력한다.

해결 방안 - 1

1. 재귀 함수를 이용한다. f(n+2) = f(n+1) + f(n)

2-1. 함수 f(n)는 n이 0일때 0, 1일때 1을 리턴한다.

2-2. n이 2이상의 경우에 f(n-2) + f(n-1)을 리턴한다.

소스코드 - 1

n = int(input())

def fibonacci(x):
    if x == 0:    return 0
    if x == 1:    return 1
    return fibonacci(x-1) + fibonacci(x-2)
    
print("%d" % fibonacci(n))

*재귀 함수를 사용하는 경우에 x가 커질수록 메모리 사용량과 연산 시간이 증가하여 시간 초과로 실패한다.

해결 방안 - 2

1. Dynamic Programming 알고리즘으로 n-1, n-2번째의 수만 메모리에 갱신하여 연산해 나간다.

2. 파이썬의 특징을 활용하여 x, y = y, x+y 연산으로 x에는 n-1번째 값을, y에는 n-1번째와 n-2번째의 합을 취한다.

소스코드 - 2

n = int(input())

def fibonacci(k):
    x, y = 0, 1
    for i in range(k):
        x, y = y, x+y
    return x 

print("%d" % fibonacci(n))

 

[Time Complexity] Python - Find Value in List vs Set vs Dict

[시간 복잡도] 파이썬 - List vs Set vs Dict 에서 Value 찾기

code n = 100000 n = 1000000 n = 1000000 Time Complexity
x in list 0.000494 0.019270
0.235368
O(n)
list.index(x) 0.000537
0.020288
0.246275
O(n)
for a in list:  if(a==x) 0.010289
0.107806
1.036934
O(n)
x in set 0.000002
0.000002
0.000006
O(1)
list to set 0.115826
0.066516
0.716471
 
x in dict 0.000005
0.000005
0.000004 O(1)
list to dict 0.147385
0.223651
2.232983  

결론

1. Set, Dict 에서 value를 찾을 경우에 시간 복잡도 O(1)로 가장 빠름

2. 다만 List to Set/Dict conversation이 필요한 경우에 일정 값 이하의 n에서는 List를 사용

[Time Complexity] Python - Deque vs List performance comparison (append, appendleft, pop, popleft)

[시간 복잡도] 파이썬 - Deque vs List 퍼포먼스 비교 (append, appendleft, pop, popleft)

code n = 10000 n = 100000 n = 1000000 Time Complexity
list.append() 0.0010249615 0.0093748569 0.0974259377 O(1)
deque.append() 0.0012080669 0.0113868713 0.1131999493 O(1)
list.insert(0,0) 0.0436980724 4.2723989487 430.9322969913 O(n)
deque.appendleft() 0.0010690689 0.0137970448 0.1067051888 O(1)
list.pop() 0.0013749599 0.0134758949 0.1310129166 O(1)
deque.pop() 0.0009977818 0.0100331306 0.1004290581 O(1)
list.pop(0) 0.0262870789 3.5589528084 372.6231980324 O(n)
deque.popleft() 0.0009810925 0.0101020336 0.0985748768 O(1)

결론

1. append와 pop의 경우에는 List와 Deque 둘 다 Time Complexity가 O(n)으로 별차이가 없음

2. appendleftpopleft의 경우에 Deque가 훨씬 빠름

[Time Complexity] Python - Numpy vs List of zeros declaration

[시간 복잡도] 파이썬 - Numpy vs List의 제로 배열 선언 비교

code n = 10000000 n = 100000000 n = 1000000000 Time Complexity
[0] * n 0.0831630230  0.8130910397 8.0924339294 O(n)
[0 for i in xrange(n)] 0.3735442162  3.7914631367  37.1647899151  O(n)
x = [] 
for i in xrange(n):
    x.append(0)
0.9481530190  9.4668169022  94.6755440235  O(n)
numpy.zeros((n,)) 0.0000300407 0.0000290871  0.0000340939  O(1)
numpy.full((n,),0) 0.0420970917 0.4114339352 4.0288629532 O(n)
numpy to list 0.5932991505 5.9227490425 59.9193470478 O(n)

결론

1. 제로 리스트 선언은 numpy.zeros가 가장 빠름

2. 다만 numpy to list 시간 복잡도가 O(n)이므로 리스트로 변환이 필요시에 [0] * n 가 가장 빠름

정규식 패턴 표현

패턴설명예제
^이 패턴으로 시작해야 함^abc : abc로 시작해야 함 (abcd, abc12 등)
$이 패턴으로 종료되어야 함xyz$ : xyz로 종료되어야 함 (123xyz, strxyz 등)
[문자들]문자들 중에 하나이어야 함. 가능한 문자들의 집합을 정의함.[Pp]ython : "Python" 혹은 "python"
[^문자들][문자들]의 반대로 피해야할 문자들의 집합을 정의함.[^aeiou] : 소문자 모음이 아닌 문자들
|두 패턴 중 하나이어야 함 (OR 기능)a | b : a 또는 b 이어야 함
?앞 패턴이 없거나 하나이어야 함 (Optional 패턴을 정의할 때 사용)\d? : 숫자가 하나 있거나 없어야 함
+앞 패턴이 하나 이상이어야 함\d+ : 숫자가 하나 이상이어야 함
*앞 패턴이 0개 이상이어야 함\d* : 숫자가 없거나 하나 이상이어야 함
패턴{n}앞 패턴이 n번 반복해서 나타나는 경우\d{3} : 숫자가 3개 있어야 함
패턴{n, m}앞 패턴이 최소 n번, 최대 m 번 반복해서 나타나는 경우 (n 또는 m 은 생략 가능)\d{3,5} : 숫자가 3개, 4개 혹은 5개 있어야 함
\d숫자 0 ~ 9\d\d\d : 0 ~ 9 범위의 숫자가 3개를 의미 (123, 000 등)
\w문자를 의미\w\w\w : 문자가 3개를 의미 (xyz, ABC 등)
\s화이트 스페이스를 의미하는데, [\t\n\r\f] 와 동일\s\s : 화이트 스페이스 문자 2개 의미 (\r\n, \t\t 등)
.뉴라인(\n) 을 제외한 모든 문자를 의미.{3} : 문자 3개 (F15, 0x0 등)


출처 : http://pythonstudy.xyz/python/article/401-%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D-Regex

참조 : http://www.nextree.co.kr/p4327/

1. Django 프로젝트 urls 설정

vi mysite/urls.py

from django.conf.urls import url, include

from django.contrib import admin


urlpatterns = [

  url(r'^admin/', admin.site.urls),

  url(r'', include('demo.urls')),

]

cd demo

vi urls.py

from django.conf.urls import url

from . import views


urlpatterns = [

  url(r'^demo/$',views.demo_base.as_view(), name='demo_base'),

]


2. Django 프로젝트 views 설정

vi views.py

# -*- coding: utf-8 -*-

from __future__ import unicode_literals


from django.shortcuts import render

from django.views import View


# Create your views here.

class demo_base(View):

  def get(self, request, *args, **kwargs):

    return render(request, 'demo/demo_base.html', context={})


3. Django 프로젝트 html 생성

mkdir -p templates/demo

vi templates/demo/demo_base.html

<!doctype html>

<html lang="ko">

<html>

  <head>

    <meta charset="utf-8">

    <title>Django Demo</title>

  </head>


  <body>

    <a href="http://poorman.tistory.com">

      <img src="https://t1.daumcdn.net/cfile/tistory/2368C93A587F63331A"> &nbsp

      Poorman Tistory

    </a>

  </body>


</html>


- 결과

http://~:8080/demo


0. Django 장고 프로젝트 경로 설정

project_path = './demo'

app_name = 'demo'


1. Django 장고 프로젝트 생성

django-admin startproject mysite $project_path


2. Django 장고 프로젝트 APP 생성

cd $project_path

python manage.py migrate

python manage.py startapp $app_name


vi mysite/settings.py

ALLOWED_HOSTS = [

'192.168.0.1',

]


INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'demo',

]


TIME_ZONE = 'Asia/Seoul'

python manage.py makemigrations $app_name

python manage.py migrate $app_name


3. Django 장고 프로젝트 슈퍼 유저 생성

python manage.py createsuperuser


4. Django 장고 프로젝트 실행

python manage.py runserver 0:8000


- 결과

http://~:8080/


How to use argparse  FLAGS




[에러 메세지]

SyntaxError: Non-ASCII character '\xeb' in file mapper.py on line 28, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details


[에러 원인]

코드 내에 파이썬이 한글을 제대로 읽지 못해서 발생하는 에러


[해결 방안]

코드 상단에 아래의 주석 추가

#-*- coding:utf-8 -*-



[참고]

http://codaa.tistory.com/371




사용자 입력

- 문자열 입력 데이터

string = input() 


- 정수형 입력 데이터

num = raw_input() 


옵션 입력


#!/usr/bin/python 

# 여기서부터 프로그램 시작

import sys if len(sys.argv) == 1: # 옵션 없으면 도움말 출력하고 종료

  print "숫자로 된 옵션을 입력해 주세요"

  exit(1) 

elif not isNumber(sys.argv[1]): # 옵션이 숫자인지 검사

  print "에러! 10진수 숫자(실수/정수)를 입력해 주세요"

  exit(2)


print float(sys.argv[1]) + 1 # 옵션에 1을 더한 후, 출력


- Reference

http://mwultong.blogspot.com/2007/01/python-input-number-argv-argument.html

+ Recent posts