글을 시작하며..

글의 순서

  1. Norm 이란?
  2. L1 Norm
  3. L2 Norm
  4. L1 Norm과 L2 Norm의 차이

 

Norm이란?

Norm은 크기의 일반화로 벡터의 크기(혹은 길이)를 측정하는 방법입니다. 두 벡터 사이의 거리를 측정하는 방법이기도 합니다.

여기서 p는 Norm의 차수를 의미. p = 1이면 L1 Norm. p = 2이면 L2 Norm. n은 해당 벡터의 원소 수.

 

L1 Norm

L1 Norm은 p가 1인 Norm입니다. 공식은 아래와 같습니다.

L1 Norm은 맨허튼 노름(Manhattan norm)이라고도 합니다. L1 Norm은 벡터의 요소에 대한 절댓값의 합입니다.

L1 Norm은 다음과 같은 영역에서 사용됩니다.

  • L1 Regularization
  • Computer Vision

계산되는 방식은 아래와 같습니다.

 

L2 Norm

L2Norm은 p가 2인 Norm입니다. L2 Norm은 n차원 좌표 평면(유클리드 공간(에서의 벡터의 크기를 계산하기 때문에 유클리드 노름(Euclidean norm)이라고도 합니다. L2 Norm은 피타고라스 정리를 활용한 것으로 공식은 아래와 같습니다.

L2 Norm은 다음과 같은 영역에서 사용됩니다.

  • L2 Regularization
  • KNN 알고리즘
  • kmean 알고리즘

계산되는 방식은 아래와 같습니다.

 

L1 Norm과 L2 Norm의 차이

검정색 두 점 사이의 L1 Norm은 빨간색, 파란색, 노란색 선으로 표현될 수 있고, L2 Norm은 오직 초록색 선으로만 표현될 수 있습니다. L1 Norm은 여러 가지 path를 가지지만 L2 Norm은 Unique shortest path를 가집니다.

 

L1 Norm과 L2 Norm을 시각화하면 아래와 같습니다.

이로 인해 L1 Loss와 L2 Loss의 차이가 발생합니다.

대표적으로는 L1 Loss는 0인 지점에서 미분이 불가능하다는 점이고 추가적으로 L1 Loss가 L2 Loss에 비해 Outlier에 대하여 더 Robust(덜 만감 혹은 둔감) 하다고 표현합니다.

 

아래는 L1 Norm과 L2 Norm의 코드입니다.

def l1_norm(x):
	x_norm = np.abs(x)
	x_norm = np.sum(x_norm)
	return x_norm

def l2_norm(x):
	x_norm = x * x
	x_norm = np.sum(x_norm)
	x_norm = np.sqrt(x_norm)
	return x_norm

문제 리뷰

  1. 2021 카카오 블라인드 채용 1차 코딩테스트에서 1번 문제로 나온 문제로 이전에 풀었을 때는 단순하게 문제에서 요구하는 것을 하나씩 구현했습니다.
  2. 이번 부스트캠프를 진행하면서 정규식 관련 수업이 있었습니다. 수업 내용을 조원들과 리뷰하던 중에 팀원분께서 말씀해주셨는데 해당 문제를 정규식으로 해결하면 쉽고 빠르게 풀 수 있다고 해서 공부한 것을 복습하는 겸해서 풀기고 했습니다.
  3. 1차적으로 정규식으로 풀면서 어떻게 해야할 지 몰라서 for문과 if문으로 푼 것도 있었습니다..
  4. 다른 분들의 정답을 보고 어떻게 해서 나왔는지 정리해서 풀었습니다. ^과 $로 시작과 끝의 .를 제거한 것과 \.+를 활용해서 반복되는 패턴을 잡는 방식도 있다는 것을 알게 됐습니다.

문제 링크

 

2021 카카오 신입공채 1차 온라인 코딩 테스트 for Tech developers 문제해설

지난 2020년 9월 12일 토요일 오후 2시부터 7시까지 5시간 동안 2021 카카오 신입 개발자 공채 1차 코딩 테스트가 진행되었습니다. 테스트에는 총 7개의 문제가 출제되었으며, 개발 언어는 C++, Java, Jav

tech.kakao.com

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 카카오계정개발팀에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. 네오에게 주어진 첫 업무는 새로 가

programmers.co.kr

참고사이트

 

 

[이론 및 파이썬] 정규 표현식

정규 표현식이란? 정규 표현식, regexp 또는 regex라고 불리는 정규표현식(regular expression)은 일정한 규칙(패턴)을 가진 문자열을 표현하는 방법입니다. 복잡한 문자열 속에서 특정한 규칙으로 된 문

hwanii-with.tistory.com

 


1차적으로 푼 것으로 if와 for문으로 찾은 경우도 있습니다.

import re

def solution(new_id):
    change_id = new_id
    # 1 단계
    change_id = change_id.lower()
    # 2 단계
    change_id = re.findall(r'[a-zA-Z0-9\-_.]',change_id)
    next_id = ""
    for i in change_id:
        next_id += i
    change_id = next_id
    # 3 단계
    change_id = re.sub(r"\.+",'.',change_id)
    # 4 단계
    if change_id:
        if change_id[0] == '.':
            change_id = change_id[1:]
    if change_id:
        if change_id[-1] == '.':
            change_id = change_id[:-1]
    # 5 단계
    if change_id == '':
        change_id = 'a'
    # 6 단계
    if len(change_id) >= 16:
        change_id = change_id[:15]
        if change_id[-1] == '.':
            change_id = change_id[:-1]
    if len(change_id) < 3:
        while len(change_id) < 3:
            change_id += change_id[-1]
    return change_id

2차적으로 푼 것으로 모든 단계를 정규식으로 해결했습니다.

def solution(new_id):
    st = new_id
    # 1단계
    # lower로 대문자 -> 소문자
    st = st.lower()

    # 2단계
    # ^은 not을 의미, [a-z, 0-9, -, _, .] 을 제외한 나머지 ''로 바꾸기
    st = re.sub('[^a-z0-9\-_.]', '', st)

    # 3단계
    # .이 1번 이상 반복되는 모든 글자를 '.'로 바꾸기
    # 여기서 \.+ 에서 \는 욕심없는 반복으로 변형, .이 있는 글자만 포함
    st = re.sub('\.+', '.', st)
    # \를 제외하면 .뒤의 모든 글자를 1개로 처리함.
    # st = re.sub('.+', '.', st)
    # +는 {1,}로 바꿀 수 있음. .{1,}는 .이 1번이상 반복되는 글자를 그룹화하는 것을 의미함.
    # st = re.sub('\.{1,}','.',st)

    # 4단계
    # ^[.]은 문자열 시작이 .로 시작하는 것을 의미
    # |은 or을 의미
    # [.]$sms 문자열 끝이 .로 끝나는 것을 의미
    st = re.sub('^[.]|[.]$', '', st)

    # 5단계, 6단계
    # 만약 0글자이면 'a'
    # 아니면 15까지, st가 15보다 작다면 끝까지 포함하기 때문에 :15까지 슬라이싱해도 끝까지 하는 것과 같음.
    st = 'a' if len(st) == 0 else st[:15]

    # 4단계 반복
    st = re.sub('^[.]|[.]$', '', st)

    # 7단계
    # 길이가 3보다 작다면 마지막 글자( == [-1])를 3 - len(st)만큼 반복해서 st에 붙임.
    st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
    return st

정규 표현식이란?

정규 표현식, regexp 또는 regex라고 불리는 정규표현식(regular expression)은 일정한 규칙(패턴)을 가진 문자열을 표현하는 방법입니다. 복잡한 문자열 속에서 특정한 규칙으로 된 문자열을 검색한 뒤 추출하거나 바꿀 때 사용합니다. 또는, 문자열이 정해진 규칙에 맞는지 판단할 때도 사용합니다.

 

특정한 규칙을 가진 문자열의 집합을 추출할 수 있어서 주민등록 번호, 전화번호, 도서 ISBN 등 형식이 있는 문자열을 원본 문자열로부터 추출할 때 사용합니다. 다르게 말하면, Programming Language나 Text Editor 등에서 문자열의 검색과 치환을 위한 용도로 쓰이고 있습니다. 

  • 장점 : 일반적인 조건문으로는 복잡할 수 있지만, 정규 표현식을 이용하면 매우 간단하게 표현 할 수 있음.
  • 단점 : 코드가 간단한 만큼 가독성이 떨어져서 표현식을 숙지하지 않으면 이해하기 힘듬.

 

정규표현식 표현방법

정규표현식은 표준인 POSIX의 정규표현식과 POSIX 정규표현식에서 확장된 Perl방식의 PCRE가 대표적이고, 이외에도 수많은 정규표현식이 존재하며 정규 표현식 간에는 약간의 차이점이 있습니다.

정규 표현식에서 사용하는 기호를 Meta문자라고 하고 이 Meta문자는 표현식 내부에서 특정한 의미를 갖는 문자를 말하며, 공통적인 기본 Meta 문자의 종류는 아래와 같습니다.

 

공통 기본 Meta

정규 표현식 표현 설명
^x
문자열이 x로 시작
x$
문자열이 x로 끝
.x
임의의 한 문자를 표현(x가 마지막으로 끝남)
x+
x가 1번이상 반복
x?
x가 존재하거나 존재하지 않음.
x*
x가 0번이상 반복
x|y
x 또는 y를 찾음(or 연산자를 의미)
(x)
()안의 내용을 캡쳐하며, 그룹화
(x)(y)
그룹화 할 때, 자동으로 앞에서부터 1번부터 그룹 번호를 부여해서 캡쳐.
결과값에 그룹화한 Data가 배열 형식으로 그룹번호 순서대로 들어감.
(x)(?:y)
캡쳐하지 않는 그룹을 생성할 경우 ?:를 사용함.
결과값 배열에 캡쳐하지 않는 그룹은 들어가지 않음.
x{n}
x를 n번 반복한 문자를 찾음.
x{n,}
x를 n번이상 반복한 문자를 찾음.
x{n,m}
x를 n번이상 m번이하 반복한 문자를 찾음

 

한 문자만 지정하는 Meta 문자 : []

정규 표현식 표현 설명
[xy]
x, y 중 하나를 찾습니다.
[^xy]
x, y를 제외하고 문자 하나를 찾습니다.
(문자 클래스 내의 ^는 not을 의미)
[x-z]
x~z 사이의 문자 중 하나를 찾습니다.
\^
^(특수문자)를 식에 문자 자체로 포함합니다.(escape)
\b
문자와 공백 사이의 문자를 찾습니다.
\B
문자와 공백 사이가 아닌 값을 찾습니다.
\d
숫자를 찾습니다.
\D
숫자가 아닌 값을 찾습니다.
\s
공백문자를 찾습니다.
\S
공백이 아닌 문자를 찾습니다.
\t
Tab 문자를 찾습니다.
\v
Vertical Tab 문자를 찾습니다.
\w
알파벳 + 숫자 + _ 를 찾습니다.
\W
알파벳 + 숫자 + _ 을 제외한 모든 문자를 찾습니다.

 

 

자주 사용되는 패턴

1) 숫자만 : ^[0-9]*$

2) 영문자만 : ^[a-zA-Z]*$

