반응형

 

안녕하세요 Henry입니다!

 

오늘은 간단한 사칙연산 중 덧셈에 대한 풀이를 요구하는 문제를 풀어보았습니다.

 

특별히 타입힌팅에 대한 간략한 예시도 함께 넣어놓았는데요.

 

코드 보시면서 도움이 되시길 바랍니다ㅎㅎ

 

def solution(num1: int, num2: int) -> int:
    return num1 + num2

 

아래는 문제 풀이 영상입니다.

https://youtu.be/jPtpqa3ApP8

 

- YouTube

 

www.youtube.com

 

반응형
반응형

 

스타의 풀이

def solution(id_list, report, k):
    answer = [0] * len(id_list)    
    reports = {x : 0 for x in id_list}

    for r in set(report):
        reports[r.split()[1]] += 1

    for r in set(report):
        if reports[r.split()[1]] >= k:
            answer[id_list.index(r.split()[0])] += 1

    return answer

 

나의 코드

from dataclasses import dataclass
from typing import List, TypeVar

T = TypeVar('T')

@dataclass
class User:
    id: str
    targets: List[T]
    report_count: int = 0
    
    def __init__(self, id):
        self.id = id
        self.targets = list()
    
    def report_count_increment(self):
        self.report_count += 1
        
    def append_target(self, user: T):
        self.targets.append(user)
        
    def is_out(self, k: int) -> bool:
        if self.report_count >= k:
            return True
        return False
    


def solution(id_list, report, k):
    answer = []
    
    users = list()
    report = set(report)
    
    for id in id_list:
        users.append(User(id=id))
    
    for re in report:
        splited_report = re.split(' ')
        user = get_user_by_id(users, splited_report[0])
        target = get_user_by_id(users, splited_report[1])
        target.report_count_increment()
        user.append_target(target)
    
    for user in users:
        cnt = 0
        for target in user.targets:
            if target.is_out(k):
                cnt += 1
        answer.append(cnt)

    return answer

def get_user_by_id(users: List[User], id: str):
    for user in users:
        if user.id == id:
            return user

 

 

느낀 점

더보기

find처럼 특정 키워드를 가지고 인덱스를 가져오는 list.index() 메소드에 대해서 새롭게 배웠다.

반응형
반응형

 

안녕하세요~~!!ㅎㅎ

알고리즘을 공부하는 개발자 Henry입니다!

 

오늘은 프로그래머스의 "신규 아이디 추천" 이라는 문제를 풀어보았습니다!

 

2021 카카오 블라인드 채용 코딩테스트에 출제되었던 문제인데요,

카카오 치고는 쉬운 난이도여서 모두 어려움 없이 푸실 수 있었을 것 같습니다!

 

아래는 제가 문제를 푼 코드입니다.

def solution(new_id):
    import re
    answer = ''
    new_id = new_id.lower() # 1 단계
    new_id = re.sub(r"[^a-z0-9-_.]","",new_id) # 2 단계
    while new_id.replace("..",".") != new_id:
        new_id = new_id.replace("..",".") # 3 단계
    
    # 4 단계
    while len(new_id) > 0 and new_id[0] == ".": 
        new_id = new_id[1:]
    while len(new_id) > 0 and new_id[-1] == ".":
        new_id = new_id[:-1]
    
    # 5 단계
    if new_id == "":
        new_id += "a"
    # 6 단계
    if len(new_id) >= 16:
        new_id = new_id[:15]
        while new_id[-1] == ".":
            new_id = new_id[:-1]
    # 7 단계
    while len(new_id) < 3:
        new_id += new_id[-1]
           
    return new_id

 

문제에서 여러가지 단계를 나열해주고 있는데,

해당 단계들을 코드로만 정확하게 변환해주면 되는 쉬운 문제였습니다.

 

Level 1문제를 이렇게 큰 어려움 없이 풀 수 있는데,

아직 Level 2~3에는 관련 알고리즘 방법들을 빠르게 파악하는 것과,

정확한 알고리즘 원리를 이해하는 것이 선행되어야 할 것 같다는 생각을 하였습니다.

 

아래는 제가 문제를 설명한 영상입니다!

