TigerCow.Door


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

이번 포스팅에서는 github에서 특정 repository에 대해 branch를 생성하고 이를 바탕으로 작업을 시작하는 방법에 대해서 알아보도록 하겠습니다.



1. branch 생성하기


branch 라는 것은 직역하면 나뭇가지로써, 실제로 현재 존재하는 repository에서 뻗어나온 가지와 같은 것으로 생각하시면 됩니다.


개발 영역을 분담해서 작업할 때, 서로 작업하는 내용들에 대해 충돌 등의 예방 및 관리들을 위해서 중앙 repository 또는 개별 branch 자체에서 branch를 생성해, 기존에 있던 내용을 그대로 따와 그것을 바탕으로 개별적인 작업을 할 수 있습니다.


먼저 branch를 생성하는 것부터 진행해보도록 하겠습니다.


현재 github과 연결되어 있는 프로젝트의 폴더로 들어가 아래와 같이 명령어를 입력합니다.


1
$ git branch branch_making_test
cs


해당 명령어를 입력해도 아무 결과가 나오지 않지만,


1
$ git branch
cs


위의 명령어를 한번 더 쳐서 확인해보면 아래 사진과 같이 master와 branch_makig_test 의 두개 항목이 있는 것을 볼 수 있습니다.


git branch 라는 명령어는 현재 branch가 어떠한 것들이 있는지 알려주는 명령어 입니다.

그리고 앞에 있는 * 의 의미는 현재 선택되어 있는(가리키고 있는) branch를 이야기하는 것 입니다. 현재 master branch를 가리키고 있기 때문에 이를 변경해보도록 합니다.

(위와 같은 화면에서 나가기 위해서는 q 한번 또는 두번을 눌러줍니다.)



2. branch 변경하기


branch를 변경하기 위해서는 checkout이라는 명령어를 사용합니다.


1
$ git checkout branch_making_test
cs


위와 같이 입력하면 branch_making_test라는 브런치로 변경되었다는 결과가 뜨고 git branch 명령어를 확인해보면 이전과 달리 branch_making_test의 앞에 *가 쳐져있는 것을 확인할 수 있습니다.


그리고 다음 명령어를 통해 앞으로 push/pull을 할때 새로 만든 브런치를 원격저장소를 사용하도록 지정합니다.


1
$ git push --set-upstream origin branch_making_test
cs



3. branch 삭제하기


현재 우리의 branch는 우리의 로컬 저장소에도 세팅이 되어있고 github이라는 원격저장소에도 세팅이 되어 있습니다.(push를 했다면..)


먼저 로컬 저장소에서 branch를 삭제하는 방법은 간단합니다.

checkout 명령어를 통해 삭제할 branch가 아닌 다른 branch로 이동을 하고 아래의 명령어로 branch를 삭제합니다.


1
$ git branch -d branch_making_test
cs


이렇게 하면 git branch 의 명령어로 확인해보았을때 해당 branch가 정상적으로 삭제된 것을 확인할 수 있습니다.

하지만 github과 같은 원격 저장소에는 아직 branch가 삭제되지 않았습니다.

원격저장소에서도 이를 삭제시키기 위해서는 다음과 같은 명령어를 입력합니다.


1
$ git push origin :branch_making_test
cs


위의 명렁어를 입력하면 해당 branch가 삭제되었다는 결과가 뜨고 실제로 github에서 확인해보았을 때 해당 branch가 삭제된 것을 확인할 수 있습니다.



4. 새로운 branch를 따서 작업하기


위에서 배운 것들을 응용해서, 우리가 github에 올려두었던 프로젝트를 그대로 가져와 새로운 branch에서 작업을 진행해보도록 하겠습니다.


1. 먼저 기존에 올려두었던 github의 프로젝트를 clone 하여 가져옵니다.

1
$ git clone <repository 주소>
cs


2. 이후 명령어창을 통해 git branch를 새로 만듭니다.

1
$ git branch <새로운 branch >
cs


3. checkout 명령어를 통해 branch를 이동합니다.

1
$ git checkout <새로운 branch >
cs


4. 원격 저장소에 해당 branch에 대한 정보를 업데이트 합니다.

1
$ git push --set-upstream origin <새로운 branch >
cs


