TIL_230912

Sol Lee·2023년 9월 19일
0

오늘 한 일

프로그래머스 알고리즘 문제 풀기

# 가장 가까운 같은 글자

# 문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
# 문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.

# 내 코드
def solution(s):
    answer = [-1]
    for i in range(1,len(s)):
        string = s[:i]
        index = [j for j, c in enumerate(string) if c == s[i]]
        if index == []:
            answer.append(-1)
        else:
            answer.append(i - max(index))    

    return answer



# 푸드 파이트 대회

# 예를 들어, 3가지의 음식이 준비되어 있으며, 칼로리가 적은 순서대로 1번 음식을 3개, 2번 음식을 4개, 3번 음식을 6개 준비했으며, 
# 물을 편의상 0번 음식이라고 칭한다면, 두 선수는 1번 음식 1개, 2번 음식 2개, 3번 음식 3개씩을 먹게 되므로 음식의 배치는 "1223330333221"이 됩니다. 
# 따라서 1번 음식 1개는 대회에 사용하지 못합니다.

# 수웅이가 준비한 음식의 양을 칼로리가 적은 순서대로 나타내는 정수 배열 food가 주어졌을 때, 
# 대회를 위한 음식의 배치를 나타내는 문자열을 return 하는 solution 함수를 완성해주세요.

# 내 코드
def solution(food):
    answer_l = ''
    for i in range(len(food)):
        if food[i] <= 1:
            continue
        else:
            num = food[i] // 2
            answer_l +=  str(i) * num # 0인 물을 기준은로 left구하고 뒤집어서 right로 붙임
    answer_r = answer_l[::-1]
    return answer_l + '0' + answ



# 콜라 문제

# 콜라를 받기 위해 마트에 주어야 하는 병 수 a, 빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수 b, 
# 상빈이가 가지고 있는 빈 병의 개수 n이 매개변수로 주어집니다. 
# 상빈이가 받을 수 있는 콜라의 병 수를 return 하도록 solution 함수를 작성해주세요.

# 내 코드
def solution(a, b, n):
    answer = 0

    while n >= a:    
        r, c = divmod(n, a) # 지금 가진 콜라/마트 반납할 콜라 
        result = r * b # 돌려받은 콜라
        answer += result # 실제 받은 콜라를 저장 
        n = c + result # 남은 콜라 + 돌려받은 콜라

    return answer

Django 프로젝트

오늘 진행 작업
- 기존 유저 모델 AbstractUser 확장
- 메인페이지 → 작성페이지 링크
- 작성페이지에서 장소이름, 내용, 사진 Post 기능 추가
- 이미지 추가/이미지 미리보기/미리보기 삭제 추가
- 메인에서 div 영역 클릭시 페이지 이동 하도록

이미지 추가

  1. app과 동일한 위치에 media 폴더 추가

  2. settings.py에 경로 추가

    import os 
    
    MEDIA\_URL = '/media/' 
    MEDIA\_ROOT = os.path.join(BASE\_DIR, 'media')
  3. models.py 에 이미지 필드 정의

    ... 
    image = models.ImageField(upload_to="images/", blank=True, null=True)
  4. view.py에 post 메소드 추가

    ... 
    mypost.image = request.FILES['image'] 
    mypost.save() 
    
    # 이미지 공백 시 에러 발생 방지하고 싶다면 아래처럼 
    try: 
        mypost.image = request.FILES['image'] 
    except: 
        mypost.image = None 
    
    # blank=True, null=True 값 줬는데 왜 안 되는지는 모르겠음...
  5. makemigration, migrate

  6. html 파일 수정

    <form action="/경로/" method="post" enctype="multipart/form-data"> 
    ... 
        <input type="file" class="form-control" id="image" name="image">

이미지 미리보기 추가하기

<form method="post" enctype="multipart/form-data">
    ...

    <h5 class="card-title"> 사진 추가 </h5>
    <div class="input-group mb-3">
            <!-- 이미지 추가 버튼 -->
        <input type="file" class="form-control" id="image" name="image"
               accept="image/*" onchange="loadFile(event)">
            <!-- 이미지 삭제 버튼 - 기본적으로 display: none -->
        <button type="button" id="delete_btn" class="btn btn-dark" style="display: none; border-radius: 0px 5px 5px 0px;">
            X
        </button>
    </div>
    <div class="mb-2">
            <!-- 이미지가 보여질 곳 - 기본적으로 display: none -->
        <img id="output" style="width: 600px; height: 400px; display: none;"/>
        <script>
            <!-- 이미지 미리보기 메소드 -->
            var loadFile = function(event) {
              var output = document.getElementById('output');
              var d_btn = document.getElementById('delete_btn');
              output.style.display = "";
              d_btn.style.display = "";
              output.src = URL.createObjectURL(event.target.files[0]);
              output.onload = function() {
                URL.revokeObjectURL(output.src)
              }
            };
            <!-- 이미지 미리보기 삭제 메소드 -->
            document.getElementById("delete_btn").onclick = function () {
                var fileInput = document.getElementById('image');
                var d_btn = document.getElementById('delete_btn');
                var output = document.getElementById('output');
                fileInput.value = '';
                d_btn.style.display = 'none';
                output.style.display = 'none';
            };
        </script>
    </div>

기존 유저 모델 AbstractUser 확장

  1. AbstractUser 유저모델 확장

    # user/models.py
    from django.db import models
    from django.contrib.auth.models import AbstractUser
    
    class UserModel(AbstractUser): # AbstractUser 기존 user 모델에 이미 정의된 필드 그냥 가져다 쓸 수 있음
        class Meta:
            db_table = "my_user"
  2. setting.py에 AUTH_USER_MODEL추가

    # setting.py
    AUTH_USER_MODEL = 'user.UserModel'
  3. 터미널에서 마이그레이션

    python manage.py makemigrations
    python manage.py migrate

참고
https://ghqls0210.tistory.com/33
https://stackoverflow.com/questions/4459379/preview-an-image-before-it-is-uploaded

profile
직업: 개발자가 되고 싶은 오레오 집사

0개의 댓글