TigerCow.Door


안녕하세요. 문범우입니다.

최근 동아리 친구들과 장고 스터디를 하며 프로젝트를 진행하게 되었습니다.

공부하는 겸, 나중에 다시 참고할 수 있도록 정리해서 포스팅해보도록 하겠습니다.

앞으로 진행되는 django 프로젝트는 17년말에 새롭게 릴리즈된 django 2.0 버전을 바탕으로 진행됩니다.


먼저 이번 포스팅 장고 설치하는 방법과 기본 프로젝트 시작방법에 대해서 알아보도록 하겠습니다.


1. Django 설치하기


django 설치 방법은 매우 간단합니다.

구글링을 해보니 어떤 분들은 가상환경을 구성해서 설치하기도 하지만, 가상환경 구성에 있어서 까다로워 하시는 분들도 있고 아직 그럴만한 필요성을 크게 느끼지 못해서(제가 부족한 탓일겁니다..) 단순하게 로컬에 설치해보도록 하겠습니다.


아래 주소의 django 공식 홈페이지에도 설치 방법이 나와있으나 간단하기 때문에 굳이 참고하지 않으셔도 될 듯 합니다.


https://docs.djangoproject.com/en/2.0/intro/install/


우선 준비되어야 하는 점은,

python이 3.x 버전 이상이어야 하는 점 입니다.

저는 현재 OS X 환경에서 진행하고 있지만, 설치방법은 윈도우도 동일합니다.


먼저 터미널(윈도우의 경우 cmd)을 실행시켜서 아래와 같이 명령어를 입력합니다.


python --version


만약 해당 명령어에 대한 결과로, python 2버전이 나오시는 분들은,


python3 --version


을 입력해보시길 바랍니다.


대표적으로 맥에서는 python 2버전이 기본적으로 설치되어있어서 python 3버전을 설치시 따로 python3라고 명시하여 명령어를 내려줘야 합니다.


장고 프로젝트는 파이썬 3버전 이상을 바탕으로 진행할 예정이기 때문에, python 3버전이 아니신 분들은 python 공식 홈페이지를 통해서 3버전을 다운받으시길 바랍니다.


파이썬 3버전이 준비되었다면 다음과 같은 명령어로 장고를 설치합니다.


pip install django


만약, python3 --version 을 통해 파이썬 3버전을 확인하신 분들은


pip3 install django


로 입력해주셔야 합니다.


약간 기다리면 장고 설치가 완료됩니다.



2. 장고 프로젝트 시작하기


장고 설치가 완료되었으면 다음과 같은 명령어로 장고 프로젝트를 시작합니다.


django-admin startproject start_django


위의 명령어에서 start_django 는 단순히 프로젝트 이름이기 때문에 변경해주셔도 무관합니다.



위와 같이 django-admin startproject start_django 를 입력해도 아무런 결과가 뜨지 않지만, 실제로 ls 명령어(윈도우의 경우 dir)로 확인을 해보면 start_django라는 폴더가 생긴것을 확인할 수 있습니다.

( mysite 는 이전에 제가 혼자 공부하느라 만들었던 프로젝트이니 신경안쓰셔도 됩니다. )



이제 방금 생긴 start_django 폴더로 들어가서 다시 ls 명령어를 통해 확인해보면 

manage.py 파일과 start_django 폴더가 생긴것을 확인할 수 있습니다.


먼저 추가적으로 해당 프로젝트에 대해서 다뤄보기전에 서버를 돌려 정상적으로 프로젝트가 실행되는지 확인해보도록 하겠습니다.


해당 위치에서 아래와 같은 명령어를 입력합니다.


python manage.py runserver



정상적으로 명령어를 입력하시면 위와 같이 결과가 나오게 되고 더 이상 명령어를 입력할 수 없게 됩니다.

해당 결과는 현재 127.0.0.1:8000 에서 서버가 돌아가고 있다는 것을 의미하며, 의미상으론 localhost:8000 과 동일합니다.

따라서 웹 브라우저의 주소창에 


127.0.0.1:8000 또는 localhost:8000 


을 입력합니다.


해당 주소를 입력하여,



위와 같은 화면이 떴다면 정상적으로 프로젝트를 만든 것 입니다.


이제 다음 포스팅부터 제대로 장고 프로젝트를 수정해가며 꾸며보도록 하겠습니다.