이후 처음에 clone한 원격저장소로 가서 확인해보면 새로운 branch가 생긴것을 볼 수 있으며 해당 폴더에서 작업을 하시면서, 이전과 같이 커밋과 푸시를 진행하시면 해당 branch에 수정사항이 적용되는 것을 확인할 수 있습니다.

블로그 이미지

Tigercow.Door

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


안녕하세요.

이번 포스팅에서는 django에서 admin 페이지를 사용해보도록 하겠습니다.



1. Admin 계정 만들기


먼저 우리는 지난 포스팅까지해서 django와 postgresql의 django_test라는 데이터베이스를 만들어서 연결하였습니다.

그리고 django에서 post라는 모델을 생성하여 migrate 해줌으로써 실제 django_test라는 데이터베이스 내부에 blog_post라는 테이블이 생성된 것을 확인하였습니다.


django에서는 model에 대한 data를 간편하게 확인하고 조작할 수 있는 admin 페이지를 제공해주는데, 이때 admin페이지에는 아무나 접근 가능한 것이 아니고, 서버개발 과정에서 admin 계정을 직접 만들어주어야 합니다.

admin 계정을 만들기 위해서 manage.py 파일이 있는 위치에서 아래 명령어를 입력해줍니다.


python manage.py createsuperuser



명령어를 입력하면 위와 같이 admin 계정에 대한 정보를 입력할 수 있습니다.

여기서 입력한 Username과 password를 통해 admin 페이지에 접근가능합니다. 



2. Admin 페이지 사용하기


이렇게 admin 계정을 만들었다면 이제 서버를 돌려서 주소의 가장 끝에 /admin 을 붙여 admin 페이지에 접근해보겠습니다.



이렇게 접근하면, 아래와 같은 화면이 나타나게 됩니다.



이제 위에서 만들었던 admin 계정의 username과 password를 입력해서 로그인을 합니다.


그런데 로그인을 하고나서 확인을 해보아도 우리가 이전에 만들었던 post와 관련된 것은 찾아볼 수 없습니다.

우리가 마이그레이션을 통해 만들었던 post 모델을 admin 페이지에서 보기 위해서는 이를 admin 페이지에 등록을 해주어야 합니다.


우리가 만든 blog라는 app의 폴더로 들어가보면 admin.py 라는 파일이 있습니다. 해당 파일을 켜서 아래와 같이 작성해줍니다.


1
2
3
4
5
from django.contrib import admin
from .models import Post
# Register your models here.
 
admin.site.register(Post)
cs


그리고 해당 파일을 저장한 뒤에 다시 admin 페이지를 새로고침 해보면,



위와 같이 blog 라는 app에 Posts 라는 것이 새로 생긴것을 확인할 수 있습니다.

실제로 저것을 통해 Posts 라는 테이블에 저장된 값들을 확인할 수 있으며 우리가 직접 데이터를 추가할 수도 있습니다.


이를 직접 확인해보기 위해서, admin 페이지에서 데이터를 입력해보고 postgresql에서 확인해보도록 하겠습니다.


admin 사이트에서 Posts 우측에 있는 Add 버튼을 눌러서 데이터를 추가해보겠습니다.



위와 같이 제목과 내용을 입력하고 Save 버튼을 눌러 데이터를 저장합니다.


그럼 실제로 admin 페이지에서 데이터가 성공적으로 입력되었다는 문구가 뜨고, Posts object도 하나 생긴것을 볼 수 있습니다.


이제 postgresql에서 확인해보도록 하겠습니다.



간단한 SQL문장으로 해당 테이블을 확인해보니 정상적으로 데이터가 입력된 것을 볼 수 있습니다.



이렇게 해서 admin 페이지 사용에 대한 간략한 설명을 진행해보았습니다.

추후에 지속될 포스팅 내용으로는, 개발된 django 어플리케이션을 aws를 이용하여 배포하는 방법을 진행해보도록 할 예정입니다.

블로그 이미지

Tigercow.Door

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


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

이번 포스팅에서는 django에서 postgreSQL을 사용하는 방법에 대해서 알아보도록 하겠습니다.

현재 진행되는 환경은 django 2.0 / OS X / python 3.6.4 입니다.


1. postgreSQL 설정


postgreSQL은 관계형데이터베이스 중 하나로써, 먼저 이를 사용하기 위해 설치를 필요로 합니다.


postgreSQL 설치방법은 아래 글에 나와있으니 참고하시길 바랍니다.


http://doorbw.tistory.com/179?category=711158


