분류 전체보기
-
백준 14499) 주사위 굴리기 (골드.4)알고리즘/백준 2022. 7. 13. 22:56
https://www.acmicpc.net/problem/14499 14499번: 주사위 굴리기 첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지 www.acmicpc.net 단순 구현의 문제라고 생각하고 문제에 주어진 주사위 모양을 참고하여 구현하였다. 조건을 확인하면 다음과 같다. 1) 이동 방향이 동서북남 2) 지도상 좌표의 숫자가 0일 경우 이동한 주사위의 밑면의 숫자를 복사할 것 3) 지도상 좌표의 숫자가 0이 아닐 경우 주사위 밑면에 지도상의 숫자를 복사하고 지도상 좌표의 수는 0으로 만들 것..
-
알고스팟 : 울타리 잘라내기 (분할정복)알고리즘 2022. 7. 4. 22:37
처음부터 모두 조회하면서 사각형 넓이를 계산하는 완전탐색 실행시 시간초과가 발생하는 문제이다. 이 부분을 해결하기 위해서는 왼쪽과 오른쪽 부분을 나눠서 진행하는데 (분할 정렬처럼) 왼쪽부분에서 가장 큰 사각형과 오른쪽부분에서 가장 큰 사각형 넓이, 가운데에서 가운데 두개의 영역(넓이2 * 둘중에 낮은 높이), 가운데영역을 포함하여 양쪽으로 넓어지면서 계산한 사각형 중에 가장 큰 사각형을 비교하여 가장 큰 넓이를 반환해주여야 한다. c = int(input()) def max_sqare(left, right, fence): # 기저 사레 : 같은 값이면 가로 1 * 높이가 최대 직사각형 if left == right : return fence[left] # 가운데를 중심으로 나아간다 mid = (left ..
-
알고스팟 : 쿼드 트리 뒤집기 (분할정복)알고리즘 2022. 7. 4. 22:33
이미 압축되어 출력된 부분을 다시 원래 모양대로 풀고 나서 뒤집고 다시 압축하려고 하면 초과가 발생하는 문제이다. 이미 압축되어있는 버전에서 부분 별로 위와 아래만 바꿔주도록 적용해야 한다. c = int(input()) def reverse(s, idx): if s[idx] == 'w' or s[idx] =='b' : return s[idx] # x로 시작한다는 의미이므로 한칸 앞으로 idx +=1 upperLeft = reverse(s, idx) idx += len(upperLeft) upperRight = reverse(s, idx) idx += len(upperRight) lowerLeft = reverse(s, idx) idx += len(lowerLeft) lowerRight = reverse..
-
알고스팟 : 시계 맞추기 (완전 탐색, 최적의 해)알고리즘 2022. 7. 3. 21:30
완전탐색으로 시계를 모두 12시로 맞추는 모든 경우의 수를 구하고 그 중 스위치를 누른 최소의 갯수를 구하려고 했으나 시간초과가 발생하였다. import math inf = math.inf switches = [ [0, 1, 2], [3, 7, 9, 11], [4, 10, 14, 15], [0, 4, 5, 6, 7], [6, 7, 8, 10, 12], [0, 2, 14, 15], [3, 14, 15], [4, 5, 7, 14, 15], [1, 2, 3, 4, 5], [3, 4, 5, 9, 13] ] def is_aligned_clock(clock) : for time in clock : if time != 12 : return False return True def push_switch(clock, sw..
-
알고스팟 : 게임판 덮기 (완전탐색, 경우의 수)알고리즘 2022. 7. 3. 16:22
이 문제는 경우의 수를 모두 구하는 문제로 완전탐색을 이용한다. 여기서 주의할 점은 중복되는 경우의 수를 제외하기 위해서 맨 위쪽 부터 탐색하여 채워지지 않은 부분을 찾아내는 것이다. 제일 먼저 coverType을 만드는데 [dy][dx]타입으로 세 점을 작성하였으며 나중에 적용할 때는 행, 열의 순서에 맞춰 board[y + dy][x + dx]를 적용해야 하는 점에 유의하자. c = int(input()) coverType = [ [[0,0], [0,1], [1, 0]], [[0,0], [0, 1], [1, 1]], [[0,0], [1, 0], [1,1]], [[0,0], [1,0], [1,-1]] ] def isCoverable(x, y, type, board): for dy, dx in type:..
-
알고스팟 : 소풍 (완전탐색, 조합)알고리즘 2022. 7. 3. 14:02
탐색가능한 모든 조합의 수를 계산 하는 문제로 완전탐색 을 이용해서 문제를 해결할 수 있었다. 여기서 중요한 것은 중복으로 계산되는 것을 제외하여야 한다는 것이다. 즉 (1,0)과 (0, 1)은 서로 같은 사람끼리 짝을 이루었으므로 같은 경우라고 인지하여야 한다. 이 부분을 해결하기 위해서 숫자 순서대로 먼저 오는 답 하나만 계산할 도록 first 인자를 이용해서 선택되지 않은 학생중에서 가장 번호가 빠른 학생의 짝을 찾도록 하였다. c = int(input()) def countPair(): cnt = 0 first = -1 for i in range(n): if not visited[i]: first = i break if first == -1 : return 1 for i in range(first..
-
테스트 코드 리팩토링 (Feat. 단위테스트, 최적화, 인수테스트 구현하기)학습로그 2022. 6. 10. 10:26
이전의 테스트 코드는 단위테스트 구성이 전혀 되어있지 않았고, 테스트 비용을 생각하는 최적화부분도 없고 심지어 인수테스트 조차 없었다...!🤦♀️ 코드리뷰를 받으면서 테스트 코드 리팩토링도 함께 진행하였는데, 가장 먼저 1) 테스트 환경을 분리하고 2) 단위테스트 와 3) 인수테스트 도 구현하도록 하였다. 또한, @SpringBootTest, @DataJpaTest 등의 어노테이션을 사용하여 테스트를 진행할 때, 해당 어노테이션의 옵션이 다르거나, mockBean의 생성 부분들에 영향을 받게 되면 추가로 어플리케이션 컨텍스트를 생성하여 테스트를 진행하여 속도를 늦추는 원인이 된다는 것을 배우게 되었다. 즉, 같은 @DataJpaTest와 @SpringBootTest 어노테이션을 적용하여 각각 2개의 테..
-
프로젝트 코드 리팩토링학습로그 2022. 6. 10. 10:24
지난 6개월간 혼자했던 프로젝트를 멘토님과 함께 리팩토링을 진행하면서 어떤 부분을 어떻게 리팩토링하고자 했는지 전반적인 정리를 해보고자 한다. 리팩토링은 하나의 PR당 하나의 객체를 주제로 하고, 레이어별로 리팩토링 및 테스트 코드 수정의 방식으로 진행했다. 자바 코드 컨벤션, 객체지향 생활체조, 케이스 스타일 지키고 리팩토링 학습 가장 먼저 지켜야 할 기본적 규칙들에 대해 학습하고 이를 지켜서 코드를 구현하고자 했다. 블로그에 글을 작성하여 학습을 진행했고 추가적으로 리팩토링 책의 예제부분을 공부하면서 리팩토링을 해야하는 이유 및 방법에 대해 학습하였다. 또한 코드를 작성할 때는 method reference및 stream을 이용하여 간단하고 명료하게 의도를 나타낼 수 있도록 작성했다. https://..