https://youtu.be/WlAGJjrcKkA

 

 

앞으로도 열심히 공부해야겠습니다!ㅎㅎ

다들 화이팅!

반응형
반응형

 

 

안녕하세요

알고리즘을 좋아하는 개발자 Henry입니다!ㅎㅎ

 

최근에 회사를 다니면서 바쁘고 피곤해서 코딩 문제를 못풀었었는데,

다시 조금씩 풀어보려고 키보드를 잡았습니다!

 

오늘은 프로그래머스에서 동적계획법을 사용해서 푸는 문제를 풀어보았습니다.

N으로 표현이라는 문제를 처음 접했을 때,

아래와 같이 풀었습니다.

 

def solution(N, number):
    answer = 0
    li = []
    dynamic(N,N,number, li, 1)
    return min(li) if len(li) != 0 else -1

def dynamic(N, cur, number, li, cnt):
    if cnt > 8:
        return
    if number == cur:
        li.append(cnt)
        return
    dynamic(N, int(str(cur)+str(N)), number, li, cnt+1) # N->N
    dynamic(N, cur+N, number, li, cnt+1) # N -> +
    dynamic(N, cur-N, number, li, cnt+1) # N -> -
    dynamic(N, cur//N, number, li, cnt+1) # N -> // 소수점은 무시하기 때문에
    dynamic(N, cur*N, number, li, cnt+1) # N -> *

 

 

그러나 위의 코드는 정확도 55점을 받았습니다.

 

알고보니 사칙연산에서 곱셈과 나눗셈을 먼저 계산을 해주는 로직이 빠져 있었습니다.

 

동적계획법을 사용해서 문제를 풀지 않아서 발생하는 이유였습니다.

여기서 잠깐!동적 계획법이란??>> 동적 계획법은 문제를 풀 때 하나의 문제를 여러 하위 문제로 나누어 풀고, 그것들을 결합해서 최종 목적에 도달하는 방식의 알고리즘입니다.

 

찾아보니까 아래의 링크에서 자세하게 설명해주고 있습니다.https://velog.io/@chelsea/1-%EB%8F%99%EC%A0%81-%EA%B3%84%ED%9A%8D%EB%B2%95Dynamic-Programming-DP

 

[자료구조와 알고리즘] 동적 계획법(Dynamic Programming, DP)

동적 계획법(Dynamic Programming) - 컴퓨터 공학 스터디 W1 자료구조와 알고리즘 내용에 앞서 학교에서 컴퓨터 공학 이론 스터디를 진행하고 있습니다. 매주 발표하는 내용을 시리즈로 업로드할 예정

velog.io

 

 

사실 동적계획법에 대해서 정확한 개념을 모르고 있었다.

 

큰 문제를 작게 쪼개어 작은 문제들을 풀어나가는 느낌으로만 이해하고 있었는데,위의 글을 통해서 동일한 작은 문제를 한번씩만 계산하는 원리가 숨어있다는 것을 알게 되었다.

 

그러나 바로 코드에 적용하는 것은 쉽지 않았다.그래서 몇번 고민한 결과 결국 구글링의 도움을 받아 아래 사이트와 동일한 방법으로 문제를 풀게 되었다.

 

https://gurumee92.tistory.com/164

 

프로그래머스 문제 풀이 N으로 표현

이 문제는 이시윤 강사님의 프로그래머스 강좌 "파이썬을 무기로, 코딩테스트 광탈을 면하자!"를 보고 정리한 내용입니다. 문제 URL N으로 표현 Contents 문제 지문 파악하기 강사님의 알고리즘 풀

gurumee92.tistory.com

def solution(N, number):
    answer = -1
    if number == N:
        return 1
    
    _li = [set() for i in range(8)]
    for i in range(len(_li)):
        _li[i].add(int(str(N)*(i+1)))
        
    for i in range(1,8):
        for j in range(i):
            for op1 in _li[j]:
                for op2 in _li[i-j-1]:
                    _li[i].add(op1+op2)
                    _li[i].add(op1-op2)
                    _li[i].add(op1*op2)
                    if op2 != 0:
                        _li[i].add(op1//op2)
        if number in _li[i]:
            answer = i+1
            break
    
    return answer

 

 

이번 기회를 통해서 동적계획법에 대해서 조금 더 알게 된 것 같아서 감사했다.

앞으로도 꾸준히 코딩 문제를 풀고 싶고, 알고리즘 공부를 하고 싶다.

 

 

반응형
반응형

안녕하세요

알고리즘을 공부하는 개발자 Henry입니다.

 

오늘은 Django를 통해 웹 서버를 띄우고 간단한 화면을 출력해보겠습니다.

 

 

 

우선 저는 Ubuntu에서 진행하기 때문에

별도의 환경과는 다른 점 양해 부탁드립니다.

 

저는 아래 블로그를 참고하여 실습을 진행하였습니다.

velog.io/@maryoh2003/Django%EB%A1%9C-%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-kwk5p8orbd

 

Django로 웹페이지 만들기

python-django-logo.jpg 프로젝트 생성 및 준비 1. 프로젝트 생성 2. 프로젝트 폴더로 이동 3. 하위 프로그램(서브 앱) 생성 4. DB(sqlite3) 파일 생성 5. 관리자 계정 생성 6. 서버 실행 환경 설정 > 프로젝트

velog.io

 

 

1. 프로젝트 생성 및 준비

>> django-admin startproject <ProjectName>

>>  cd <ProjectName> 프로젝트 폴더로 이동

>> python manage.py startapp <AppName> 하위 프로그램(서브 앱) 생성

 

 

2. 프로젝트 이름을 mytestsite라고 하고, 서브 앱 이름을 eating이라고 지었습니다.

먼저 settings.py 파일 안에 있는 INSTALLED_APPS에서 내가 만든 서브 앱 이름을 추가해야 합니다.

 

3. 언어를 한국어로 설정하고 (기본은 영어로 되어 있다) 시간대를 한국으로 맞춥니다.

 

 

 

 

4. 다음은 path를 추가해주는데, <서브앱.urls>를 해주면 된다.

url을 분리해준다고 생각하면 된다. 하지만 서브앱 폴더에는 urls라는 파일이 없기 때문에 만들어줘야 한다.

 

 

5. 서브앱 main에서 urls.py라는 파일을 만들어 admin과 path를 import해주면 된다.

urlpatterns에는 위에 프로젝트 폴더 urlpatterns와 동일한 문법으로 경로들을 추가해 줄 수 있다.

 

 

6. 이제 본격적으로 페이지를 만들어 봅시다~!

 

✅ 먼저 서브앱 main안에 templates라는 폴더를 만들고, 또 그 안에 main(서브앱과 같은 이름의 폴더)이라는 폴더를 만든다.
✅ 그 안에 원하는 이름의 파일을 만들고 코드를 작성하면 된다.

 

 

 

아래는 index.html 테스트 코드이다.

 

 

 

7. 서브앱 폴더 안에 있는 url.py에서 만든 파일(index)의 경로를 설정해준다.

views.py를 꼭 import 해줘야 한다

 

 

8. views에서는 함수를 작성해주는데, return 함수는 꼭 작성해줘야 한다. 그래야 파일 실행이 가능하다.

 

 

 

9. 서버 실행 함수인 python manage.py runserver를 하면 이렇게 만든 페이지가 뜨는 것을 볼 수 있다.

 

 

 

10. 기본적인 페이지 띄우는 부분 성공이다!

반응형
반응형

안녕하세요~!

 

알고리즘을 공부하는 Henry입니다~

 

오늘은 제가 Django를 공부해보았습니다.

 

이전에는 Flask를 가지고 python 웹 서버를 만들었던 경험이 있는데요

 

이번에는 Django를 한번 다루어보고 싶어 도전하게 되었습니다.

 

 

프로젝트의 이름은 "오늘 뭐 먹지?" 입니다.

 

직장에 다니면서 뭘 먹을지 고민하다가 

먹은 내용들을 웹사이트에 기록해놓으면 좋겠다 싶어서 

주말이 되어 한번 만들어 보려고 합니다.

 

 

 

1. 우선 Django를 설치하기 위해서 AWS에서 Ubuntu 인스턴스를 빌렸습니다.

각자 개발용 윈도우 혹은 Mac을 사용해서 따라해 보셔도 좋을 것 같습니다.

참조:developer.mozilla.org/ko/docs/Learn/Server-side/Django/development_environment

 

Django 개발 환경 세팅하기 - Web 개발 학습하기 | MDN

Django 개발 환경 세팅하기 Jump to sectionJump to section 이제 장고가 무엇인지 알았으니, 윈도우, 리눅스(우분투), 맥 OS X에서 어떻게 장고 개발환경을 세팅하는지, 설치 후에는 어떻게 테스트하는지 

developer.mozilla.org

 

 

2. Ubuntu에 python3를 설치합니다.

장고가 Python 기반 프로젝트이기 때문에 파이썬이 설치되어 있어야 합니다.

>> python3 -V 라고 쳐서 아무것도 안 나오면, 설치하셔야 합니다.

 

>> sudo apt install python3-pip 로 설치해주세요~

 

3. 가상 환경 소프트웨어를 설치해야 합니다.

>> sudo pip3 install virtualenvwrapper

 

 

4. 각자 PC에 환경설정을 담당하는 숨김 파일 (Ubuntu 같은 경우는) bashrc에 들어가서 아래의 내용은 기입합니다.

export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS=' -p /usr/bin/python3 '
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh

 

 

5. 아래 내용을 입력하여 스타트업 파일을 실행시킵니다.

>> source ~/.bashrc

 

그러면 아래와 같이 뜹니다

virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/premkproject
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/postmkproject
...
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/preactivate
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/postactivate
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/get_env_details

 

 

6. 이제 장고를 설치해봅니다.

>> pip3 install django

 

 

7. 설치한 것을 확인해봅시다 (mytestsite라는 폴더를 만들었습니다.)

>> mkdir django_test cd django_test

 

>> django-admin startproject mytestsite

>> cd mytestsite

 

8. 이 폴더 내에서 runserver 명령어와 manage.py 파일을 통해 개발용 웹 서버를 띄울 수 있습니다.

>> python3 manage.py runserver

Performing system checks...

System check identified no issues (0 silenced).

You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

October 26, 2018 - 07:06:30
Django version 2.1.2, using settings 'mytestsite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

 

 

9. 아래와 같이 뜨면 성공입니다!

(웹 브라우저를 띄워서 http://localhost:8000으로 들어가면 됩니다.)

 

 

10. 지금까지 컴퓨터에 파이썬과 Django를 설치하면 기본적인 웹 화면을 띄워보았습니다.

 

반응형
반응형

 

 

문제 설명

n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.

-1+1+1+1+1 = 3

+1-1+1+1+1 = 3

+1+1-1+1+1 = 3

+1+1+1-1+1 = 3

+1+1+1+1-1 = 3

사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
  • 각 숫자는 1 이상 50 이하인 자연수입니다.
  • 타겟 넘버는 1 이상 1000 이하인 자연수입니다.

입출력 예

numbers    target    return

[1, 1, 1, 1, 1] 3 5

입출력 예 설명

문제에 나온 예와 같습니다.

 

 

문제 푸는 방법:

모든 숫자에 +,-를 다 해보는 수밖에 없다.

+1 +1 +1 (?) (?) 이렇게 앞에서 3이 된다고 해도, 뒤에 값이 0이 된다는 보장이 없기 때문이다.

그래서 각 위치에 +/-를 해주어야 한다.

예제에 있어서는 2**5 번의 성능이 발생한다.

 

평균적으로 2**len(numbers) 만큼의 연산을 해야하는 것이다.

 

일단 DFS 로 풀 수 있다.

각 자리수로 들어가면서 해당 값을 +/- 연산을 모두 수행하는 것이다.

그리고 마지막 idx일때, 해당 값이 target과 같다면 result 라는 리스트에 1을 append해주고, target과 다르다면 0을 append 해준다.

==> 나중에 sum(result) 하면 1의 개수를 알 수 있다.

 

아래의 코드에서는 DFS는 재귀로 구현하였다.

정답 코드:

def solution(numbers, target):
    result = []
    DFS(numbers,0,0,target,result)
    return sum(result)

def DFS(arr,idx,current,target,result):
    if idx == len(arr):
        if current == target:
            return result.append(1)
        else:
            return result.append(0)
    DFS(arr,idx+1,current+arr[idx],target,result)
    DFS(arr,idx+1,current-arr[idx],target,result)
    return

 

 

 

반응형
반응형

 

A non-empty array A consisting of N integers is given.

A peak is an array element which is larger than its neighbors. More precisely, it is an index P such that 0 < P < N − 1,  A[P − 1] < A[P] and A[P] > A[P + 1].

For example, the following array A:

A[0] = 1 A[1] = 2 A[2] = 3 A[3] = 4 A[4] = 3 A[5] = 4 A[6] = 1 A[7] = 2 A[8] = 3 A[9] = 4 A[10] = 6 A[11] = 2

has exactly three peaks: 3, 5, 10.

We want to divide this array into blocks containing the same number of elements. More precisely, we want to choose a number K that will yield the following blocks:

  • A[0], A[1], ..., A[K − 1],
  • A[K], A[K + 1], ..., A[2K − 1],
    ...
  • A[N − K], A[N − K + 1], ..., A[N − 1].

What's more, every block should contain at least one peak. Notice that extreme elements of the blocks (for example A[K − 1] or A[K]) can also be peaks, but only if they have both neighbors (including one in an adjacent blocks).

The goal is to find the maximum number of blocks into which the array A can be divided.

Array A can be divided into blocks as follows:

  • one block (1, 2, 3, 4, 3, 4, 1, 2, 3, 4, 6, 2). This block contains three peaks.
  • two blocks (1, 2, 3, 4, 3, 4) and (1, 2, 3, 4, 6, 2). Every block has a peak.
  • three blocks (1, 2, 3, 4), (3, 4, 1, 2), (3, 4, 6, 2). Every block has a peak. Notice in particular that the first block (1, 2, 3, 4) has a peak at A[3], because A[2] < A[3] > A[4], even though A[4] is in the adjacent block.

However, array A cannot be divided into four blocks, (1, 2, 3), (4, 3, 4), (1, 2, 3) and (4, 6, 2), because the (1, 2, 3) blocks do not contain a peak. Notice in particular that the (4, 3, 4) block contains two peaks: A[3] and A[5].

The maximum number of blocks that array A can be divided into is three.

Write a function:

class Solution { public int solution(int[] A); }

that, given a non-empty array A consisting of N integers, returns the maximum number of blocks into which A can be divided.

If A cannot be divided into some number of blocks, the function should return 0.

For example, given:

A[0] = 1 A[1] = 2 A[2] = 3 A[3] = 4 A[4] = 3 A[5] = 4 A[6] = 1 A[7] = 2 A[8] = 3 A[9] = 4 A[10] = 6 A[11] = 2

the function should return 3, as explained above.

Write an efficient algorithm for the following assumptions:

  • N is an integer within the range [1..100,000];
  • each element of array A is an integer within the range [0..1,000,000,000].

    Copyright 2009–2020 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.

 

 

Peaks 문제는 봉우리를 최소 1개씩 포함하고 있는 Block의 개수를 구하는 문제이다.

 

최대 블록의 개수를 Return 해주면 되는데,

그 방법을 구체적으로 어떻게 짜야되는지 다양하게 시도하다가 

결국 답지를 보고 풀었다.ㅜㅜ!!

 

그래도 이 방법 잘 알아두어야겠다.

 

정답 코드

# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")

def solution(A):
    # write your code in Python 3.6
    
    peaks = []
    
    for i in range(1, len(A)-1):
        if A[i] > A[i-1] and A[i] > A[i+1]:
            peaks.append(i)
            
    for i in range(len(peaks),0,-1):
        if len(A) % i == 0:
            block_size = len(A)//i
            block = [False]*i
            block_cnt = 0
            for j in range(len(peaks)):
                idx = peaks[j] // block_size
                if block[idx] == False:
                    block[idx] = True
                    block_cnt += 1
            
            if block_cnt == i:
                return block_cnt
        
    return 0
        
    pass

 

반응형

+ Recent posts