postgreSQL 설치가 완료되었으면 터미널로 아무 데이터베이스나 접속합니다.

그리고 django에서 사용할 데이터베이스를 새로 만들어보도록 하겠습니다.


create database django_test;


를 입력합니다.



그리고 새롭게 만든 데이터베이스로 들어갑니다.


새롭게 만든, django_test 데이터베이스로 들어왔으면, 새로운 유저를 만들고 몇가지 설정과 함께 권한을 부여합니다.

순서대로 아래의 명령어를 입력합니다.


create user root with password 'password';

root는 유저 이름이고, password는 비밀번호입니다. 이때 비밀번호는 따옴표로 감싸주어야 합니다.

alter role root set client_encoding to 'utf-8';

alter role root set timezone to 'Asia/Seoul';

grant all privileges on database django_test to root;



위와 같이 하면 데이터베이스에 대한 설정이 마무리됩니다.



2. django 설정


먼저, django 설정을 진행하기 전에 필요한 것을 설치해야 됩니다.


psycopg2 라는 것을 설치해야 되는데, 터미널창에서 pip로 설치를 진행합니다.


pip install --no-binary :all: psycopg2




이렇게 설치가 마무리 되었으면, 이제 postgreSQL을 적용할 django 프로젝트로 들어가서 settings.py 파일을 열어봅니다.


그리고 그 중 아래와 같이 installed_apps 항목을 찾아서 우리가 만든 app을 추가합니다.




그리고 아래와 같이 database항목을 찾아봅니다.




위의 DATABASES 항목을 아래와 같이 수정합니다.


1
2
3
4
5
6
7
8
9
10
DATABASES = {
    'default': {
        'ENGINE''django.db.backends.postgresql',
        'NAME''django_test',
        'USER''root',
        'PASSWORD''password',
        'HOST''localhost',
        'PORT''',
    }
}
cs


name은 database의 이름을

user는 user의 이름,

password에는 user의 비밀번호를 입력합니다.


그리고 blog라고 새롭게 만든 app의 models.py 파일을 열어서 아래와 같이 작성합니다.


1
2
3
4
5
6
7
from django.db import models
 
# Create your models here.
class Post(models.Model):
    name = models.CharField(max_length = 20)
    content = models.TextField()
 
cs


이것은 우리가 blog라는 앱에서 데이터베이스 내부에 Post라는 table을 만드는 것이라고 생각하시면 됩니다.

일단은 간단하게 name과 content만을 갖도록 하였고, id같은 경우는 자동적으로 만들어지게 됩니다.


이렇게 까지 하고 django 프로젝트 폴더로 들어가서 아래와 같은 명령어를 입력해 줍니다.


python manage.py makemigrations


python manage.py migrate


이렇게 하고 


python manage.py runserver


를 통해 서버가 정상적으로 돌아가는지 확인합니다.


이제 다시 postgresql로 돌아와 우리가 만든 테이블이 잘 있는지 확인해보겠습니다.

실제로 django project내에서 따로 admin 페이지를 통해 확인할 수도 있지만, admin과 관련된 것은 다음포스팅에서 다뤄보도록 하겠습니다.


postgresql 터미널로 들어와서 아래 명령어를 입력하여 테이블 리스트를 확인합니다


\dt 



다양한 테이블이 많은데, 그중 가운데쯤 잘 보시면 blog_post 라는 테이블이 있습니다.

해당 테이블이 우리가 위에서 django 프로젝트를 통해서 만들게된 테이블입니다.



이렇게 하여 django 프로젝트에서 데이터베이스를 postgresql 로 연결하는 방법을 알아보았습니다.

다음 포스팅에서는 admin을 사용해보면서 실제로 데이터베이스에 데이터를 입력하고 확인해보도록 하겠습니다.

블로그 이미지

Tigercow.Door

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


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

이번 포스팅에서는 django에서 첫화면을 만들어보도록 하겠습니다.

먼저 우리가 만들어볼 전체적인 그림은 MVC패턴을 이용하여 간단한 블로그를 만들어 보는 것 입니다.

글을 작성하고 이것이 데이터베이스에 저장되고, 글을 삭제하거나 그에 대한 댓글을 다는 등의 기능을 구현해보도록 할 것 입니다.

먼저 이번 포스팅에서는 위에서 말씀드린 것과 같이 간단하게 첫화면을 만들어보도록 하겠습니다.


1. App 만들기


