TIL 통합

01/08 TIL

네디0318 2024. 1. 8. 22:21

알고리즘/파이썬 과제

문제4.

#확인코드
customer1 = Customer()
customer1.join_customer("Alice", "alice@example.com", 100)
customer1.add_points(50)
customer1.reduce_points(20)
customer1.reduce_points(150)  # 포인트 부족 상황 테스트

 

오답

class Customer():
    name = None
    email = None
    point = 0

    def join_customer(self, name, email, point):
        self.name = name
        self.email = email
        self.point = point
        print(f"{name}님의 회원가입이 완료되었습니다. 이메일은 {email}이며, 포인트는 {point}입니다.")

    def add_points(self, amount):
        self.point = self.point + amount
        print(f"{name}님의 포인트는 {point}점 입니다.")

    def reduce_points(self, amount):
        if self.point >= amount:
            self.point = self.point - amount
            print(f"{name}님의 포인트는 {point}점 입니다.")
        else:
                self.point = self.point
                print("포인트가 부족합니다")

이랬더니 계속 name이 정의되지 않았다는 에러메시지가 뜸

 

정답

class Customer():
    name = None
    email = None
    point = 0

    def join_customer(self, name, email, point=0):
        self.name = name
        self.email = email
        self.point = point
        print(f"{name}님의 회원가입이 완료되었습니다. 이메일은 {email}이며, 포인트는 {point}입니다.")

    def add_points(self, amount):
        self.point = self.point + amount
        print(f"{self.name}님의 포인트는 {self.point}점 입니다.")

    def reduce_points(self, amount):
        if self.point >= amount:
            self.point = self.point - amount
            print(f"{self.name}님의 포인트는 {self.point}점 입니다.")
        else:
                self.point = self.point
                print("포인트가 부족합니다")

C:\Users\neddy\Desktop\sparta_python\venv\Scripts\python.exe C:/Users/neddy/Desktop/sparta_python/문제4.py
Alice님의 회원가입이 완료되었습니다. 이메일은 alice@example.com이며, 포인트는 100입니다.
Alice님의 포인트는 150점 입니다.
Alice님의 포인트는 130점 입니다.
포인트가 부족합니다

Process finished with exit code 0

 

 

파이썬의 문법에 익숙해지면서 개별 문제 난이도 자체는 점점 쉬워졌던듯.

class를 응용할 수 있는지 실습해보는 차원의 문제였던 것 같다.

문제에서 따로 요구한 것은 아니지만, 답을 다 작성한 뒤 혹시나 해서 point의 디폴트 값을 0으로 추가 설정했다. 

덧붙여,

클래스의 관건은 self를 붙여줘서 '어떤' 포인트인지를 정확하게 명시해 주는 것!

 

 

 

 

 

 

같은 숫자는 싫어(강의 실습문제)

https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

*예시

arr = [1, 1, 3, 3, 0, 1, 1]
arr = [4, 4, 4, 3, 3]

 

오답

def solution(arr):
    answer = []
    answer.append(arr[0])
    for i, num in enumerate(arr):
        if arr[i] == arr[i-1]:
            pass
        else:
            answer.append(num)

    print(answer)

arr1 = [1, 1, 3, 3, 0, 1, 1]
arr2 = [4, 4, 4, 3, 3]

solution(arr1)     #[1, 3, 0, 1]
solution(arr2)     #[4, 4, 3]

[1, 3, 0, 1]
[4, 4, 3]

=>if문을 추가하는 방식 등으로 답을 쓸 순 있겠지만 비효율적

 

 

정답

def solution(arr):
    answer = []
    answer.append(arr[0])
    for num in arr:
        if num == answer[-1]:
            pass
        else:
            answer.append(num)

    print(answer)

arr1 = [1, 1, 3, 3, 0, 1, 1]
arr2 = [4, 4, 4, 3, 3]

solution(arr1)     #[1, 3, 0, 1]
solution(arr2)

 

 

 

 

과제 : 올바른 괄호

https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

s = "()()"
s = "()()"
s = "(())()"
s = ")()("
s = "(()("
solution(s)

 

def solution(s):
    temp = []
    for a in s:
        if a == '(':
            temp.append(a)
        else:
            temp.remove(a)
    if temp == []:
        return True
    else:
        return False

 

