끝나고 팀원들과 KPT회고를 작성하였다.

토요일 부터 친누나 결혼식이 있어 전날부터 수면부족에 시달렸다.

아버지의 대가족도 집에 찾아오셔서 엄청 피곤했다.

주말동안 겨우 4시간을 잤다.

그러다 보니 미완성인 팀프로젝트에 집중을 할 수가 없었다.

팀원에게 미안하고 오늘은 그저 잠을 짬짬히 잤다.

그래도 피곤하다... 컨디션 관리를 잘하자.

 

5월 8일 : 팀 프로젝트를 위해 회의를 하였다. 팀 프로젝트마다 꼼꼼한 회의가 필요하다고 계속 생각하였다. 이번 팀원분들도 그렇게 생각하였는지 모두 같이 의견을 많이 나누고 사소한 부분까지 챙기며 방향과 방법을 정하였다.

 

5월 9일 : 좋아요와 북마크 기능을 담당하였고 그 기능을 구현하기 위해서는 역참조를 해야한다는 것을 알았지만 직접 해보려니 어떻게 해야할지 잘 몰랐었다. 튜터님께 여쭤보고 해결이 되었고 잘 적어놓았다.

 

5월 10일 : 파이썬 pip 설치시 에러를 해결하기 위해 이것저것 찾고 설치하며 시간을 많이 보냈다. 팀원분에게 도움을 요청드렸는데 내가 쓰고있는 파이썬 버전에는 이미 내장되어있던 기능이라 설치가 중복되어 에러가 나는 것이었다. 그리고 패스워드 재설정 이메일 보내는 기능을 공부를 하였다.

 

5월 11일 : 패스워드 재설정은 기능을 구현하였지만 가입시 기능은 시간이 부족하여 필수로 구현해야하는 부분인 프론트엔드와 백엔드의 데이터 연결을 하였다. 어깨에 힘을 빼고 물어보고 찾아보며 구현하고 메모 하여 기억하는 것이 중요하다고 생각이 들었다. 무지를 인정하고 용기를 갖고 나아가는 것. 팀 프로젝트를 하며 배운 마음가짐이다.

 

5월 12일 : 페이지네이션을 하다가 프론트에서 어떻게 적용을 시킬지 고민을 하다 토요일에 친누나 결혼식이 있어서 마치지 못하고 잠을 잤다.

 

어떤 상황에서도 나를 믿고 위를 보고 나아가는 사람이 되었으면 좋겠다. 무지함을 인정하고 용기를 갖고 나아가는 것은 주변 사람들로 부터 도움을 받으며 지혜를 받고 배우는 것임을 알게 되었다. 그리고 그것을 메모하는 것. 내가 팀 프로젝트를 하며 배운 가장 큰 것이었다.

'WIL' 카테고리의 다른 글

WIL 8주차 : AWS, 알고리즘  (0) 2023.05.07
WIL 7주차 : DRF 개인과제와 알고리즘, 복습  (0) 2023.04.30
WIL 6주차 : DRF 시작함.  (0) 2023.04.23
[5주차] WIL : 불안하다...  (0) 2023.04.16
[4주차] WIL : 현실이 느껴진다..  (0) 2023.04.09

https://velog.io/@migdracios/DRF-DRF-%EA%B3%B5%EC%8B%9D%EB%AC%B8%EC%84%9C%EB%A1%9C-Pagination%EC%9D%84-%EA%B5%AC%ED%98%84%ED%95%98%EC%9E%90

 

[DRF] DRF 공식문서로 Pagination을 구현하자

DRF 공식문서를 참조하여 Pagination API를 구현해보자. 거기에 Generic View와 Viewset을 곁들인...

velog.io

팀 프로젝트중 페이지네이션을 해보려고 했다.

drf에서 구현을 하고 어떻게 백으로 가져와야할까 고민을 많이 했다.

친누나 결혼식이어서 컨디션을 위해 마저 구현하지 못하고 자야했다.

다음엔 꼭 해봐야겠다.

위에 링크를 따라서 페이지네이션을 만들었고 프론트로는 fetch로 요청하고 고민을 해보았으나 실패.

 

팀프로젝트에서 좋아요를 누른 글과 북마크 한 글만 보도록 하는 기능을 구현하였고

그것을 프론트에 보여주는 것을 하기위해 자바스크립트를 채연님에게 도움을 받으며 해결했다.

