TIL 240227

hyeo71·2024년 2월 27일
0

2024 내배캠 AI 트랙

목록 보기
40/79

파이썬 개인 과제 4번

가위바위보 웹사이트

가위바위보 웹사이트 소스코드

__repr__()

__str__() & __repr__()

구분strrepr
의미비공식적인 문자열을 출력공식적인 문자열을 출력
사용 목적사용자가 보기 쉽도록 사용문자열로 객체를 다시 생성하기 위해 사용(eval()과 함께 자주 사용)
사용 주체프로그램 사용자를 위해 사용프로그램 개발자를 위해 사용

Class에서의 str, repr

클래스에서 __repr__만 구현 시 __str__을 구현하지 않아도 repr, str 모두 구현한 문자열을 출력

반면, 클래스에서 __str__만 구현 시 str은 문자열을 출력하지만 repr은 객체 기본값을 출력한다.

이는 str 호출 시 먼저 __str__을 구현했는지 확인하고 없으면 __repr__을 호출하기 때문, 하지만 repr은 오직 __repr__만 호출하기 때문에 없으면 객체 기본값을 출력

이전 게임 결과 출력 중 "[]" 출력 문제

어제 이전 게임 결과를 웹 페이지에서 출력하는 과정에서 __repr__를 사용한 호출 결과가 아래와 같이 출력되었다.

위 출력에서 "[]"을 지우고 싶어 list 자료형으로 html로 넘어간 데이터를 ''.join(), slicing 등을 사용해 보았지만 모두 오류가 나와 실패하였다.

그래서 데이터를 넘길 때 DB.query...all()을 사용해서 list가 만들어진게 문제인가 싶어서 all()을 지웠더니 SQL query 값이 출력되었다.

해결 방법은 all()의 사용유무가 아닌 template에서 {{context.prev_result[0]}}로 출력을 해야된다는 것이다.
all()을 사용해 list로 반환을 받거나 사용하지 않고 단일 객체를 가리키는 쿼리 객체로 반환을 받아도 template에서는 해당 값에 접근하기 위해 "[0]"을 사용하여 값에 접근하고 __repr__을 사용하거나 {{context.prev_result[0].user_choice}} 처럼 속성에 직접 접근하여 사용할 수 있다.


Baekjoon

16968 - 차량 번호판 1

16968 - 차량 번호판 1

차량 번호판 형식이 주어졌을 때, 가능한 차량 번호판의 개수 구하기

알고리즘 분류에 수학, 조합론이 적혀있어 itertools의 combinations_with_replacementlen(set(combination)) 사용하여 중복값이 나오는 조합을 제외하여 결과값을 도출했지만 해당 문제에서 연속된 값만 일치하지 않으면 되는 조건에 비해 제외되는 값이 많아서 이 방법은 실패
(ex) (1,0,1), (2,0,2)의 값은 문제에서는 제외 되지 않는 값들이지만 떨어져 있는 수가 중복이기 때문에 len(set(combination))로 만든 조건식에 부합되어 결과값에서 제외된다.

그래서 itertools의 조합을 사용하는 것을 그만두고 문제를 다시 생각하기로 했다. 숫자로만 예시를 들면 처음 숫자와 두번째 숫자는 중복이 일어나서는 안되기 때문에 10*9라는 식을 쉽게 생각할 수 있다. 그렇다면 두번째와 세번째는 두번째에서 제외한 한 개의 숫자는 세번째 숫자에서는 사용할 수 있고 두번째 숫자와 중복이 일어나면 안되기 때문에 9-1+1=9 라는 값이 된다.
이러한 식을 계산하면 첫 숫자만 10 이후의 숫자는 9의 값으로 식을 만들어 사용하면 문제가 해결되었다.

c = 26 # 알파벳 개수
d = 10 # 0 ~ 10

c_check = 0 	# 'c' 중복 여부
d_check = 0		# 'd' 중복 여부
result = 1


for i in input().strip():
    if i == "c":
        result *= c if c_check==0 else c-1
        c_check=1
        d_check = 0
    else:
        result *= d if d_check==0 else d-1
        c_check = 0
        d_check=1

print(result)

16917 - 양념 반 후라이드 반

16917 - 양반 후반

양념 치킨 최소 X마리, 후라이드 치킨 최소 Y마리를 구매하는 비용의 최솟값을 출력

처음엔 양념 치킨 가격+후라이드 가격<반반 등의 치킨들의 가격을 기준으로 하는 여러 조건을 기준으로 코드를 작성했는데 빠진 조건이 있었는지 수정해도 계속 문제 통과를 못했다.

그래서 코드를 다 지우고 새로 생각을 했는데 나올 수 있는 가격들을 모두 구하고 이 중 가장 최솟값을 결과로 하는 방식으로 바꾸었다. 이 방법으로 하니 계산할 경우의 수도 적고 if문을 최소한으로 사용하여 문제를 해결할 수 있었다.

a, b, c, x, y = map(int, input().strip().split())

two_c = 2 * c

axby=a*x+b*y

two_c_max=two_c*max(x,y)

ab_two_c=(x-y)*a+y*two_c if x>=y else (y-x)*b+x*two_c

result=min(axby, two_c_max, ab_two_c)

print(result)

0개의 댓글