먼저 우리는 지난 포스팅을 통해서 start_django라는 프로젝트를 만들었습니다.

장고에서는 프로젝트 내부에 여러개의 app이 존재하면서 여러개의 기능을 구현할 수 있습니다.


먼저 우리는 blog라는 app을 만들어 보도록 하겠습니다.


터미널(윈도우의 경우 cmd창)을 열어서 지난 포스트에서 만든 프로젝트까지 이동합니다.

그리고 아래의 명령어를 입력합니다.


python manage.py startapp blog



그럼 위와 같이 start_django라는 우리의 프로젝트 폴더안에 blog라는 폴더가 새로 생긴 것을 확인할 수 있습니다.

현재 명령어 창이 위치한 start_django 폴더는 프로젝트의 기본 폴더라고 생각하시면 되고, 이 내부에 blog라는 app이 존재하며, 또 존재하는 start_django 폴더는 프로젝트 전체에 대한 설정 파일들이 담겨 있다고 생각하시면 됩니다.



2. 첫번째 화면 만들기


그럼 첫번째화면을 만들기 위해서 먼저 url지정을 진행해보도록 하겠습니다.

에디터를 통해 start_django > start_django > urls.py 파일을 열어봅니다.



위와 같이 매우 긴 주석처리와 약간의 코드가 존재합니다.

django 1.x 버전과 2.0 버전의 차이점 중의 하나가 여기서 나타나는데, 1.x 버전에서는 url 지정에서 url 함수를 사용하며 정규식을 사용하는데 2.0 이후부터는 path함수를 통해 정규식이 필요 없어지게 되었습니다.


우리가 추가하고자 하는 url은 맨처음 들어올 메인화면에 대한 것이므로 다음과 같이 코드를 수정합니다. (주석처리된 곳은 삭제하여도 무방합니다.)


1
2
3
4
5
6
7
from django.contrib import admin
from django.urls import path, include
 
urlpatterns = [
    path('', include('blog.urls')),
    path('admin/', admin.site.urls),
]
cs


2번째 줄을 보시면 include라는 함수를 추가로 import 하였습니다.

그리고 5번줄에서 path함수를 활용하여 첫 화면, 아무것도 입력되지 않은 url에서는 blog의 urls를 참고하도록 하였습니다.


이제 blog라는 폴더안에 urls.py 이라는 파일을 새로 만들어서 아래와 같이 코드를 작성합니다.


1
2
3
4
5
6
from django.urls import path
from . import views
 
urlpatterns = [
    path('', views.index),
]
cs


해당 urls.py 파일은 위에서 작성한 파일과 다른 파일입니다.

blog라는 폴더 내부에 새롭게 만든 파일입니다.

먼저 해당 blog에서는 존재하지 않은 admin관련 import를 삭제하였습니다.

admin과 관련되어서는 추후 model을 다루게 될때 살펴보도록 하겠습니다.

그리고 화면을 보여주도록 할 views 파일을 import 하였고, url패턴에서 아무것도 입력되지 않은 주소에 대해서 views의 index를 참고하도록 하였습니다.


그럼 마지막으로 blog 폴더에 있는 views.py 파일을 열어 아래와 같이 코드를 작성합니다.


1
2
3
4
5
6
from django.shortcuts import render
from django.http import HttpResponse
 
# Create your views here.
def index(request):
    return HttpResponse("Main Screen!!!")
cs


2번째 줄에, HttpResponse 라는 함수를 추가로 import하였습니다.

그리고 index라는 함수를 만들었고 단순히 HttpResponse함수를 통한 반환을 하도록 하였습니다.


이렇게 하고 명령어창을 기본 start_django 폴더에 위치하게 한다음, 아래의 명령어를 입력하면 서버가 돌아가게 됩니다.


python manage.py runserver



migrations 에 대한 경고가 뜨는데 일단은 무시하겠습니다.

그리고 이제 localhost:8000 으로 접속하게 되면 아래와 같이 우리가 작성한 첫화면이 나오게 됩니다.



블로그 이미지

Tigercow.Door

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


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

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

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

앞으로 진행되는 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

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

이번 포스팅에서는 Java 언어를 통해서 '가장 긴 팰린드롬' 이라는 알고리즘 풀이를 풀어보도록 하겠습니다.

해당 문제는 아래 프로그래머스 사이트에서 풀어보실 수 있습니다.


