functools.cmp_to_key(func)
Transform an old-style comparison function to a key function. Used with tools that accept key functions (such as sorted(), min(), max(), heapq.nlargest(), heapq.nsmallest(), itertools.groupby()). This function is primarily used as a transition tool for programs being converted from Python 2 which supported the use of comparison functions.
A comparison function is any callable that accepts two arguments, compares them, and returns a negative number for less-than, zero for equality, or a positive number for greater-than. A key function is a callable that accepts one argument and returns another value to be used as the sort key.
Example:
sorted(iterable, key=cmp_to_key(locale.strcoll)) # locale-aware sort order
For sorting examples and a brief sorting tutorial, see Sorting HOW TO. New in version 3.2.
이런 풀이법은 어떻게 생각해내는지… 대단하다
def solution2(numbers):
numbers = [str(x) for x in numbers]
numbers.sort(key=lambda x: x * 3, reverse=True)
result = ''.join(numbers)
if '0' * len(numbers) == result:
return '0'
return result
사람
컴퓨터
bisect_left
, bisect_right
mylist = [1, 2, 3, 3, 3, 7, 9, 11, 33]
x = 3
print(f'bisect_left: {bisect_left(mylist, x)}')
print(f'bisect_left: {bisect_right(mylist, x)}')
def bisect_right(a, x, lo=0, hi=None):
"""Return the index where to insert item x in list a, assuming a is sorted.
The return value i is such that all e in a[:i] have e <= x, and all e in
a[i:] have e > x. So if x already appears in the list, a.insert(x) will
insert just after the rightmost x already there.
Optional args lo (default 0) and hi (default len(a)) bound the
slice of a to be searched.
"""
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None:
hi = len(a)
while lo < hi:
mid = (lo+hi)//2
# Use __lt__ to match the logic in list.sort() and in heapq
**if x < a[mid]:
hi = mid
else:
lo = mid+1**
return lo
정렬된 배열 내에서 찾고자 하는 숫자가 중복으로 존재한다면 방향을 지정해줘야 한다. def bisect_left(a, x, lo=0, hi=None):
"""Return the index where to insert item x in list a, assuming a is sorted.
The return value i is such that all e in a[:i] have e < x, and all e in
a[i:] have e >= x. So if x already appears in the list, a.insert(x) will
insert just before the leftmost x already there.
Optional args lo (default 0) and hi (default len(a)) bound the
slice of a to be searched.
"""
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None:
hi = len(a)
while lo < hi:
mid = (lo+hi)//2
# Use __lt__ to match the logic in list.sort() and in heapq
**if a[mid] < x:
lo = mid+1
else:
hi = mid**
return lo
이후에 테스트를 좀 더 확장하시게 된다면 회원과 관련한 테스트도 다른 테스트 클래스에서 호출하고 싶으실거에요. 하지만 JUnit 5기반의 테스트는 static method를 테스트로 지정할 수 없습니다. 그렇기때문에 별도 TestHelper 클래스에 Test관련 로직을 만들고, 테스트에서는 이 static helper 메소드를 호출하여 검증하는 형식으로 변경하기도 합니다.
이렇게 별도 테스트 유틸에 관련 로직을 만들어두면 다른 테스트 클래스에서도 동일한 로직을 호출할 수 있게되고 이는 테스트를 재사용할 수 있게 되는 장점도 생깁니다.
유지보수하고 재사용하기 용이한 테스트를 만드는건 항상 고민해보셨으면 좋겠습니다~
Java Helper vs. Utility Classes | Baeldung
프록시를 이용한 AOP
바이트코드 생성과 조작을 통한 AOP
장점
트랜잭션이란 최소 작업 단위로서 트랜잭션이 시작되면 전체 작업이 커밋되거나 롤백되어야 한다.
이 트랜잭션 동작 방식을 제어하는 방법이 있다.
TransactionDefinition
은 네가지 트랜잭션 속성을 정의하고 있다.
트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때 어떻게 동작할 것인가를 결정하는 방식을 말한다.
파란색 영역처럼 진행중인 트랜잭션이 있고, 노란색 영역처럼 독자적인 트랜잭션 경계를 가진 코드가 있을 때
이미 진행중인 트랜잭션이 어떻게 영향을 미칠 수 있는가를 정의한 것이 트랜잭션 전파 속성이다.
PROPAGATION_REQUIRED
PROPAGATION_REQUIRES_NEW
PROPAGATION_NOT_SUPPORTED
모든 트랜잭션이 순처적으로 진행돼면 좋지만 성능이 크게 떨어지므로 적절하게 격리 수준을 조정해서 가능한 한 많은 트랜잭션을 통시에 진행시키면서 문제가 발생하지 않게 하는 제어가 필요하다.
트랜잭션을 수행하는 제한시간 설정
트랜잭션 내에서 데이터 조작하는 시도를 막아줄 수 있으며 성능 향상도 된다.