글 작성 부분도 자꾸 400에러가 나서 도움을 받았고, 이유는 프론트에서 백으로 제이슨을 줄 때

잘못된 이름으로 데이터를 전달해서 그랬다.

 

그리고 헤더 부분을 어떻게 담아줘야할까 를 고민했는데 강의에 나온 내용이 있었다.

하지만 jqurey로는 해본적이 없어서 여러가지 방법을 시도하다 실패하고

강의에서의 내용으로 바닐라 자바스크립트로 다시 작업을 하였다.

여기부분 또한 채연님에게 도움을 받아서 해결을 할 수 있었다.

 

무엇보다 공부를 제대로 할 필요가 있다. 좀 하루를 소비해서 제대로 고민 좀 해보자

SMTP(Simple Mail Transfer Protocol) : 메일 전송, 포워딩
메일 포워딩 : 메일을 전달하는 기능. 발송과 전달은 다르다.
 
IMAP(Internet Messaging Access Protocol) : 메일 읽어오기
 
POP3 (Post Office Protocol Version 3) : 보관
 
장고 기본 비밀번호 변경 기능
 
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
#    EMAIL_BACKEND 는 어떤 backend 를 사용해서 메일을 보낼거냐를 정해주게 됩니다.
#    디폴트 값이 있기 때문에 적지 않아도 좋다.
EMAIL_HOST = 'smtp.naver.com' 		 # 메일 호스트 서버
EMAIL_PORT = '587' 			 # 서버 포트
EMAIL_HOST_USER = '메일@naver.com' 	 # 우리가 사용할 메일
EMAIL_HOST_PASSWORD = '비번'		 # 우리가 사용할 메일 비번
EMAIL_USE_TLS = True			 # TLS 보안 설정
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
 
urlpatterns = [
    path('accounts/', include('django.contrib.auth.urls')),
]

accounts url에는 아래와 같은 url이 포함되어 있다.

accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
#밑에 네개만 필요하다.
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']
 
 
from django.contrib.auth import views as auth_views   