3) 한글만 : ^[가-힣]*$

4) 영어 & 숫자만 : ^[a-zA-Z0-9]*$

5) E-Mail : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$

6) 휴대폰 : ^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$

7) 일반전화 : ^\d{2.3} - \d{3,4} - \d{4}$

8) 주민등록번호 : \d{6} - [1-4]\d{6}

9) IP 주소 : ([0-9]{1,3}) . ([0-9]{1,3}) . ([0-9]{1,3}) . ([0-9]{1,3})

10) 라인 확인 : (?m)^[ \t]*\r?\n

 

정규식 공부하기 좋은 알고리즘 문제로 2021년 카카오 블라인드 테스트 1차 코딩테스트 1번 문제를 추천합니다.

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 카카오계정개발팀에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. 네오에게 주어진 첫 업무는 새로 가

programmers.co.kr

 

 

 

위의 표현은 아래 사이트를 통해 나온 표현 방식입니다.

 

Regexper

 

regexper.com

참고 사이트

 

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

 

정규표현식(Regular Expression)을 소개합니다.

날이 갈수록 개인정보 보호에 관련하여 보안정책을 점진적으로 강화하고 있습니다. 이에 따라 Web에서 회원가입 시 Password 설정을 복잡해진 보안정책에 맞추다 보니 복잡하게 조합해야만 정상적