4개 중 0개 성공

 

첫 시작이 ")"일 수 있다는 것을 생각하지 못해서 처참하게 실패했다..

def solution(s):
    temp = []
    for a in s:
        try:
            if a == '(':
                temp.append(a)
            else:
                temp.remove(a)
        except:
            return False
        return False
    if len(temp) == 0:
        return True
    else:
        return False

else의 temp에 있지도 않은 a를 지우라고 명령하는 꼴이어서 마찬가지로 처참히 실패했다.

 

 

def solution(s):
    temp = []
    if s[0] == ')':
        return False
    for a in s:
        if a == '(':
            temp.append(a)
        elif a == ')':
            temp.remove("(")
    if temp == []:
        return True
    else:
        return False

이렇게 했더니 예시만 통과하고 최종 채점은 실패함;;;

 

 

정답1

def solution(s):
    temp = 0
    for a in s:
        if a == '(':
            temp = temp +1
        elif a == ')':
            temp = temp - 1
        if temp < 0:          #음수가 되는 순간 "("보다 "0"가 먼저 나왔다는 의미
            return False
    if temp == 0:
        return True
    else:
        return False

 주요 포인트

-문제의 예시와 문제 해결을 위해 설정한 임의의 리스트/수를 일치시킬 필요가 없음

-기준점을 0으로 잡았으니 0보다 작아지는 순간 False가 됨을 숙지해야함

 

 

 

다른 풀이

def solution(s):
    temp = []
    for a in s:
        if a == '(':
            temp.append(a)
        elif a == ')':
            if temp == ["("]:          #두번째 예시 같은 경우 [(, (]인 상황이 있기에 조건에 걸림
                temp.remove("(")
            else:
                return False
    if temp == []:
        return True
    else:
        return False

2번째 경우가 fail

이유 : 두번째 예시 같은 경우 [(, (]인 상황이 있기에 조건에 걸림

 

 

def solution(s):
    temp = []
    for a in s:
        if a == '(':
            temp.append(a)
        elif a == ')':
            if '(' in temp:
                temp.remove("(")
            else:
                return False
    if temp == []:
        return True
    else:
        return False

정답은 맞으나 런타임 에러로 실패

 

정답2

def solution(s):
    temp = []
    for a in s:
        if a == '(':
            temp.append(a)
        elif a == ')':
            if '(' in temp:
                temp.pop()      #remove('(')로 작성하면 효율성 테스트에서 탈락!
            else:
                return False
    return not temp

이렇게 정답이 나오긴 했다만, 사실 pop()과 remove의 차이가 무엇인지는 잘 모르겠다. 튜터님에게 여쭤야할 부분인듯.

 

 

 


알고리즘 코드카타

 

문제9. 짝수의 합

정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.

https://school.programmers.co.kr/learn/courses/30/lessons/120831

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

def solution(n):
    sum = 0
    for a in range(2, n, 2):
        sum = sum + a
    return sum

 

range(a, b, c)

-a에서 시작해서 b까지, c씩 커짐

-최댓값은 b 직전 값!

 

def solution(n):
    sum = 0
    for a in range(2, n+2, 2):
        sum = sum + a
    return sum

예시는 맞았는데 7개의 케이스 테스트 중 2개가 실패했다..

 

정답

def solution(n):
    temp = []
    for a in range(n+1):
        if a%2 == 0:
            temp.append(a)
    return sum(temp)

 

 

 

 

 

 

range함수 활용법

https://blog.naver.com/freeegg/223151139489

 

[파이썬] Range 함수를 알아보자 - range / for문

안녕하세요 알상무입니다. 오늘은 파이썬의 대표적인 함수 중 하나인 Range 함수에 대해 알아보도록 하겠...

blog.naver.com

 

 


 

TMI

-지난 주 말부터 파이썬 개인과제 하면서 하루종일 굴렀더니 그래도 기본기는 익숙해진 모양. 전에 손조차 댈 수 없던 문제들이 술술 풀리니 꽤 잼난듯.

-주말에 약속 빽빽하게 있고서 이사 준비하니 죽을맛....오늘은 푹 자야겠다.