level 1. 핸드폰번호 가리기

|

level 1. 핸드폰번호 가리기

출처

문제

별이는 헬로월드텔레콤에서 고지서를 보내는 일을 하고 있습니다. 개인정보 보호를 위해 고객들의 전화번호는 맨 뒷자리 4자리를 제외한 나머지를 "*"으로 바꿔야 합니다.
전화번호를 문자열 s로 입력받는 hide_numbers함수를 완성해 별이를 도와주세요
예를들어 s가 "01033334444"면 "*******4444"를 리턴하고, "027778888"인 경우는 "*****8888"을 리턴하면 됩니다.

풀이 (python)

#풀이 1 - slice 활용
def hide_numbers(s):
    return (len(s)-4)*'*'+s[-4:] # slice 시간복잡도 O(N)

# 풀이 2
def hide_numbers(s):
    return s.replace(s[:-4], '*'*(len(s)-4))

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print("결과 : " + hide_numbers('01033334444'));

다른사람 풀이

def hide_numbers(s):
    #함수를 완성해 별이를 도와주세요
    return "*"*(len(s)-4) + s[-4:]

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print("결과 : " + hide_numbers('01033334444'));

배운점

  • 문제를 풀면 바로 풀이를 보지 말고, 더 효율적으로 접근하는 방법에 대해서 한번 더 고민해보자.

170304_TIL

|

오늘 한 일

  • django 강의 를 들었다. 강의에서 2번째 프로젝트를 시작했는데, 반복적으로 진행되는 내용이라 크게 어려움은 없이 들을 수 있었다. 강의를 듣는 방식도 처음은 실습을 하면서 듣고 두번째는 블로그에 정리하면서 다시 듣는 패턴으로 고정되고 있다. 아직까지는 괜찮은 것 같은데 더 나에게 맞는 방법을 찾아나가야겠다.
  • 파이썬으로 기초 알고리즘 문제를 풀었다. 어제 점프투파이썬 문자열 자료형 부분을 읽었더니 응용할 부분이 많이 있었다. 문법책을 일독할 이유가 하나 더 생긴 기분이다.
  • 친구 만나러 도서관에 갔다가 추천받은 책 2권을 빌렸다. 기초 튼튼 코드 튼튼 다 함께 프로그래밍, 그림으로 배우는 HTTP & Network Basic 시간을 내서 전체 내용을 훑어봐야겠다.
  • tryhelloworld 에서 정규표현식 강의를 들었다. 기본적인 내용이 간단하게 설명되어 있었는데, django에서 url 패턴을 입력할때나, 알고리즘 문제를 풀다 보면 정규표현식이 아주 유용하게 쓰일 때가 많아서 더 익혀두고 싶다. 점프투파이썬 정규표현식 부분과 RegExr 사이트를 활용해야겠다.

내일 할 일

  • 장고강의 듣기
  • 점프투파이썬 읽기 (정규표현식)
  • 장고걸스 가이드 읽기 시작하기 (읽자..!)
  • 친구 만나기

django 06. 두번째 장고앱 4 - admin 페이지 사용하기

|

django 06. 두번째 장고앱 4 - admin 페이지 사용하기

파이썬 웹 프로그래밍 - Django로 웹 서비스 개발하기

admin 페이지를 통해서 모델 클래스에 데이터를 추가, 저장한다.

superuser 생성 및 admin.py 등록

  1. manage.py createsuperuser 명령어를 통해서 계정 생성
  2. admin.py에 모델클래스 추가
from .models import Question, Choice


admin.site.register(Question)
admin.site.register(Choice)