https://programmers.co.kr/learn/courses/30/lessons/12904?language=java



1. 문제 접근


팰린드롬이란, 문자열을 거꾸로 뒤집었을때도 모양이 같은 것들을 말합니다.

예를 들어, 'aba', 'aaddaa' 등도 팰린드롬이며 'asddfd' 라는 문자열에서는 'dfd'가 팰린드롬 문자열입니다.


해당 문제는 입력으로 주어지는 문자열에서 길이가 가장 긴 팰린드롬을 찾아서 그 길이를 반환하는 문제입니다.


팰린드롬에 대한 자세한 설명은 문제 또는 구글링을 통해 확인하실 수 있습니다.


먼저, 팰린드롬 문자열은 그것이 홀수 길이 이거나 짝수 길이 일때로 나누어서 생각해볼 수 있습니다.

팰린드롬 문자열이 홀수 길이 일때에는, 하나의 문자열을 기준으로 잡아서 그 왼쪽과 오른쪽 문자열을 서로 비교해가며 구하면됩니다.

팰린드롬 문자열이 짝수 길이 일때에는, 연속으로 동일한 문자열 2개를 기준으로 잡아서 그 왼쪽과 오른쪽 문자열을 서로 비교해가며 구하면됩니다.


하지만 중요한건, 우리는 입력되는 문자열에 대해서 계산될 팰린드롬 문자열의 길이가 홀수인지 짝수인지 미리 알 수 없습니다.

따라서, 입력되는 문자열에 대해 홀수 길이에 대한 알고리즘과, 짝수 길이에 대한 알고리즘을 모두 통과시키도록 하고 여기서 더 큰 값을 반환하도록 해야 합니다.



2. Java 코드


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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class Solution
{
    public int solution(String s)
    {
        int max_len = 1;
        int temp_len = 1;
        int len = s.length();
        // 팰린드롬 길이가 짝수일 경우
        for(int i=0; i<len-1; i++){
            if(s.charAt(i) == s.charAt(i+1)){ // 짝수 문자열에서 팰린드롬 기준점 선출
                temp_len = 0;
                for(int j=i+1; j<len; j++){
                    try{
                        char left = s.charAt(i+1-j+i); // left 위치선정
                        // left 위치 선정은 약간 까다로울 수 있음.
                        // 직접 연습장에 예시를 하나 두고 i와 j값을 변화시키며 확인해보는 것이 좋음
                        char right = s.charAt(j);
                        if(left == right){
                            temp_len += 2;
                        }else{
                            break;
                        }
                    }catch(Exception e){
                        break;
                    }
                }
            }
            if(max_len < temp_len){
                max_len = temp_len;
            }
        }
        // 팰린드롬 길이가 홀수일경우
        for(int i=0; i<len-1; i++){
            temp_len = 1;
            for(int j=i-1; j>=0; j--){
                try{
                    char left = s.charAt(j);
                    char right = s.charAt(i+i-j); // right 위치선정
                    // 이 또한 직접 예시를 하나 두고 i와 j값을 변화시키며 확인해보는 것이 좋음
                    if(left == right){
                        temp_len += 2;
                    }else{
                        break;
                    }
                }catch(Exception e){
                    break;
                }
            }
            if(max_len < temp_len){
                max_len = temp_len;
            }
        }
        return max_len;
    }
}
cs


해당 코드는 아래 github 주소에서도 만나보실 수 있습니다.

https://github.com/doorBW/algorithm_practice

'Algorithm > Java 풀이' 카테고리의 다른 글

JAVA #3_ The Grid Search  (0) 2018.08.08
JAVA #2_ Lily's Homework  (0) 2018.08.05
Java #1_ 가장 긴 팰린드롬 길이 구하기  (0) 2018.07.12
블로그 이미지

Tigercow.Door

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

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

이번 포스팅에서는 나이브 베이즈 분류(Naive Bayesian Classification)에 대해서 알아보도록 하겠습니다.

나이브 베이즈 분류는 스팸 필터나 문서 분류등에서도 많이 사용되는 분류 방법으로써, 분류 문제에 있어서 현재도 많이 이용되는 방법입니다.


1. 확률 이론 - 조건부 확률


나이브 베이즈 분류에 대해서 알아보기 전에 확률 이론중 조건부 확률에 대해 알아야 합니다.

크게 어려운 내용은 아니니 간단하게 짚고 넘어가보도록 하겠습니다.


