0322 TIL

looggi·2023년 3월 22일
0

TILs

목록 보기
42/114
post-thumbnail

django

  1. Django settings에서 DB 스택을 변경하는 방법은 무엇입니까?

settings.py의 DATABASES에 'default'를 키값으로 가지는 nested dictionary를 만들어서 engine 및 기타 필요한 필드를 작성해준다

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'mydatabase',
    }
}

https://docs.djangoproject.com/en/4.1/ref/settings/#databases

  1. Django 프로젝트를 배포할 때, 노출되어서는 안되는 값은 어떤 것이 있습니까?

django의 secret_key, 유저의 개인정보, jwt 시크릿키가 있습니다. 소셜 로그인이나 결제등 기타 API를 사용한다면 해당 API를 사용하기 위해 필요한 키 또한 노출되어선 안되고 sqlite가 아닌 postgresql이나 mysql을 사용한다면 DB 접근에 사용되는 DATABASES username과 password 또한 노출이 되면 안된다

  1. Django 프로젝트를 배포할 때, 시크릿키를 노출하지 않는 방법에 대해서 설명하시오

환경변수로 설정하여 os.environ으로 불러오는 방법, .env 파일을 만들어 관리하는 방법이 있습니다

https://velog.io/@aboutjoo/Django-50%EB%AC%B8-50%EB%8B%B5-5

프로그래머스 문제 풀기

➡️ 체육복

def solution(n, lost, reserve):
    res=list(set(reserve)-set(lost))
    los=list(set(lost)-set(reserve))
    for r in res:
        if r-1 in los:
            los.remove(r-1)
        elif r+1 in los:
            los.remove(r+1)
    return n-len(los)

처음에 res와 los가 아니라 원래 변수에 그대로 넣었는데..
그러면 lost값이 이미 바뀌어버린 reserve값으로 계산이 되어서 엄청나게 실패하게된다
정말 가끔 너무 댕청댕청해서 놀랍다..

def solution(n, lost, reserve):
    res=list(set(reserve)-set(lost))
    los=list(set(lost)-set(reserve))
    cnt=0
    for l in los:
        if l-1 in res:
            res.remove(l-1)
        elif l+1 in res:
            res.remove(l+1)
        else:
            cnt+=1
    return n-cnt

for문을 los로 돌리든 res로 돌리든 상관없다
단지 for문에 사용하는 리스트에 대해서 remove연산을 하지 않으면 된다
만약에 그렇게 되면 삭제한 삭제한 리스트가 반영돼서 값을 빼먹게된다

➡️ 체육복 다른 사람 풀이

def solution(n, lost, reserve):
    answer = 0 
    answer = n - len(lost)
    for i in lost:
        if reserve.count(i) > 0:
            reserve.remove(i)
            answer += 1
        elif reserve.count(i-1) > 0:
            reserve.remove(i-1)
            answer += 1
        elif reserve.count(i+1) > 0:
            reserve.remove(i+1)
            answer += 1

    return answer

set을 쓰지 않고도 자기 reserve와 lost에 공통으로 있는 경우를 걸러낼 수 있는 다른 방법을 사용한 예시라 가져와봤는데..
근데 이렇게되면 lost와 reserve에 공통으로 있는 i가 이전의 i-1이나 i+1과 동일한 값이 될 경우 먼저 삭제되어 문제의 조건에 위배된다 이렇게 하려면 같은 걸 걸러내는 for문만 먼저 돌린 후에 다른 for문으로 i-1과 i+1를 걸러야한다
그리고 answer도 뭔가 이상하고해서.. 돌려보니 틀린 답안이었다 ㅎㅅㅎ 그래도 아이디어는 좋아서

def solution(n, lost, reserve):

    lost.sort()
    reserve.sort()
    answer=[]
    for i in lost:
        if reserve.count(i):
            reserve.remove(i)
            answer.append(i)
    for a in answer:
        if a in lost:
            lost.remove(a)
            
    answer=0
    for i in lost:        
        if reserve.count(i-1):
            reserve.remove(i-1)
            answer += 1
        elif reserve.count(i+1):
            reserve.remove(i+1)
            answer += 1
            
    return n-(len(lost)-answer)