www.nextree.co.kr

 

문제 리뷰

  1. 작년에 코딩테스트를 하면서 스스로 많은 부족함을 느꼈고 그동안 공부를 열심히(..?) 해왔습니다! 그러다 프로그래머스에 문제가 나와있어서 지금 다시 풀어보면 풀 수 있을지 궁금해서 다시 풀어보고 리뷰하기로 결심했습니다!😀
  2. 해당 문제는 코딩테스트에서 3번 문제로 나왔습니다. 다른 문제와 다르게 정확성과 효율성으로 나눠져있어서 정확성만 맞더라도 부분점수가 나옵니다. 작년에 시험볼 때에도 정확성은 통과했지만 효율성에서는.... 정답률을 보니 효율성 부분은 확실히 낮네용 4.49%.......
  3. 단순하게 info와 query를 정리해서 문제를 풀면 정확성에서는 쉽게 해결할 수 있습니다! 하지만 효율성에서 맞기 위해서는 이분탐색을 활용해야 합니다. 대부분의 효율성 문제는 heap정렬과 이분탐색으로 해결가능한 것 같습니다.
  4. 이분탐색을 하기 위해서는 info를 통해서 나올 수 있는 모든 조건을 정리해서 전부 입력하는 것입니다. 예를 들어, “java backend junior pizza 150” 지원자의 경우 다음과 같이 16가지 그룹에 속하게 됩니다.
  5. 모든 조건들을 먼저 정리한 이후 오름차순으로 sorting을 합니다. 여기서 저는 높은 점수가 앞으로 오기 위해서 -1을 곱했습니다. 이유는 bisect_right를 하기 위해서 이고요.
  6. info 정리가 끝났다면 이젠 query를 알맞게 가공한 다음 해당 query에서 점수를 이분탐색으로 찾으면 끝이 납니다.
  7. 추가적으로 문제를 풀면서 4번 부분에서 처음에는 16가지 그룹을 구할 때, 조합을 활용해서 풀 때는 시간초과가 발생했지만 단순하게 16개를 추출하게 되면 통과됐습니다. 생각해보면 조합이 코드를 구현하거나 보여주기에는 더 깔끔하지만 효율적이지 않다고 생각이 들었습니다.

 