admin 사이트에서 데이터 등록

  • admin 사이트에서 Question 모델 클래스와 Choice 모델 클래스에 데이터를 추가한다. (http://127.0.0.1:8000/admin/)
  • Choice 모델클래스는 Question id를 foreignKey로 갖고 있기 때문에 데이터 입력시 Question 데이터가 선택지로 나온다.
question = models.foreignKey(Question, on_delete = models.CASCADE)
admin-choice
admin 데이터 입력화면

django 06. 두번째 장고앱 3 - shell로 모델 조작하기

|

django 06. 두번째 장고앱 3 - Shell로 모델 조작하기

파이썬 웹 프로그래밍 - Django로 웹 서비스 개발하기

models.py 코드 - Question 모델클래스

from django.db import models
from django.utils import timezone
import datetime

# Create your models here.
class Question(models.Model): # 항상 Model 클래스를 상속받는다
    #pk 는 자동으로 생성
    question_text = models.CharField(max_length = 200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        # 날짜가 최근 24시간 이내 작성된거라면 True를 리턴한다.
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

Shell을 사용하여 Question 클래스 모델에 데이터를 추가, 저장한다.

  • 모델클래스에 __Str__ 메소드를 오버라이딩하여 해당 클래스의 대표 이름 값을 설정할 수 있다.
  • timedelta 클래스 : 시간의 연산을 가능하게 해주는 클래스 (datetime 모듈의 클래스)
>>> python manage.py shell #shell 실행
>>> from polls.models import Question, Chice #모델클래스 임포트
>>> from django.utils import timezone #타임존 모듈 임포트
>>> q = Question(question_text='최고의 고기는?', pub_date = timezone.now()) # 데이터추가
>>> q.save() # 데이터 저장
>>> q.objects.all() # 모델 데이터 전체 출력

모델클래스.objects.filter()

  • 복수 검색, range 검색, 부분 검색, 범위 검색
  • 조건에 맞는 데이터를 리스트로 가져온다. (하나가 나오더라도 리스트로 감싼다)
  • 검색 조건 :
>>> Question.objects.filter(id=1)
<QuerySet [<Question: 최고의 고기는?>]> # 리스트로 출력

>>> Question.objects.filter(pk=1) # id=1 과 동일
>>> Question.objects.filter(question_text__startswith = '최') # question_text가 '최'로 시작하는 데이터

models.py 코드 - Choice 모델클래스

from django.db import models
from django.utils import timezone
import datetime

class Choice(models.Model):
    # 질문을 삭제 했을 때 연관 항목을 어떻게 할지 설정 - 자동 삭제
    question = models.ForeignKey(Question, on_delete = models.CASCADE)
    choice_text = models.CharField(max_length = 200)
    votes = models.IntegerField(default = 0)

    def __str__(self):
        return self.choice_text

Shell을 사용하여 Choice 클래스 모델에 데이터를 추가, 저장한다.

  • Question 클래스 모델과는 다른 방식으로 데이터를 추가한다.
  • Choice는 Question 오브젝트에 연관 지어진 오브젝트이다.
  • choice_set을 Question 오브젝트로 부터 만들어줘야 한다. (소문자 주의)
>>> q
<Question: 최고의 고기는?>
>>> q.choice_set.all() # 모델 설계시에 이미 연결을 했기 때문에 choice_set이 존재한다.
<QuerySet []>
>>> q.choice_set.create() #q(최고의 고기라는 데이터)에 연결된 choice 오브젝트 1개를 만든다.
>>> q.choice_set.create(choice_text = '돼지')
>>> q.choice_set.create(choice_text = '닭')
>>> q.choice_set.create(choice_text = '소')

>>> q.choice_set.all()
<QuerySet [<Choice: 돼지>, <Choice: 치킨>, <Choice: 소>]>

>>> Choice.objects.all() # 이렇게는 연관성을 알 수 없어서 잘 사용하지 않는다.
<QuerySet [<Choice: 돼지>, <Choice: 치킨>, <Choice: 소>, <Choice: 짜장>, <Choice: 짬뽕>]>

level 1. 문자열 내 p와 y의 개수

|

level 1. 행렬의 덧셈

출처

문제

numPY함수는 대문자와 소문자가 섞여있는 문자열 s를 매개변수로 입력받습니다. s에 ‘p’의 개수와 ‘y’의 개수를 비교해 같으면 True, 다르면 False를 리턴하도록 함수를 완성하세요. ‘p’, ‘y’ 모두 하나도 없는 경우는 항상 True를 리턴합니다. 예를들어 s가 “pPoooyY”면 True를 리턴하고 “Pyy”라면 False를 리턴합니다.

풀이 (python, Javascript)

python

def numPY(s):
    s = s.lower()
    p_list = []
    y_list = []
    if 'p' in s or 'y' in s:
        for v in s:
            if v == 'p':
                p_list.append(v)
            elif v == 'y':
                y_list.append(v)
            else:
                pass
        return len(p_list) == len(y_list)
    else:
        return True

Javascript

function numPY(s){
  var result = false;
 	var p = /p/gi;
  var y = /y/gi;

	if ((s.match(p).length === s.match(y).length) || (s.match(p), s.match(y) === null)){
      	result = true;
      }
  return result;
}


// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log( numPY("pPoooyY") )
console.log( numPY("Pyy") )

다른사람 풀이

python

def numPY(s):
    return s.lower().count('p') == s.lower().count('y')

Javascript

function numPY(s) {
  return s.match(/p/ig).length == s.match(/y/ig).length;
}

느낀 점

자바스크립트

  • 정규표현식을 공부해야겠다.

파이썬

  • 메소드, 함수를 훑어봐야겠다.