먼저 간단하게, 확률은 다음과 같이 나타냅니다.

위의 그림과 같이, 파란색 구슬3개, 빨간색 구슬 2개로 총 5개의 구슬이 있을때,

P(파란색 구슬) = 3/5

P(빨간색 구슬) = 2/5

입니다.


즉,

P( A ) = A 의 경우의 수 / 전체 경우의 수

로 생각할 수 있습니다.


그럼 바로, 조건부 확률에 대해서 알아보도록 하겠습니다.

조건부 확률에서는 몇가지 가정이 필요합니다.

A와 B라는 두 가지 경우(상황)가 있을때, 이 두 경우는 서로 영향을 미치지 않는 상황을 먼저 생각해 볼게요.

예시를 들어본다면, 제가 오늘 아침에 일어나서 바로 물을 마시는 확률과 저녁에 게임을 하는 확률로 생각할 수 있습니다.

이러한 두 상황은 서로에게 영향을 미치지는 않지만, 충분히 둘 다 발생하는 경우는 존재할 수 있습니다.


위와 같이, 파란색, A 경우의 확률은 10%이고 B의 경우는 50%라고 생각해 봅시다. 이때 다음과 같은 식으로 나타낼 수 있습니다.


P(A) = 0.1

P(B) = 0.5

P(A  B) = P(A) * P(B) = 0.1 * 0.5 = 0.05


 B 는, A와 B가 동시에 일어날 확률이므로 서로의 확률을 곱해줌으로써 구해줄 수 있습니다. 그럼, 조건부 확률은 어떻게 나타내고, 어떻게 구할까요?

먼저 식으로 살펴보면 다음과 같습니다.


P(A|B) = P(A) = 0.1

P(B|A) = P(B) = 0.5


A|B 는 B의 경우에 A의 확률 입니다. 그런데 위의 식을 보면 P(A|B) = P(A) 로 되어 있습니다. 왜 그럴까요?

우리가 위에서, A와 B는 서로 영향을 미치지 않는다고 가정하였습니다.

즉, 오늘 제가 저녁에 게임을 하던 안하던, 아침에 일어나서 바로 물을 마실 확률은 그대로인 것입니다.

같은 개념으로, 그 반대인, P(B|A) = P(B) 로 도출됩니다.


그럼 조금 다른 가정을 생각해보도록 할게요.

만약에 A와 B가 서로에게 영향을 미치는 상황이라면 어떨까요?

그림은 위에서 사용한 동일한 그림을 이용하겠습니다.

이제는 A와 B가 서로에게 영향을 끼칩니다.

그러므로 조건부 확률의 식이 달라지게 되는데, 이때의 조건부 확률은 다음과 같습니다.


P(A|B) = P(A ∩ B) / P(A)

P(B|A) = P(A ∩ B) / P(B)


위와 같은 식을 이용하여 베이즈 정리를 통해 우리는 다양하게 변형 해볼 수 있습니다.


P(A B) = P(A|B) * P(A) = P(B|A) * P(B)

P(A|B) = P(B|A) * P(B) / P(A)

P(B|A) = P(A|B) * P(A) / P(B)


즉, 베이즈 정리는 위와 같이, 사전 확률(A경우에서의 B)를 통해 사후 확률(B경우에서의 A)을 알 수 있다는 것을 말합니다.

위와 같이 변형된 식들을 이용하면, 우리가 알고있는 정보를 통해 새로운 정보를 얻을 수 있습니다.

또한 본격적으로 알아볼 나이브 베이즈 분류에서 위의 개념들이 사용됩니다.



2. 나이브 베이즈 분류

(Naive Bayesian Classification)


그럼 실제로 나이브 베이즈 분류가 어떤 것인지 예제를 통해 알아보도록 하겠습니다.

처음에 말씀드렸듯이, 나이브 베이즈 분류는 스팸 필터에서도 많이 사용되는 분류기이기 때문에, 이와 같은 예제를 사용해보도록 하겠습니다.

우리가 사전에 알고 있는 정보는 다음과 같습니다.


총 이메일: 100개

(spam 이메일의 확률) = P(spam) = 30/100

(money라는 단어가 포함된 이메일의 확률) = P(money) = 50/100

(spam 이메일 중 money를 포함한 이메일의 확률) = P(money | spam) = 2/5


이러한 정보들을 바탕으로, 우리는 money를 포함한 이메일이 spam일 확률을 구하고 싶어합니다.