블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc

안녕하세요. 문범우입니다.

오랜만에 파이썬으로 풀이한 재밌는 알고리즘 문제를 가져왔습니다.

알고리즘 문제는 프로그래머스의 알고리즘 연습에 나온 야근 지수 문제이며 해당 문제는 아래 주소에서 풀어볼 수 있습니다.

문제에 대한 설명도 해당 주소에 나와있기에 문제에 대한 설명은 생략하겠습니다.

https://programmers.co.kr/learn/courses/30/lessons/12927


사실 예전에 매우 간단히 풀이한 문제인데

다시 확인해보니 문제 개편이 되면서..

테스트 케이스가 매우 까다롭게 변했더라구요.

그래도 정확도 통과는 비교적 무난했지만, 효율성 테스트에서 계속 막혀 씨름을 하다가 마침내 풀게되었습니다.

코드와 함께 간단한 해설을 첨부합니다.

추가적으로 궁금하신점이 있으신분들은 이메일이나 카카오톡으로 언제든지 문의해주세요 :)


1. 정확도 통과, 효율성 실패


먼저 정확도는 통과했지만 효율성에서 실패한 처음 코드입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def solution(n, works):
    result = 0 # 결과를 담을 변수
    sumOfWorks = 0 # 모든 일의 합을 담을 변수
    for i in works: # 모든 일의 합을 구한다.
        sumOfWorks+=
    # 남은 일보다 n이 클때는 0을 반환
    if(n >= sumOfWorks): return 0
 
    # n이 0이될때 까지 반복
    while(n!=0):
        works[works.index(max(works))]-=1 # works에서 가장큰 값을 하나 줄이면서
        n-=1 # n의 값을 하나 줄인다.
        if(min(works) == max(works)): break
        # 만약 works에서 가장큰 값과 가장 작은 값이 같아지면 반복문을 나간다.
 
    # n이 0까지 줄어들어든 것이 아니라면
    if not n==0:
        # 이때는, works에서 가장큰값과 가장 작은 값이 같은 상황
        # 즉, works의 모든 값이 동일한 상황이다.
        # 따라서, n의 크기만큼의 요소를 -1씩해서 각각을 제곱하여 결과에 더하고
        # 나머지는 -1을 하지 않고 제곱해서 결과에 더한다.
        return n*((min(works)-1)**2+ (len(works)-n)*((min(works))**2)
    # n이 0까지 줄어든 것이라면 남은 works의 모든 값을 제곱해서 더한다.
    else:
        for i in works:
            result += i**2
 
    # 야근 지수를 최소화 하였을 때의 야근 지수는 몇일까요?
    return result
cs


코드에 대한 상세한 내용은 주석으로 설명하였습니다.

전체적인 알고리즘을 말씀드리면,

단순히 works 리스트에서 가장 큰 값을 찾아 이를 하나씩 줄이는 방법입니다.

추가로, 처음에 모든 남은 일의 합이 n 보다 작으면 0을 반환하게 하는 특수조건이 있습니다.

또한, works 리스트에서 값을 하나씩 줄이다가 최소값과 최대값이 동일한 시점, 즉 works 리스트의 모든 요소가 같아지는 시점도 따로 빼내어서 바로 계산하게끔 처리하였습니다.


위와 같은 풀이는 제목과 같이 정확도 테스트 케이스는 모두 통과하였으나 효율성 테스트 케이스에서 통과하지 못했습니다.

이에 따라 조금 다른 방식으로 생각해서 풀어보았습니다.



2. 정확도 통과, 효율성 통과


먼저 두번째로 풀이하여 정확도와 효율성 모두 통과한 코드는 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def solution(n, works):
    result=0 # 결과를 담을 변수
    works.append(0# 최소값을 위해 works에 0추가
    works.sort() # works를 오름차순으로 정렬
    for i in range(1,len(works)): 
        # works에 대해 맨뒤에서 부터 확인할 것임
        # 인덱싱하기 편하게 하도록 i는 1부터 시작
        tmp = works[-i] - works[-(i+1)] # works에서 첫번째로 큰 숫자와 두번째로 큰 숫자의 차이 구함
        if tmp*< n: # 해당 차이 x 몇번째인지가 n보다 작으면
            n -= tmp*# 그만큼 n을 빼주고
            for j in range(1,i+1):
                works[-j] -= tmp # 첫번째로 큰 숫자를 두번째로 큰숫자와 같게 만든다.
        else# 해당 차이 x 몇번째인지가 n보다 작은게 아니라면
            q = n//# n에 대해서 몇번째인지로 나눈다. 이때 몫은 q, 나머지는 n
            n = n%i
            for j in range(1,i+1):
                works[-j] -= q # 제일 뒤의 숫자부터, i번째까지 몫만큼 빼준다.
            for j in range(1,n+1):
                works[-j] -= 1 # 나머지 처리
            break # 끝
    for i in works:
        result += i**2
 
    # 야근 지수를 최소화 하였을 때의 야근 지수는 몇일까요?
    return result
cs


해당 코드또한 주석으로 설명을 달아놓았지만, 적절한 예시가 없으면 바로 이해하기 힘들수 있기에 하나의 예시를 통해 어떤식으로 알고리즘이 result를 찾아내는지 확인해보도록 하겠습니다.


먼저 입력으로 n = 100, works = [10,9000,9997,9998,9999,10000] 이 들어온다고 가정합니다.

works가 위와 같이 정렬된 상태가 아니어도 4번째줄 코드에서 오름차순으로 정렬합니다.

5번째줄의 for문부터 확인해보도록 하겠습니다.

먼저 첫번째 for문은 i가 1부터 (works의 길이)-1 이므로, 해당 예시에서는 1부터 5까지 반복됩니다.

다음 줄을 보시면 아시겠지만 works의 뒤의 요소부터 인덱싱을 할때 -i 라고 명시하기때문에 i값이 1부터 시작되도록 하였습니다.

(works[-1]은 works의 가장 뒤에 있는 요소를 인덱싱합니다.)

따라서 첫번째 반복에서 tmp = 1 이 됩니다.

그리고 9번째줄 if문을 확인하면 tmp = 1 * i = 1 => 1이 되기 때문에 n보다 작아서 10~12번째줄을 수행하게 됩니다.

10번째줄에 의해서 n이 1000에서 999로 줄어들게 되고, works는 다음과 같이 변화합니다.

works = [10,9000,9997,9998,9999,9999]

즉, 뒤에서 첫번째 요소를 두번째 요소와 같게 만듭니다.


그리고 i가 하나 증가하고 첫번째 for문의 두번째 반복이 진행됩니다.

같은 방법에 의해서, n은 999에서 997로 줄어들게 되고, works는 다음과 같이 변화합니다.

works = [10,9000,9997,9998,9998,9998]

첫번째 반복에서는 n이 1만큼 감소했지만 두번째 반복에서는 i가 2이기 때문에 n이 2만큼 감소합니다. 즉, 뒤에서 첫번째, 두번째 요소를 세번째요소와 같게 만드는 것입니다.


세번째 반복에서도 동일하여, n은 994가 되고, works은 다음과 같이 됩니다.

works = [10,9000,9997,9997,9997,9997]


이제 네번째 반복입니다.

이때 tmp = 9997 - 9000 = 997 이 됩니다.

현재 i = 4이기 때문에 9번째 줄의 코드에서, tmp*i = 3988 로써 현재 n = 994 보다 크게 되므로 10~12번째줄을 수행하지 않고 13번째, else문이 실행됩니다.

그리고 14번째 줄에 의해 q = 994//4 = 248이 되고, n = 994%4 = 2 가 됩니다.

그리고 16~17번째 줄에 의해서 현재 9997의 값을 갖고있는 요소들이 q = 248 만큼 감소합니다. 즉, works가 다음과 같이 변화합니다.

works = [10,9000,9749,9749,9749,9749]


총 줄어든 값은 248 * 4 = 992 인데, 위에서 나머지 계산을 통해 n = 2가 되었습니다. 두 값을 더해서 생각해보면 이전의 n 값인 994와 같음을 알 수 있습니다.

그리고 나머지 2를 처리하기 위해 n이 0이 될때까지 works의 가장 뒤의 요소부터 1씩 감소시킵니다.


n은 i로 나눈 나머지이기 때문에 절대로 (해당 예시에서는)9749의 값을 갖는 요소를 벗어날 수 없습니다.

따라서 works는 다음과 같이 변화합니다.

works = [10,9000,9749,9749,9748,9748]


그리고 break문을 만나 반복문을 벗어나 결과를 출력하게 됩니다.



해당 알고리즘을 어떻게 간단하게 설명해야 할지 몰라서 까다로웠던 예시를 하나 들어서 설명드렸습니다.

조금이나마 간단하게 설명해본다면 처음 입력받는 works에 대해 가장 큰 값들부터 고려하여, 그 다음 큰 값과 같게하면서 줄여나가는 방법입니다. 이는 단순히 1씩 감소시키는 것이 아니라, 큰 값들의 차이만큼 감소 시키며 그 전의 큰 값들도 같이 감소시키게 됩니다. 그리고 감소시킬 값과 n을 비교해가면서 감소시킬 값이 n보다 크면 안되므로 이럴때는 n값을 지금까지 줄여나간 요소의 개수 만큼으로 나누어 그 몫을 줄여나간 요소들에 대해 동등하게 감소시키고, 나머지는 그 요소들에 대해 1씩 줄이는 방법입니다.



블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc

안녕하세요. 문범우입니다.

최근 데이터베이스 관련 공부를 시작했는데, 기준으로 잡은 책에서 PostgreSQL을 사용합니다.

이에 따라 공부한 내용들을 정리해가며 PostgreSQL에 대한 내용을 포스팅하려 합니다.

오늘은 그 첫번째로, 맥 또는 윈도우에 PostgreSQL을 설치하고 데이터베이스에 진입하는 방법에 대해서 설명드리도록 하겠습니다.


1. 윈도우 환경에서 설치하기


먼저 아래, PostgreSQL 공식사이트에 들어갑니다.


https://www.postgresql.org/




그럼 위와 같은 사이트에 접속되는데, 상단의 Download를 클릭합니다.



그리고 윈도우 운영체제를 눌러줍니다.



그리고 Download the Installer 를 눌러서 설치파일을 다운 받습니다.


이후 다운받은 exe 파일을 실행시켜 설치를 진행합니다.

경로는 기본으로 놔두고, 중간에 password를 입력하는 부분은 추후에 사용되니 까먹지 않도록 합니다.


또한 포트를 설정하게 되어 있는데, 주로 5432를 사용하니, 잘 모르겠다 하시는 분들은 5432로 포트를 설정합니다.


마지막쯤에 Stack bulider 설치여부는 체크를 해제하고 마무리합니다.


이후는 3. PostgreSQL 시작하기를 참고해주세요.



2. 맥 환경에서 설치하기


맥에서 PostgreSQL을 설치하는 방법은 크게 2가지 입니다.


brew 패키지를 이용해서 설치하거나, 앱을 이용해서 설치하는 방법입니다.


개인적으로는 brew 를 이용한 설치보다 앱을 이용한 설치가 간편했기에 해당 방법을 안내해드리도록 하겠습니다.


https://postgresapp.com/


위의 사이트로 들어가 아래 그림과 같이 download를 클릭합니다.


그럼 dmg 파일을 내려받게 되는데, 이후 해당 파일을 실행시켜 쭉 진행하면 됩니다.

패스워드는 추후 사용되므로 까먹지 않도록 설정하고, 포트는 5432로 설정합니다.



3. PostgreSQL 시작하기


윈도우 또는 맥에서 PostgreSQL 설치가 끝나고, 해당 프로그램을 실행하면 다음과 같은 화면이 뜨게 됩니다.



해당 화면에서 보이는 3개의 원통은, 각각 데이터베이스를 뜻하고 그 아래 데이터베이스의 이름이 적혀있습니다.


처음 설치하시는 분들은 위와 같이, 제일 좌측에 자신의 User이름으로 된 데이터베이스와 나머지 2개의 데이터베이스가 기본으로 구성되어 있습니다.


자신이 진입하고자 하는 데이터베이스를 더블클릭하면 해당 데이터베이스로 들어가지면서 터미널 또는 cmd창이 켜질 것 입니다.


이제 해당 데이터베이스에서 자신이 원하는 작업을 실행하면 됩니다.


테이블을 만들거나 컨트롤 하는 방법에 대해서는 다음 포스팅에서 다뤄보도록 하겠습니다.

'Database > PostgreSQL' 카테고리의 다른 글

PostgreSQL #1_ 맥, 윈도우에 postgresql 설치하기  (0) 2018.07.16
블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc

티스토리 툴바