구분 | str | repr |
---|---|---|
의미 | 비공식적인 문자열을 출력 | 공식적인 문자열을 출력 |
사용 목적 | 사용자가 보기 쉽도록 사용 | 문자열로 객체를 다시 생성하기 위해 사용(eval()과 함께 자주 사용) |
사용 주체 | 프로그램 사용자를 위해 사용 | 프로그램 개발자를 위해 사용 |
클래스에서 __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}}
처럼 속성에 직접 접근하여 사용할 수 있다.
차량 번호판 형식이 주어졌을 때, 가능한 차량 번호판의 개수 구하기
알고리즘 분류에 수학, 조합론이 적혀있어 itertools의 combinations_with_replacement
과 len(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)
양념 치킨 최소 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)