즉, P(spam | money) 의 값을 구하고 싶은 것이죠.

우리가 위에서 알아본 베이즈 정리를 통해 아래와 같은 수식으로 쉽게 구할 수 있습니다.


P(spam | money) = P(money | spam) * P(money) / P(spam)

=(2/5) * (50/100) / (30/100) = 2/3


위와 같이 쉽게 구할 수 있습니다.


하지만 위와 같은 예제는 아주 복잡한 상황을 매우 단순하게 축약했을 뿐 입니다.

실제로는 훨씬 더 복잡하기에 우리는 분류기 등을 실제로 설계하고 제작하여 사용합니다.


단순히 하나의 단어가 아니고, 수십개, 수백개의 단어를 통해 분류를 하기에 우리가 하나하나 손으로 계산하기가 불가능하다고 볼 수 있습니다.


블로그 이미지

Tigercow.Door

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

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

최근에 방학을 맞이하면서 블로그에 글을 올리는 일이 줄어들었습니다.

방학동안 어떤 공부를 할지 계획도 세우고, 오늘 설명드릴 구글 어시스턴트 어플리케이션 개발을 마무리하느라 블로그 신경을 많이 못썼습니다.



1. 개발 동기


오늘 설명드릴 것은 말 그대로 구글 어시스턴트 어플리케이션 개발에 대한 후기입니다.


아직 구글 어시스턴트에 대해서 많은 분들이 잘 모르고 계시는데, 구글 어시스턴트는 17년 하반기에 한국어 버전이 오픈되었고 아마 안드로이드 버전 6.0이상에서는 따로 설치없이 기본적으로 제공되는 것으로 알고 있습니다.


아직 iOS에서는 한국어 버전이 따로 지원되지 않으나 해외에서는 지원되는 상태고 구글에서도 올해 안에 iOS 한국어 버전 구글 어시스턴트 어플을 출시할 계획이라고 하니 조금만 기다려보면 좋은 소식이 있을 듯 합니다.


최근 많은이들이 챗봇등에 관심을 갖게되면서 사실상 한국인이 제일 많이 사용하는 카카오톡 서비스를 이용하여 많은 챗봇을 개발하고 있습니다.

그리고 많은 중고등학생, 대학생 개발자들이 공부를 하면서 학교 식당 메뉴를 알려주는 챗봇도 함께 개발되고 있습니다.


저 또한 서울시립대학교에 재학중이면서 작년 겨울에 비슷한 아이디어를 가지고 인공지능 챗봇을 개발하였지만 기타 다른 상황의 문제로 인해 실제 서비스를 배포하지는 못했지만, 현재 서울시립대학교 식당 메뉴를 알려주는 기능을 가진 챗봇이 약 2개이상 있는 것으로 알고 있습니다.


저 또한 해당 서비스들을 학기중에 편하게 이용하였습니다.

그러던 와중 제가 아침마다 날씨등을 알기 위해 간편하게 음성인식을 통해 구글 어시스턴트 어플리케이션이라는 이용하면서, 이를 통해 그날의 메뉴를 알 수 있으면 조금 더 편리하지 않을까라는 생각을 하게 되었고, 바로 아는 후배와 함께 개발을 하게 되었습니다.

+ 구글 어시스턴트를 매우 많이 사용하는 동기놈의 압박도 있었습니다..:'( 



2-1. 구글 어시스턴트 사용 방법


아직 구글 어시스턴트에 대해서 잘 모르시는 분들께서는 그 편리함에 대해서 의문을 가질 수 있습니다. (아시는 분께서도 가지실 수 있으나.. 저와 친구는 특정 메신저에 접속하여 손으로 타이핑하는 것보다는 편하다고 생각하였습니다ㅎ..)


위에서 말씀드린대로 안드로이드 버전 6.0 이상에서는 구글 어시스턴트가 기본적으로 제공이 됩니다. 이를 이용하는 방법은 너무나 간단합니다.


초기 설정만 해두면 'Ok Google' 등의 음성으로 간편하게 호출할 수 있고 또는 홈버튼을 길게 눌러줌으로써 호출할 수 있습니다.

초기 설정이 필요하신 분들께서는 음성 호출은 불가하지만, 홈 버튼을 꾹 눌러주시면 구글 어시스턴트를 호출할 수 있습니다.