문제 링크

문제 링크와 카카오에서 제공해준 문제 해설 링크입니다.

 

코딩테스트 연습 - 순위 검색

["java backend junior pizza 150","python frontend senior chicken 210","python frontend senior chicken 150","cpp backend senior pizza 260","java backend junior chicken 80","python backend senior chicken 50"] ["java and backend and junior and pizza 100","pyt

programmers.co.kr

 

 

2021 카카오 신입공채 1차 온라인 코딩 테스트 for Tech developers 문제해설

지난 2020년 9월 12일 토요일 오후 2시부터 7시까지 5시간 동안 2021 카카오 신입 개발자 공채 1차 코딩 테스트가 진행되었습니다. 테스트에는 총 7개의 문제가 출제되었으며, 개발 언어는 C++, Java, Jav

tech.kakao.com


from bisect import bisect_right

def get_type(type_arr):
    arr = []
    # 0개 '-'
    arr.append(tuple(type_arr))
    # 1개 '-'
    for i in range(4):
        temp = type_arr[:]
        temp[i] = '-'
        arr.append(tuple(temp))
    # 2개 '-'
    for i in range(4):
        for j in range(i+1, 4):
            temp = type_arr[:]
            temp[i] = '-'
            temp[j] = '-'
            arr.append(tuple(temp))
    # 3개 '-'
    for i in range(4):
        for j in range(i+1,4):
            for k in range(j+1,4):
                temp = type_arr[:]
                temp[i] = '-'
                temp[j] = '-'
                temp[k] = '-'
                arr.append(tuple(temp))
    # 4개 '-'
    arr.append(('-','-','-','-'))
    return arr

# 조합 구현
def comb(lst, n):
    arr = []
    if len(lst) < n:
        return arr

    if n == 1:
        for i in lst:
            arr.append([i])
    else:
        for i in range(len(lst)-n + 1):
            for temp in comb(lst[i+1:], n-1):
                arr.append([lst[i]] + temp)
    return arr

def solution(info, query):

    answer = [] # 결과값
    info_dict = {}  # info에 대한 정리.

    # info값 정리
    for i in info:

        info_arr = i.split()
        # 이분 탐색할 때 큰 값부터 시작하기 위해서 -1을 곱함.
        info_detail, info_score = [k for k in info_arr[:-1]], int(info_arr[-1]) * -1
        # 조합으로 16개를 구하는 방법.
        # info_dict[tuple(info_detail)] = info_dict.get(tuple(info_detail), []) + [info_score]
        # for j in range(1, 5):
        #     for temp in comb(info_detail, j):
        #         info_dict[tuple(temp)] = info_dict.get(tuple(temp), []) + [info_score]

        # 단순히 16개를 구하는 방법
        for i in get_type(info_detail):
            if i in info_dict:
                info_dict[i].append(info_score)
            else:
                info_dict[i] = [info_score]

    # 이분탐색을 하기위해서 sorting
    for key in info_dict.keys():
        info_dict[key].sort()

    # query문 계산
    for i in query:
        # and를 없애고 빈칸 기준으로 나누기
        query_arr = i.replace('and','').split()
        # 가장 마지막값은 제외하고 tuple로 만들고, score는 이분탐색시 빠르게 큰 값부터 시작해서 -1을 곱함.
        query_detail, qeury_score = tuple(k for k in query_arr[:-1]), int(query_arr[-1]) * -1

        # 해당 쿼리문이 없는 경우.
        if query_detail not in info_dict:
            answer.append(0)
        # 해당 쿼리문이 있는 경우 info_dict에서 쿼리문 찾은 이후
        # 이분탐색해서 해당 값이 들어갈 수 있는 가장 끝값 append에 추가하기
        else:
            answer.append(bisect_right(info_dict[query_detail], qeury_score))

    return answer

글을 시작하며

이번 부스트캠프에서 처음으로 배운 개념입니다.

이전에는 단순히 for문에서 사용하지 않는 부분에서 _를 사용했는데 이런 부분을 알게 돼서 조금 더 자세히 공부하려고 합니다.

 

먼저 참고 자료로 아래 2개의 사이트를 참고했습니다. 더 자세히 확인하시고 싶으면 링크를 확인해주세요.

 

What is the meaning of single and double underscore before an object name?

Can someone please explain the exact meaning of having leading underscores before an object's name in Python, and the difference between both? Also, does that meaning stay the same whether the obj...

stackoverflow.com

 

 

파이썬에서 언더바/언더스코어(_) 의 의미와 역할

https://www.datacamp.com/community/tutorials/role-underscore-python Role of Underscore(_) in Python In this tutorial, you're going to learn about the uses of underscore(_) in python. www.datacamp.co..

eine.tistory.com

 

언더스코어(_)의 사용 용도로 4가지가 있습니다.

  1. 인터프리터에서 마지막 값 저장
  2. 무시하는 값
  3. 숫자값의 분리(자릿수 구분, 구분자)
  4. 변수나 함수명에 특별한 의미 또는 기능을 부여할 때

 

1. 인터프리터에서 마지막 값 저장

파이썬 인터프리터에서는 마지막 표현식의 결과값을 자동적으로 "_"라는 변수에 저장합니다.

 

 

2. 무시하는 값.

_는 무시하는 값으로도 쓰입니다. 해당 값을 unpack하기 싫으면, 해당 위치에 _를 넣으면 됩니다.

 

 

이는 for문에서도 사용할 수 있습니다.

 

 

3. 숫자값의 분리(자릿수 구분, 구분자)

 

숫자값이 길다면, 자릿수 구분을 위해 _를 중간에 넣어줄 수 있습니다.

 

 

4. 변수나 함수명에 특별한 의미 또는 기능을 부여할 때

 

변수, 함수, 클래스 명 등에 언더스코어(언더바)가 사용될 수 있습니다.

종류로는 4가지가 있습니다.

 

4-1. 앞에 하나의 언더스코어 _variable

 

앞에 하나의 언더스코어로 시작하는 이름은 내부 사용용도입니다.(internal use only)

 

위의 그림처럼 클래스내의 변수를 호출하면 접근이 가능합니다.

하지만 해당 모듈을 import 해서 사용하는 경우 다음과 같이 됩니다.

 

 

위에서 나오는 에러처럼 _Test2는 import가 안되는 것을 확인할 수 있습니다.

위와 같은 상황을 다르게 from underscore import * -> import underscore로 변경해보자

 

 

이처럼 _ 1개는 내부사용 전용이라는 뜻입니다.

 

4-2. 뒤의 하나의 언더스코어

 

가끔 파이썬 키워드에 해당하는 이름(예약어)을 변수명, 함수명, 클래스명으로 사용하고 싶은 경우 사용하면 됩니다.

 

 

위에서 보이는 것처럼 sum은 list, tuple의 값을 더하는 함수입니다.

sum을 변수로 사용한다면 꼬이게 되서 오류가 발생합니다.

이러한 상황을 피하기 위해 변수명을 sum 대신 sum_을 사용하면 됩니다.

 

 

4-3 앞의 두개의 언더스코어

 

앞에 두개의 언더바로 시작하는 방식으로 name mangling이라고도 한다. 

아래를 통해 확인해보자

 

 

dir 함수를 통해 보면 obj안에 함수와 변수에 __list가 없는 것을 확인할 수 있다. 이처럼 언더스코어 2개로 시작하는 것은 pivate access modifier(접근 지정자)의 역할을 한다. 변수뿐만 아니라 메소드에서도 사용 가능하다.

 

그러면 어떻게 접근하는지 확인해보자.

 

 

mangling된 변수에 접근하려면 위와 같이 함수를 사용하여 접근을 해야한다.

 

추가적으로 mangling된 변수에 값을 직접 추가하는 방식은 property 데코레이터를 사용하면 가능하다.

 

 

4-4 앞뒤로 2개의 언더스코어

이것은 특수한 예약 함수나 변수, 그리고 함수명으로 매직 메소드(magic method) 또는 dunder 메소드라고 불립니다.

대표적으로 __init__, __add__, __len__, __main__ 등이 있다.

참고 자료는 아래 링크에서 확인하면 됩니다.

 

 

Dunder or magic methods in Python - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

글을 시작하며

부스트캠프에서 과제를 하면서 단순하게 isdigit 함수를 사용했는데 피어세션을 통해서 숫자 판별에도 isnumeric, isdigit, isdecimal에 차이가 있음을 알게 되어 정리를 진행하려 합니다.

 

숫자 판별

숫자 판별로는 isnumeric(), isdigit(), isdecimal() 이렇게 3가지가 존재합니다.

판별되는 기준으로는 isnumeric() >>> isdigit() >>> isdecimal() 순으로 범위가 정해집니다. 자세한 예시는 아래 코드를 통해 보여드리겠습니다.

 

일반적인 숫자 문자열을 확인해보면 3가지 함수 모두 True로 나옵니다.

만약 문자열이 다음과 같이 숫자는 숫자인데 제곱과 같은 숫자입니다.

이러한 결과가 나오는 이유는 isdigit() 함수는 단일 글자가 '숫자'모양으로 생겼으면, 숫자처럼 생긴 모든 글을 True를 반환하는 함수입니다. 위의 3²(²은 특수문자)를 int나 float를 해보면 에러가 나는 것을 볼 수 있습니다. 만약 원하는 결과가 int형이나 float형인 경우 decimal을 사용하는 것이 가장 정확합니다.

그렇다면 isnumeric과 isidigit의 차이점은 무엇일까요

아래의 결과를 보면 확인할 수 있습니다.

isdigit은 단일 글자가 숫자모양으로 생겼으면 True를 리턴하고 isnumeric은 숫자값 표현에 해당하는 텍스트까지 인정해줍니다.

 

파이썬에서 숫자로 사용하는 방식으로 e를 넣는 방식도 있습니다.

파이썬에서 e는 10으로 예를 들어 4000을 4e3으로 표현할 수 있습니다. 아래에서 확인해봅시다.

그렇다면 e를 파이썬 함수를 사용하면 나오는 결과를 확인해보겠습니다.

3함수 모두 e를 숫자로 판별하지 못하는 것을 확인할 수 있습니다.

 

마지막으로 2진수, 8진수, 16진수는 어떻게 처리될까요

파이썬에서 2진수는 0b1111과 같이 0뒤에 b를 넣어서 쓰입니다.

8진수는 0o17과 같이 0뒤에 o가. 16진수는 0x1f와 같이 0뒤에 x를 넣어서 쓰입니다.

이런 경우는 어떻게 되는지 아래에서 확인해봅시다.

이것 역시 b, o, x는 숫자모양이 아니므로 전부 False가 나옵니다.

문제 후기

  1. 처음 접하는 백트래킹 문제로 어떻게 해야하는지 몰라 해당 사이트를 참고했습니다.
 

[BOJ] 👸 N-Queens / 파이썬

👸 N-Queens 문제 N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N

geonlee.tistory.com

문제 링크

www.acmicpc.net/problem/9663


 

from sys import stdin

def find_queen(sol, n):
    global answer

    # sol 갯수가 N개가 되면 + 1
    if len(sol) == N:
        answer += 1
        return  0
    # 후보자 리스트.
    candidate = [i for i in range(n)]
    for i in range(len(sol)):
        # sol의 i번째와 현재 열의 거리.
        distance = len(sol) - i
        # 같은 열의 후보 제거
        if sol[i] in candidate:
            candidate.remove(sol[i])
        # 해당 퀸의 대각선의 +방향 확인
        if sol[i] + distance in candidate:
            candidate.remove(sol[i] + distance)
        # 해당 퀸의 대각선의 -방향 확인
        if sol[i] - distance in candidate:
            candidate.remove(sol[i] - distance)
    
    if candidate != []:
        for i in candidate:
            # 후보를 추가하여 재귀 실행
            find_queen(sol + [i], n)
    # 후보가 없는경우 종료
    else:
        return 0


N = int(stdin.readline())
answer = 0

for i in range(N):
    find_queen([i], N)
print(answer)

'백준' 카테고리의 다른 글

[백준] 알파벳 -Python  (0) 2021.03.01
[백준] 지구 온난화 -Python  (0) 2021.02.18
[백준] DFS와 BFS -Python  (0) 2021.01.20
[백준] 줄 세우기 -Python  (0) 2021.01.18
[백준] 가장 긴 바이토닉 부분 수열 -Python  (0) 2021.01.18

글을 시작하며..

학교에서 전공 수업도 듣고 파이썬으로 프로젝트, 회사에서 일도 하면서 파이썬을 다 안다고 생각하던 나 자신이 창피해지는 일주일...

AI Tech를 진행하면서 정말 짧은 시간안에 Python을 이렇게 제대로 공부하는 건 너무 좋은 거 같다.


  • Obeject-Oriented Programming, OOP
  • 객체 : 실생활에서 일종의 물건. 속성(Attribute)와 행동(Action)을 가짐
  • OOP는 이러한 객체 개념을 프로그램으로 표현. 속성은 변수(variable), 행동은 함수(method)로 표현됨
  • 파이썬 역시 객체 지향 프로그램 언어

class 선언하기

  • class 선언, object는 python3에서 자동 상속
class SoccerPlayer(object):
#object는 python3에서는 자동 상속
class SoccerPlayer():

 

python naming rule

  • 변수와 Class명 함수명은 짓는 방식이 존재
  • snake_case : 띄어쓰기 부분에 "_"를 추가. 뱀처럼 늘여쓰기, 파이썬 함수, 변수명에 사용
  • CamelCase : 띄워쓰기 부분에 대문자. 낙타의 등 모양, 파이썬 Class명에 사용.

Attribute 추가는 __init__, self와 함께

__init__은 객체 초기화 예약함수

 

파이썬에서 __의미

  • __ 는 특수한 예약 함수나 변수 그리고 함수명 변경(맨글링)으로 사용
  • ex : __main__, __add__, __str__, __eq__
  • 참고사이트

method(Action)추가는 기존 함수와 같으나, 반드시 self를 추가애야만 class 함수로 인정됨.

클래스에서 self는 생성된 instance를 의미함.

 

class SoccerPlyer():
	def __init__(self, name:str, postion: str, back_number:int):
		self.name = name
		self.position = position
		self.back_number = back_number

	def change_back_number(self, new_number):
		print("선수의 등번호를 변경합니다. : From {} to {}".format(self.back_number, new_number))
		self.back_number = new_number

# Object 이름 선언과 함께 초기값 입력하기
park = SoccerPlayer("park", "MF", 10)
# 객체명 = Class명(__init__함수 Interface, 초기값)

 

OOP에 필요한 것 : Inheritance(상속), Polymorphism(다형성), Visibility(가시성)

상속(Ingeritance)

  • 부모클래스로부터 속성과 Method를 물려받은 자식 클래스를 생성 하는 것.
class Person(object):
	def __init__(self, name, age):
		self.name = name
		self.age = age
	
class Korean(Person):
	pass

first_korean = Korean("Sungchul", 35)
print(first_korean.name)

class Person(object): # 부모 클래스 Person 선언
	def __init__(self, name, age, gender):
		self.name = name
		self.age = age
		self.gender = gender
	def about_me(self): # Method 선언
		print("저의 이름은 ", self.name, "이구요, 제 나이는 ", str(self.age), "살
		입니다.")

class Employee(Person): # 부모 클래스 Person으로 부터 상속
	def __init__(self, name, age, gender, salary, hire_date):
		super().__init__(name, age, gender) # 부모객체 사용
		self.salary = salary
		self.hire_date = hire_date # 속성값 추가

	def do_work(self): # 새로운 메서드 추가
		print("열심히 일을 합니다.")

	def about_me(self): # 부모 클래스 함수 재정의
		super().about_me() # 부모 클래스 함수 사용
		print("제 급여는 ", self.salary, "원 이구요, 제 입사일은 ", self.hire_date, 
		" 입니다.")

다형성(Polymorphism)

  • 같은 이름 메소드의 내부 로직을 다르게 작성
  • Dynamic Typing 특성으로 인해 파이썬에서는 같은 부모클래스의 상속에서 주로 발생함.
  • 중요한 OOP의 개념 그러나 너무 깊이 알 필요 X

가시성(Visibility)

  • 객체의 정보를 볼 수 있는 레벨을 조절하는 것
  • 누구나 객체 안에 모든 변수를 볼 필요가 없음
    1. 객체를 사용하는 사용자가 임의로 정보 수정
    2. 필요 없는 정보에는 접근 할 필요가 없음
    3. 만약 제품으로 판매한다면? 소스의 보호

Encapsulation

  • 캡슐화 또는 정보 은닉(Information Hiding)
  • Class를 설계할 때, 클래스 간 간섭/정보공유의 최소화
  • 캡슐을 던지듯, 인터페이스만 알아서 써야함

self.__items : 앞에 __가 붙으면 Private 변수로 선언하여 타객체가 접근못하게 만듬.

접근허용을 해서 사용 할 수 있게도 함.

class Product(object):
	pass

class Inventory(object):
	def __init__(self):
		self.__items = []
	def add_new_item(self, product):
		if type(product) == Product:
			self.__items.append(product)
			print("new item added")
		else:
			raise ValueError("Invalid Item")
	def get_number_of_items(self):
		return len(self.__items)

@property
def items(self):
	return self.__items

my_inventory = Inventory()
my_inventory.add_new_item(Product())
print(my_inventory.__items) # error
print(my_inventory.items)

decorate

first-class objects

  • 일등함수 또는 일급 객체
  • 변수나 데이터 구조에 할당이 가능한 객체
  • 파라메터로 전달이 가능 + 리턴 값으로 사용
  • 파이썬의 함수는 일급함수

Inner function

  • 함수 내에 또 다른 함수가 존재
  • 흔하며 많이 나옴
  • closures : inner function을 return값으로 반환(자바스크립트에서 많이 나오는 개념)

decorator function

  • 복잡한 클로져 함수를 간단하게
def star(func):
	def inner(*args, **kwargs):
		print("*" * 30)
		func(*args, **kwargs)
		print("*" * 30)
		return inner

@star
def printer(msg):
	print(msg)
printer("Hello")

# star(func)에서 func에 printer가 들어가고
# printer(msg)에서 msg에 Hello가 들어가는 형태 

def test1(num1):
    def test2(num2):
        def inner(*args):
            result = num2(*args) * 10
            return [num1, result]
        return inner
    return test2

@test1(2)
def chk(n):
    return n ** 2

print(chk(3)) # [2, 90]

# test1의 num1에 2
# test2의 num2에 chk(3)
# inner의 *args에 chk의 파라미터인 n
# result = num2(*args) * 10 -> chk(3) * 10 -> 9 * 10 -> 90
# return = [2,90]

 

+ Recent posts