알고리즘 스터디로 하루에 1문제를 풀고 있는데, 매일 어떤 문제를 풀지 결정하고 Readme에 업데이트 하는게 번거로웠다. 깃허브 액션을 사용해서 문제 선정과 업데이트를 자동화 해보자. 1. 문제 은행 만들기 문제는 프로그래머스의 레벨 2를 목표로 했다. 문제 목록을 크롤링하기 위해서 프로그래머스에서 문제 목록을 어떻게 불러오는지 확인했다. API를 호출해서 문제 목록을 불러오는 것을 확인할 수 있었다. 요청은 아래와 같은 형식으로, perPage와 page 파라미터로 페이지네이션을 한다고 생각했다. https://school.programmers.co.kr/api/v1/school/challenges/?perPage=20&levels[]=2&languages[]=python3&order=recent&s..
전체 글
다양한 경험을 기록해요오늘 한 일 Spring Data JPA 쿼리 메서드 공부 JpaRepository 인터페이스에서 메서드 이름으로 쿼리를 구현해줌 언제? -> SimpleJpaRepository 클래스가 생성될 때, 규칙에 맞는 이름을 분석해서 구현함 빈 수동 등록 특정 상황에서 @Configuration 적용한 클래스에서 @Bean 으로 등록하면 되는데, 보통 컴포넌트 스캔을 활용한 자동 등록이 더 편하고, 특별한 상황에서만 사용한다. 같은 타입의 빈이 2개 이상이라면 여러 방법이 있다. @Autowired의 DI는 타입으로 주입하고, 타입이 안되면 이름을 찾아서 주입한다. 따라서 필드 이름을 클래스 이름으로 설정하면 된다. @Primary 애너테이션을 적용한 클래스를 우선적으로 주입한다. @Qualifier 애너테이..
프로그래머스의 레벨 2 문제 기능개발 문제 요구 조건 리스트의 가장 앞에 있는 원소가 100을 넘었을 때, 뒤의 원소가 몇개나 100을 넘겼는지 확인해야 한다. 풀이 방법 리스트의 범위가 작아서 리스트의 모든 원소에 값을 더해주면서 했다. 만약 리스트의 범위가 크다면 총 작업 일수를 저장해서 진도율에 곱해주면 더하는 반복을 없앨 수 있다. # 작업 목록이 빌 때 까지 반복하는데 # 가장 앞에 있는 작업이 며칠 걸리는지 세고, 그만큼 진도율을 더해준다. # 진도율이 100을 넘으면 카운트하고 다음 작업 목록으로 간다 # 안넘으면 그 앞까지 작업 목록을 뺀다. 이걸 반복한다. import math def solution(progresses, speeds): answer = [] while len(progre..
프로그래머스의 레벨 2 문제 의상 문제 요구 조건 의상을 착용하는 조합의 수를 구한다. 풀이 방법 의상 종류별로 몇 개인지 세고, 각 의상을 사용하지 않는 경우를 포함해서 조합을 구한다. 조합에서 아무것도 안 입는 경우 1을 뺀다. # 해시로 옷 종류별로 저장한다 # 각 종류별로 입기+안입기로 곱하고, 아무것도 안입는 경우 1을 뺀다 def solution(clothes): answer = 1 d = {} for _, category in clothes: d[category] = d.get(category, 0) + 1 for category in d: answer *= (d[category] + 1) return answer - 1 해결 못했던 풀이 방법 의상 종류를 가지고 조합을 만들어서 의상 1개 ..
오늘 한 일 Spring Data JPA 공부 스프링 컨테이너 환경에서 영속성 컨텍스트는 트랜잭션의 생명주기와 같다 트랜잭션 전파(기본설정: Propagation.REQUIRED) REQUIRED: 부모 메서드에 트랜잭션이 존재하면 자식 메서드의 트랜잭션은 부모 트랜잭션에 합류한다. SUPPORTS: 활성화된 트랜잭션이 있으면 그 트랜잭션에 참여하고, 없다면 트랜잭션 없이 실행한다. MANDATORY: 반드시 진행 중인 트랜잭션 내에서 호출해야 한다. 활성화된 트랜잭션이 없으면 예외를 발생한다. REQUIRES_NEW: 항상 새로운 트랜잭션을 시작한다. 진행 중인 트랜잭션이 있다면 일시 정지한다. NOT_SUPPORTED: 트랜잭션을 사용하지 않고 실행한다. 진행 중인 트랜잭션이 있다면 일시 정지한다. ..
프로그래머스의 레벨 2 문제 전화번호목록 문제 요구 조건 접두어가 리스트에 포함되는지 비교해야한다. 내 풀이 방법 문자열 비교에 걸리는 시간을 단축하기 위해서 해시테이블에 저장하고, 모든 접두어를 만들어서 n*m으로 해결했다. # 모든 가능한 접두어를 해시테이블에 저장하고 비교하면 n*m. 범위가 작아서 가능 def solution(phone_book): d = {phone[:i]: True for phone in phone_book for i in range(1, len(phone))} for phone in phone_book: if d.get(phone, False): return False return True 다른 풀이 방법 문자열을 사전식으로 정렬하면 원소의 뒤에 있는 원소에 포함되는지만 비교..