path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'),
   path('password_reset_done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'),
   path('password_reset_confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
   path('password_reset_complete/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),

위에서 봤던 네개의 url을 커스터마이징 할 수 있다.

회원가입 인증은 아직 하다 말았다. 공부하자 공부!

 

데이터베이스의 관계
One-To-Many : 하나가 여러개를 가질 수 있다. 예, 한 계정의 여러 개의 게시글
One-To-One : 하나가 하나만 가질 수 있다. 예, 한 계정 당 하나의 프로필
Many-To-Many : 서로 많은 것을 가질 수 있다. 예, 좋아요.
 
Many-To-Many 만들어 보기
restaurant 앱 만들기 : python manage.py startapp restaurant
restaurant 등록하기 : 'restaurant'
모델 코드 복붙
makemigrations : python manage.py makemigrations
migrate : python mange.py migrate
관리자 페이지에 모델 등록 하기 : admin.site.register(restaurant)
데이터 만들고 넣어주기
 
장고 shell로 테스트하기
피자에서 토핑 가져오기
shell 시작 : python manage.py shell
모델 가져오기 : from restaurant.models import MyPizza, MyTopping
피자 전부 보기 : MyPizza.objects.all()
피자 하나씩 가져오기 : MyPizza.objects.get(pizza_name = '피자이름')
각 피자 토핑 불러오기 : MyPizza.objects.get(pizza_name  = '피자이름').MyTopping.all()
 
토핑에서 피자 가져오기
shell 시작 : python manage.py shell
모델 가져오기 : from restaurant.models import MyPizza, MyTopping
토핑 전부 가져오기 : MyTopping.objects.all()
토핑 하나씩 가져오기 :  MyTopping.objects.get(topping_name = '토핑이름')
각 토핑이 들어간 피자 불러오기 : MyTopping.objects.get(topping_name='토핑이름').mypizza_set.all()
 
좋아요 모델 만들기
follow로 manytomany. settings에서 유저모델로. 역참조 이름은 followee
 
views.py에 복붙
urls 복붙
user_list.html 만들기, 복붙
이메일 인증은 지금 공부를 하고 있다. 잘 정리해서 내일 TIL로 써야할 것 같다. 너무 늦었다.

 

장고 기본 유저에 기능 추가하여 사용하기
AbstractUser : 장고의 기본 유저 모델
장고 유저 모델 상속받아 사용하기 bio 추가하기 : bio = models.CharField(max_length=256, default='')
장고에서 기본 유저 모델 바꾸기 : AUTH_USER_MODEL = 'user.UserModel'
DB에 변경사항 알려주기 : python manage.py makemigrations
DB에 변경사항 반영하기 : python manage.py migrate
DB에 테이블이 생성 되었는지 확인
 
장고 기본 유저 기능 추가하여 회원가입 하기
get_user_model : 사용자가 DB에 있는지 확인하는 함수
create_user : 장고 기본 유저를 사용하면 쓸 수 있는 함수
exist_user 변수에 get_user_model 사용하기 : exist_user =  get_user_model.objects.filter(username=username) #get_user_model() 괄호를 주의하자.
회원가입 views를 create_user로 변경하기 : UserModel.objects.create_user(username=username, password=password, bio=bio)
 
장고 기본 유저 기능 추가하여 로그인 하기
비번 암호화 : 장고 기본 유저 모델 사용하면 비번은 자동으로 암호화 됌.
authenticate : 아이디와 비번을 확인하는 함수. DB에 있는지 확인한다.
login : 장고에서 로그인 할 수 있도록 해주는 함수.
authenticate 사용하기 : me = authenticate(username=username, password=password)
login 함수 사용하기 : auth.login(request,me)
 
로그인 이후 페이지 이동하기
tweet 폴더 만들고 home.html 만들고 복붙
is_authenticated : 유저가 로그인 되어 있는지 확인.
tweet views home 작성
def home(request):
    user = request.user.is_authenticated
    if user:
        return redirect('/tweet')
    else:
        return redirect('sign-in')
tweet views tweet 작성
def tweet(request):
    if request.method == 'GET':
        return render(request, 'tweet.home.html') #폴더를 타고 들어갈때는 슬래시.
urls 작성 복붙
tweet urls 연결하기 '' :path('', include('tweet.urls')),
username 띄워주는 화면을 다시 지시 '/' 화면 보여주기 : return redirect('/')
 
사용자 카드에 데이터 띄워주기
home.html 수정
h6 없애기.
title에 유저네임, text에 바이오 :{{user.username}} {{user.bio}}    #me.username이 아니였다. user다.
 
네비바 수정
로그인 회원가입 버튼은 로그인 되어있다면 username을 띄워주고 아니라면 버튼 보이기 :  {{user.username}} 님 반갑습니다!
 
로그인해야 home.html 볼 수 있도록 수정하기
만약 user가 is_authenticated 라면 보여주고
아니라면 로그인 화면으로 다시 지시 해주기 :
user = request.user.is_authenticated
    if request.method == 'GET':
        if user:
            return render(request, 'tweet/home.html')
        else:
            return redirect('/sign-in')
 
로그인 되어있다면 회원가입 페이지 못가도록 수정
만약 로그인 되어있다면
'/' 다시 지시
아니라면 회원가입 페이지 보여주기 :
user = request.user.is_authenticated
    if request.method == 'GET': # GET 메서드로 요청이 들어 올 경우
        if not user:
            return render(request, 'user/signup.html')
        else:
            return redirect ('/')
 
로그인 되어있다면 로그인 페이지 못가도록 수정
만약 로그인 되어있다면:
'/' 다시 지시:
아니라면 로그인 페이지 보여주기 :
elif request.method == 'GET':
        if not user:
            return render(request, 'user/signin.html')
        else:
            return redirect('/')
 
로그아웃 기능  추가하기
logout 함수 만들기:
auth.logout() 함수 사용하기 :
'/' 다시 지시 :  
def logout(request):
    auth.logout(request)
    return redirect('/')
 
 
로그아웃 함수에 로그인 필요하다는 데코레이터 추가하기 :
from django.contrib.auth.decorators import login_required

@login_required
def logout(request):
    auth.logout(request)
    return redirect('/')
로그아웃 url  설정하기 'logout/' 별칭 logout : path('logout/',views.logout, name='logout'),
 
로그아웃 버튼 만들기
if 부터 else 까지 복사해서 이름 보여주는 곳에 붙여넣기:
로그인 부분 없애고 수정 <span class ='nav-link'> {{이름 보여주기 }}
바로 윗줄 disabled로 변경:
회원가입을 logout으로 변경 span 부분은 제거 :
<form class="form-inline my-2 my-lg-0">
            <ul class="navbar-nav mr-auto">
                <li class="nav-item disabled">
                    <span class="nav-link">{{user.username}}</span>
                </li>
                <li class="nav-item active">
                    <a class="nav-link" href="/logout/"> 로그아웃</a>
                </li>
            </ul>
        </form>
 
게시글 작성하기
home.html 수정하기
action tweet, method post:
csrf_token :
<div class="form-group mb-2" method="post" action="/tweet/"> # 이건 틀린거다. form 에 넣어야 한다. 
{%csrf_token%}

<form method="post" action="/tweet/">
                    {%csrf_token%} # 이게 맞는 코드다.
 
tweet 함수 수정하기
 elif request.method =='POST':
        user = request.user
        my_tweet = TweetModel()
        my_tweet.author = user
        my_tweet.content = request.POST.get('my-content','')
        my_tweet.save()
        return redirect('/')
 
게시글 보여주기
views 수정
all_tweet = TweetModel.objects.all().order_by('-created_at')
            return render(request, 'tweet/home.html', {'tweet':all_tweet})
home.html 수정
코드 복붙
 
게시글 삭제하기
@login_required 
def detail_tweet(request,id):
    my_tweet = TweetModel.objects.get(id=id)
    tweet_comment = TweetComment.objects.all().filter(tweet_id = id).order_by('-created_at')
    return render(request, 'tweet/tweet_detail.html', {'tweet':my_tweet, 'comment':tweet_comment})
url 수정
tweet/delete/id, 별칭 delete-tweet : path('tweet/delete/<int:id>/',views.delete_tweet,name='delete-tweet'),
 
home.html 에 삭제 버튼 만들기 복붙 :
 
숙제
게시글 자세히 보기 부분에서는 특정글과 특정글의 댓글만 가져와야한다.
이걸 어떻게 해야할지 몰랐다. 특정 html에 그저 특정 글과 댓글만 띄워주면 되는 것 이었다.
 
tweet_detail.html 코드 복붙.
urls.py 작성.
path('tweet/<int:id>',views.detail_tweet,name='detail-tweet'),
path('tweet/comment/<int:id>',views.write_comment, name='write-comment'),
path('tweet/comment/delete/<int:id>',views.delete_comment, name='delete-comment'),
모델 복붙.
views 작성
여기서 가져오는 아이디는 게시글의 아이디.
@login_required 
def detail_tweet(request,id):
    my_tweet = TweetModel.objects.get(id=id).order_by('-created_at')
    tweet_comment = TweetComment.objects.all().filter(tweet_id = id)
    return render(request, 'tweet/tweet_detial.html', {'tweet':my_tweet, 'comment':tweet_comment})

여기서 가져오는 아이디는 게시글의 아이디.
@login_required 
def write_comment(request, id):
    if request.method == 'POST':
        comment = request.POST.get('comment','')
        current_tweet = TweetModel.objects.get(id=id)
        TC = TweetComment()
        TC.comment = comment
        TC.author = request.user
        TC.tweet = current_tweet
        TC.save()
        return redirect('/tweet/'+str(id))

여기서 가져오는 아이디는 코멘트의 아이디.
@login_required
def delete_comment(request, id):
    comment = TweetComment.objects.get(id=id)
    current_tweet = comment.tweet.id
    comment.delete()
    return redirect('/tweet/'+str(current_tweet))
 
 
 
 
 
 

역참조 공부가 필요하다.

게시글 중에 좋아요를 누른 아이디 중 내 아이디가 있는 것을 가져와야한다.

    def get(self,request):
        user = request.user
        article = user.hearts.all()
        serializer = ArticlesSerializer(article, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

 

기능별로 앱 만들기
user 앱 만들기 :    python manage.py startapp user
tweet 앱 만들기 : python manage.py startapp tweet
setting.py에 user, tweet 앱 추가하기 : 'user', 'tweet',
 
DB 연결
setting.py에 DATABASES 부분을 확인, 장고 실행 후 파일 생성 확인
 
user 모델 만들기
코드 스니펫 복붙
DB에 변경사항 알려주기 : python manage.py makemigrations
DB에 변경사항 반영하기 : python manage.py migrate
DB에 테이블이 생성 되었는지 확인
 
장고 admin 기능 사용
관리자 계정 만들기 : python manage.py createsuperuser
관리자 페이지에 User 모델 등록 : admin.site.register(UserModel)
 
 
Tweet 모델 만들기
코드 스니펫 복붙
DB에 변경사항 알려주기 : python manage.py makemigrations
DB에 변경사항 반영하기 : python manage.py migrate
DB에 테이블이 생성 되었는지 확인
 
장고 admin 기능 사용
관리자 페이지에 Tweet 모델 등록 : admin.site.register(TweetModel)
 
base.html 복붙
user폴더 만들기.
폴더 안에 signup.html 복붙.
폴더 안에 signin.html 복붙.
템플릿 언어 : html에 파이썬 문법을 사용하거나 템플릿을 확장할 때 사용.
 
signup 과 signin 연결하기
유저앱의 urls.py 사용하기 url='' : path('', include('user.urls'))
유저앱 view.py 복붙.
유저앱 urls.py 복붙.
 
GET과 POST
인터넷으로 통신하는 방법들.
GET : 값을 읽어 올 때
POST : 값을 전해 줄 때
 
회원가입 기능 만들기
def sign_up_view(request):
    if request.method == 'GET': # GET 메서드로 요청이 들어 올 경우
        return render(request, 'user/signup.html')
    elif request.method == 'POST': # POST 메서드로 요청이 들어 올 경우
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)
        password2 = request.POST.get('password2', None)
        bio = request.POST.get('bio', None)
        if UserModel.objects.filter(username=username):
            return HttpResponse('존재하는 username 입니다.')
        if password != password2:
            return render(request, 'user/signup.html')
        else:
            new_user = UserModel()
            new_user.username = username
            new_user.password = password
            new_user.bio = bio
            new_user.save()
        return redirect('/sign-in')
회원가입 html 수정
form : 화면에 있는 데이터를 서버로 전송 할 때 사용하는 태그
post 방식으로 회원가입 url로 보냄 : <form class="form-area" method="POST" action="/sign-up/">
csrf_token 사용 : {%csrf_token%}
 
로그인 기능 만들기
세션 : 같은 사람이 요청을 하는지 확인 할 수 있도록 도와줌. 사용자의 정보를 저장  할 수 있다. 정도로 생각한다.
def sign_in_view(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        me = UserModel.objects.get(username=username)
        if me.password == password:
            request.session['user'] = me.username
            return HttpResponse(username)
        else:
            return redirect('/sign-in')
    elif request.method == 'GET':
        return render(request, 'user/signin.html')
로그인 html 수정
post 방식으로 회원가입 url로 보냄 : <form class="form-area" method="POST" action="/sign-in/">
csrf_token 사용 : {%csrf_token%}
 
숙제
  1. 지금 회원가입은 데이터베이스에 동일한 사용자가 있어도 가입이 됩니다.
사용자는 유일하게 만들어져야 하기 때문에 회원가입 시에 이미 있는 사용자 인지 확인하는 코드를 작성 해 주세요
if UserModel.objects.filter(username=username): 
    return HttpResponse('존재하는 username 입니다.')
 
  1. 사용자가 로그인을 성공 한 후에 HttpResponse를 사용해서 화면에 '사용자 이름'을 출력 해 주세요
 
return HttpResponse(username)

오늘 팀 프로젝트 시작이어서 회의하면서 어떤 사이트를 만들지 정하고 , API, 와이어프레임, 역할 정하고 프로젝트 시작.

 

장고 실무 기초 다시 시작 1주차

 

1주차
 
클라이언트 : 요청을 보내는 곳.
서버 : 요청을 받아서 응답을 해주는 곳.
API : url이 API.
 
Web Framework : 개발을 도와주는 하나의 틀
최소한의 기능 제공 : Pyramid , Flask
많은 기능 제공 : Django
MVT
Model(ORM) : 데이터베이스의 모델, 저장되고 사용되는 데이터의 형태.
View : 실질적으로 프로그램이 동작하는 부분. 요청과 응답 사이  서비스가 존재하는 곳.
Template : 사용자에게 보여지는 화면.
ORM(Object Relational Mapping) : 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 도구.
관계형 데이터베이스(RDBMS) : 테이블, 행, 열의 정보를 구조화하는 방식.
 
mySpartaSns 로 새 프로젝트 생성 : django-admin startproject mySpartaSns .
 
장고의 구조
settings.py : 장고의 환경설정 내용을 담고 있다.
urls.py : 장고 전체의 API를 담당.
 
장고 실행하기 : python manage.py runserver
 
글씨 띄우기
views.py에서 base_response 만들기
from django.http import HttpResponse

def base_response(request):
    return HttpResponse("안녕하세요! 장고의 시작입니다!")
urls.py에 test로 base_response 연결하기. 별칭은 first_test
from . import views

path('test/', views.base_response,name = 'first_test'
 
HTML 띄우기
my_test.html 만들기 그리고 코드 복붙.
views.py에 first_view 만들기
from djagno.shortcuts import render

def first_view(request):
    retrun render(request, 'my_test.html')
urls.py에 first로 first_view 연결하기. 별칭은 first_view
path('first/', views.first_view, name = 'first_view'
 
숙제
2. project_01.py를 만들고, 주어진 데이터를 반복문으로 모두 출력하는 station_list 함수를 작성하세요.
데이터 : my_station=['야탑','모란','이매','선릉','한티','왕십리']
my_station=['야탑','모란','이매','선릉','한티','왕십리']
def station_list(my_station):
    print('station_list')
    for station in my_station:
        print(station)

station_list(my_station)
3. proejct_01.py에 주어진 데이터를 반복문과 조건문을 사용하여 '선릉'만 출력 하는 station_point 함수를 작성하세요
def station_point(my_station):
    print('station_point')
    for station in my_station:
        if station == '선릉':
            print(station)

station_point(my_station)
4. proejct_02.py에 게시글을 저장하는 class를 만들려고 합니다.
클래스 안에 들어갈 변수는 ( id, title, author, content) 으로 모두 빈 문자열로 저장하고, 게시글 한 개를 저장해 보세요!
class post:
    id = ''
    title = ''
    author = ''
    content = ''

first = post()
first.id = 1
first.title = '장고의 시작!'
first.author = 'JJJ'
first.content = '파이썬 기반인 장고는 처음 시작하기 좋은 프레임워크!'
print(first)

5월 1일 : 알고리즘을 풀고 개인과제 해설을 들었다.

5월 2일 : 알고리즘 풀고 팀원들과 GIt 하면서 몰랐던거 정리.

5월 3일 : 알고리즘 풀기.

5월 4일 : 알고리즘 풀기, 후발대 강의

 

이번주는 AWS를 공부했는데 에버노트에 따로 정리를 해두었다.

그리고 무엇보다 급한것은 내일부터 시작되는 팀 과제. AWS는 배포니까 큰 비중을 두지 않았다.

주말동안 장고 복습을 하고 DRF도 보려고 했는데, 장고 공부가 너무 안되있어서 오래걸렸다.

집중력도 엄청 짧았다. DRF 공부 할 때 열심히 정리해서 그나마 다행이다.

강의를 또 보는 것은 비효율 적이라 한번 공부 할 때 잘 정리해 두고

코드를 한번 더 보면서 모르는 것을 찾아보는게 더 좋을 것 같다.

파이썬 음수 나눗셈
5 // -2 = -3
5 // 2 = 2
 
Git
git diff = 파일 변경 사항 확인.
git log = 커밋 목록 확인. q 누르면 나가기.
git add (특정 폴더 파일) = 특정 파일만 add
git status = 스테이지 확인.
git remote = 현재 원격저장소 확인.
git remote -v = 현재 원격저장소 url 확인
git fetch = 병합을 해주지 않지만 로컬로 가져온다.
git pull = 병합을 하면서 로컬로 가져온다.
 
 
*
클론을 하게 되면 자동으로 원격저장소가 추가 된다.
*
 
*
강민철 튜터님의 조언
배우면 바로 실습을 해야 기억에 남는다.
 
최단 경로 찾기 문항
- 다익스트라 알고리즘
- 벨만 포드 알고리즘
그래프, 트리
- 이를 활용한 완전탐색 (bfs, dfs)
- 비트마스킹
*
 
후발대 강의
permission class = 뷰에 접근 할 수 있는 권한을 설정 할 수 있다.
 
기본값 설정 = view 전체에 접근 할 수 있는 권한을 설정 할 수 있다.
 
view내부 권한 vs 기본값 = view내부 권한이 더 높다.
 
permissions 커스터마이징 = 퍼미션즈 파일을 만들어서 복붙을 하고 커스터마이징을 한다.
 
부족한 금액 계산하기
 
"""""
성우님
def solution(price, money, count):
    answer = 0
    num = 0
    pricecount = 0
    while num < count:
        num += 1
        pricecount += price * num
    answer += pricecount - money
    if money < pricecount:
        return answer
    elif money >= pricecount:
        return 0
print(solution(3,20,4))
"""
"""
재준님
def solution(price, money, count):
    answer = -1
    sum_price = 0
    for i in range(1,(count+1)):
        sum_price += price*i
        if sum_price > money:
            answer=sum_price-money
        else:
            answer=0
    return answer
    while count > 1:
"""​
while의 조건 부분이 num이 4가 되면 while이 멈추게 된다.
sorted key lambda
출처 https://daeun-computer-uneasy.tistory.com/74?category=983126
  • 최빈값 구하기
def solution(array):
    answer = 0
    a_dict = {}
    for i in array:
        if i not in a_dict:
            a_dict[i] = 1
        else:
            a_dict[i] += 1
    
    sorted_a = sorted(a_dict.items(),reverse=True,key=lambda x:x[1])
    if len(sorted_a) > 1:
        if sorted_a[0][1] != sorted_a[1][1]:
            answer = sorted_a[0][0]
        else:
            answer = -1
    else:
        answer = sorted_a[0][0]
    return answer
문제를 잘 봐야한다. answer는 최빈값을 구하는 것이다. 최빈값의 빈도수를 구하는게 아니라!

 

배열 두 배 만들기
def solution(numbers):
    answer = []
    for i in numbers:
        answer.append(i * 2)
    return answer
 
배열 뒤집기
def solution(num_list):
    answer = []
    for i in range(len(num_list)):
        answer.append(num_list[(len(num_list)-1)-i])
    return answer
 
문자열 뒤집기
def solution(my_string):
    answer = ''
    for i in range(len(my_string)):
        answer += my_string[(len(my_string)-1)-i]
    return answer
 
가위 바위 보
def solution(rsp):
    answer = ''
    for i in rsp:
        if i == '2':
            answer += '0'
        elif i == '0':
            answer += '5'
        else:
            answer += '2'
    return answer
 
  • 점의 위치 구하기
def solution(dot):
    answer = 0
    if dot[0] > 0 and dot[1] > 0:
        answer = 1
    elif dot[0] < 0 and dot[1] > 0:
        answer = 2
    elif dot[0] < 0 and dot[1] < 0:
        answer = 3
    elif dot[0] and dot[1] < 0:
        answer = 4
    return answer
 
  • 최댓값 만들기 (1)
def solution(numbers):
    answer = 0
    numbers.sort(reverse=True)
    answer = numbers[0] * numbers[1]
    return answer
 
문자열 정렬하기
def solution(my_string):
    answer = []
    for i in my_string:
        if i in ['0','1','2','3','4','5','6','7','8','9']:
            answer.append(int(i))
            answer.sort()
    return answer
 
중복된 문자 제거
def solution(my_string):
    answer = ''
    for i in my_string:
        if i not in answer:
            answer += i
    return answer
 
대문자와 소문자
def solution(my_string):
    answer = ''
    for i in my_string:
        if i.islower():
            answer += i.upper()
        else:
            answer += i.lower()
    return answer
인덱스 바꾸기
def solution(my_string, num1, num2):
    answer = ''
    a_list = list(my_string)
    a_list[num1],a_list[num2] = a_list[num2],a_list[num1]
    answer = ''.join(a_list)
    return answer
  • 배열의 유사도
def solution(s1, s2):
    answer = 0
    for i in s1:
        if i in s2:
            answer += 1
    return answer
숫자 찾기
def solution(num, k):
    answer = 0
    if str(k) in str(num):
        answer += (str(num).index(str(k))+1)
    else:
        answer += -1
    return answer​
문자열 정렬하기 2
def solution(my_string):
    answer = ''
    a = sorted(my_string.lower())
    b = ''.join(a)
    answer = b
    return answer
머쓱이보다 키 큰 사람
def solution(array, height):
    answer = 0
    for i in array:
        if height < i:
            answer += 1
    return answer

+ Recent posts