우선 lost나 reserve모두 순서가 정렬되어있는지 확인할 수가 없기때문에 정렬해줬고,
처음 for문에서 공통된 i값을 찾을 때 그 값을 lost에서도 삭제해야하기 때문에 answer변수에 i값을 저장해뒀다가 이후 for문에서 삭제시켜주고, 같은 값은 이미 빠진 상태이므로 answer=0으로 다시 초기화해줘야한다
이거 고치면서 내가 왜 이코드를 고치고 있지??? 하는 생각이 들지만 그래도 고치니 뿌듯하닿ㅎㅎ

탐욕법

그리디 알고리즘
현재 상황에서 가장 좋은 것을 고르는 알고리즘

  • 문제가 여러 단계로 분해되는 경우 그 단계마다 가장 좋은 선택을 한다
  • 단계별 최선의 선택이므로 모든 단계별 최적의 해는 다를 수 있다

조건

  • 탐욕스런 선택 조건
    각각의 단계의 선택이 다른 단계의 선택에 영향을 주지 않아야한다(wiki)
    단계별 선택이 전체 문제의 최적해를 반드시 도출할 수 있어야 한다
    둘이 다른데???????

  • 최적 부분 구조 조건:
    주어진 상위의 값이 하위 값의 배수일 것
    문제에 대한 최종 해결 방법이 부분 문제에 대해서도 또한 최적의 해결 방법일 것

그리디로 푸는 문제는 전체 문제의 스케일에서 봤을 때 그리디 알고리즘이 최적의 해여야 한다

항상 최적의 결과를 도출하는 것은 아니지만, 최적에 근사한 값을 빠르게 도출할 수 있어서 근사 알고리즘으로 사용할 수 있다

예시

  • 매트로이드matroid

    탐욕 알고리즘을 적용해도 언제나 최적해를 구할 수 있는 문제

  • 도둑 ❌

    매 순간 최적이라 생각되는 해답을 도출하지만 최종 해답이 항상 최적의 해답은 아니다

  • NP - 완전 문제

    NP: 판정 문제의 집합
    하나의 P가 NP에 속하게 되면 전체가 NP에 속하게 되고 P=NP형태로 풀 수 있으며 하나의 P라도 NP에 속하지 않으면 반례가 되어 P≠NP의 형태로 풀어야한다

    • 항목이 적을 때는 알고리즘이 빠른데, 항목이 늘어나면 갑자기 느려진다.
    • 더 작은 하위 문제로 변환 할 수 없어서 X의 가능한 모든 버전을계산 할때
    • 집합 커버링 문제나 외판원 문제로 재정의 할 수 있다
  • 집합 커버링 문제

    전체 집합 U와 그 부분집합들 Si를 원소로 갖는 집합 F에 대해서 F의 원소인 Si들을 합집합하여 전체 집합 U와 같아지는 집합 Si들의 최소 개수를 찾는 문제

    • if F에 있는 집합들의 모든 조합을 하나씩 찾을 경우 :
      → 2^n - 1개의 경우의 수가 나오게 되어 최적의 해를 찾는 것이 실질적으로 어렵게 됨
    • 최적의 해 대신 최적해에 근사한 값을 찾는다
      → U에 있는 원소를 가장 많이 커버하는 Si반복적으로 찾아서 포함시키는 방식을 사용

https://hanamon.kr/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%83%90%EC%9A%95%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-greedy-algorithm/
https://velog.io/@contea95/%ED%83%90%EC%9A%95%EB%B2%95%EA%B7%B8%EB%A6%AC%EB%94%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
https://kahee.github.io/algorithm_datastructure/2018/03/14/Algorithm_greedy_alogrithm/
https://caniro.tistory.com/242

profile
looooggi

0개의 댓글