구글 어시스턴트에서 할 수 있는 다양한 기능은 작년 하반기에 한국어 버전이 출시되며 작성된 아래 글을 참고하셔도 좋습니다.


https://www.bloter.net/archives/290622


또한 최근에는 더 많은 기능들이 지속적으로 업데이트 중인 것으로 알고 있으니 사용해보시면서 구글 어시스턴트의 매력을 느껴보시면 좋을 것 같습니다.



2-2. 오늘학식 사용 방법


먼저 2-1 에서 설명드렸던, 구글 어시스턴트를 2가지 방법 중 아무것으로나 호출하면 다음과 같은 화면이 나오게 됩니다.

(초기 설정을 끝낸 상태입니다.)



모바일에서 위와 같은 화면이 뜨면 기본적으로 구글 어시스턴트의 기능을 사용할 수 있으며, 추가적인 구글 어시스턴트 어플을 사용할 수 있는 상태입니다.


이제 해당 화면에서 '오늘 학식'을 사용하기 위해서는 


오늘학식한테 말하기

오늘학식 불러줘

오늘학식에게 말하기


세가지 호출문을 사용하면 됩니다.


위의 호출문을 음성으로 말해도 되고, 좌측에 있는 키보드를 눌러 타이핑 하셔도 됩니다.


그리고 호출문이 입력되면 아래와 같이 '오늘 학식' 어플리케이션이 실행되는 것을 확인할 수 있습니다.



이제 여기서부터는 '오늘 학식' 어플리케이션에서 개발된 로직으로 사용자와 구글 어시스턴트가 대화하게 되는 과정입니다.


현재 '오늘 학식' 어플리케이션에서는 서울시립대학교의 건물별 식당 메뉴를 반환해주는 기능을 하고 있습니다.

보다 구체적으로는, 아래와 같이 식당이 있는 학생회관, 양식당, 대학본부, 생활관, 자연과학관의 엊그제, 어제, 오늘, 내일, 내일모레의 메뉴를 알 수 있습니다.


아직 개발 초기이기 때문에 부족한 점도 많을 수 있지만 지속적으로 개발을 이어나갈 예정이며 먼저 메뉴 반환에 대해 시간별로 나누거나, 메뉴 반환 이외의 다양한, 학생들의 편의를 위한 기능도 업데이트 예정 중에 있습니다.



3. 개발 후기


요새 많은 챗봇들에 대해 관심이 많아지면서 저 또한 작년 부터 관심을 많이 가졌습니다. 작년에 처음 인공지능 챗봇을 개발하면서 자연어 처리등에 대해 많은 어려움을 느꼈고, 아직은 어느정도의 규칙기반 틀에서 벗어날 수 없을 것이라고 생각했지만, 정말 짧은 시간안에 많은 부분들이 극복되며 매우 놀라운 챗봇들이 개발되고 있습니다.


그리고 그 가운데 구글 어시스턴트는 기본적으로 개발자에게 자연어 처리나 음성인식등의 기능을 제공해주고, 개발자는 아이디어를 생각하고 이를 구현하기만 하면 되었기에 생각보다 매우 수월하고 재미있는 경험이 되었습니다.


아직 익숙치 않은 자바스크립트로 개발을 진행해보았는데, 새로운 언어를 접해볼 겸 개발했던 것이 너무나 즐거운 경험이 된 것 같습니다.


현실상 해당 구글 어시스턴트 어플리케이션, 오늘학식을 매일매일 붙잡고 버그를 잡아내고, 업데이트를 할 수는 없겠지만 공부도 할겸, 조금이나마 학생들에게 편리한 서비스를 제공할겸 틈틈이 오류를 잡아내고 새로운 기능들을 업데이트 하려고 합니다.


발견되는 오류가 있거나 업데이트가 되었으면 하는 기능이 있다면 해당 어플 리뷰나 이메일로 의견 보내주시면 최대한 반영하여 빠른 시일내에 좋은 서비스를 제공해드리도록 하겠습니다.


또한 깊게 공부하며 엄청나게 어려운 것을 개발한 것은 아니지만 구글 어시스턴트 어플을 처음 개발하시는 분들께서 궁금하신점이나 잘 해결되지 않는 점이 있다면 언제든지 함께 고민해보도록 하겠습니다. 이메일이나 댓글로 남겨주시면 감사하겠습니다 :)



블로그 이미지

Tigercow.Door

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