목록Study (269)
전공공부
1. 소프트웨어 아키텍처 검토 헥사고날 아케텍처를 사용하므로써의 이점을 알아야 사용을 하는데 동기부여가 될 것이다. 우선 소프트웨어 아키텍처는 유지 보수가 잘 되어지는 형태로 짜여져야 기술적인 부채를 줄일 수 있다. 그저 동작하는 코드를 짜는 것은 쉽다. 하지만, 소프트웨어 업그레이드가 진행 될 때마다 코드를 다시 유지보수를 진행하고 이때, 아키텍처 구조가 제대로 짜이지 않은 코드는 어색하고 스파게티 코드가 되기 쉽다. 그리고, 대부분의 소프트웨어는 시간이 지날수록 더욱 변경 사항을 추가하고 변경하는 것이 어려워지고 또한, 프론트엔드나 UI가 없이 테스트 케이스를 돌릴 수 있는 코드를 만들기 위해서는 헥사고날 아키텍처가 필요하다고 한다. 2. 헥사고날 아키텍처의 이해 주된 아이디어중 하나는 비지니스 코드..

설명 아래 그림처럼 접근했다. 16 6 들어오면 8 / 3 까지 기약 분수 형태로 GCD로 나눌 수 있고 이때 6개들은 그냥 배포하고 나머지 2/3에 대해서 정리하는 형태로 접근했다. 아래 그림을 보면 밑의 코드가 이해가 될 것이다. N = 2 , M = 5 2/5씩 하는데 이를 빼서 보면 4등분으로 나온다. 2/5 2/5 1/5 1/5 2/5 2/5 그러고 보니, 분자 만큼 나누어야 (2개의 빵을 5등분을 하려면 -> 4번 짜른다. 이렇게 생각하면된다.) 하는데 칼질의 갯수니 -1을 하면된다. 추가로, 마지막에 GCD로 나눈 기약분수 형태로 풀었으니 다시 복구 시켜야한다. 코드 package Math; import java.io.BufferedReader; import java.io.InputStrea..
설명 가성비가 안 좋은 것을 모두 select하고 이때, 가성비가 좋은 것을 후 순위로 선택하면서 Math.min 값을 줄여나가는 풀이로 풀어야 한다. 그리디 형태로 어떻게 풀까 싶었는데 도저히 떠오르지 않아서 풀이를 보고 해결했다. 조금 생각하기가 버거웠던 문제 코드 package Math; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class BOJ_3343 { public static void main(String[] args) throws IOException { BufferedReader br = ne..
설명 최대공약수 * 최소공배수를 진행하면 내가 뽑을 수도 같은 숫자를 가질 수 있다는 것은 파악을 하였다. 하지만, 이를 서로소로 만들어서 풀 생각은 하지 못하였는데 그냥 1~N까지 모두 탐색하면 시간초과가 날것이 뻔하니 최대공약수로 나눠서 탐색하면 x,y값 모두 서로소가 되고 이때 최대 공약수를 곱해서 GCD 여부가 같은지 체크하면 된다. 6 * 180 = 30 * 36 -> x,y 모두 서로소로 만들기 위해서 모든 변수에 GCD로 나눈다. => 1 * 30 = 5 * 6 이런 형태가 나올 것이고 이를 아래와 같은 코드로 구현하였다. 코드 package Math; import java.io.BufferedReader; import java.io.InputStreamReader; import java.u..
설명 에리스토테네스의 체를 활용하고 이때 팰린드롬을 확인 하기 위해서 각 소수에 대해서 거꾸로 돌려서 같은지 체크한다. 코드 package Math; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class BOJ_1990 { static boolean [] isPrime; public static void main(String[] args) throws Exception{ BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer tk = new StringTo..

설명 문제를 분석해보면 순차적으로 상승하는 수열을 사용하는 것을 이해 할 수 있다. 1,2,3,2,1 이런식으로... 만일 이를 등차수열을 떠올리면 힌트를 어느정도 가져간 것이다. 기존 등차 수열은 1,2,3,4,5,6 이렇게 상승하니 뒤에 5 4 3 2 1의 경우를 덧붙이면 되는데 이때, 길이는 2n - 1이 된다. 앞의 6개와 n개 전의 바로 -1 값을 더한 것. 이를 합친 합은 n(n + 1) / 2 으로 쓰는 공식을 사용하자. 이를 1~5 * 2 수열로 보고 진행하면 5* 6 = n (n - 1) 이 되고. 이때 n은 6 이때 n인 경우를 하나 더 더하면 제곱 = n^2이 된다. 그러면 우리 식에서는 diff 가 즉, n^2이 되는 합이 되고... 이때 바로 제곱으로 떨어지면 그때의 2n - 1 ..
설명 계속 시간 초과가 나길래 prime을 항상 범위의 수를 탐색 할 때 마다 구하고 있었다 처음에는... 상당히 버거운 코드 였고 이를 개선하여 1차적으로 prime 배열을 두고 항상 사용하였고 이후에는 Long 범위가 넘어 갈 때 대처가 잘 안 되어서 while문 내부에서 오버플로가 나길래 num > Long.MAX_VALUE / (i -> 소수 값) 을 넣어서 구할 수 있었다. 코드 package Math; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.HashSet; import java.util.Set; import java.util.StringTokenizer; public class BOJ_1..
설명 GCD(A,B) = GCD(a,b) * GCD(a1,b1) * ...을 이용한 것인데 간과하고 풀었던 것이... GCD 한 번 해준 이후로는 거쳐간 수를 다시 나누어진 GCD의 값으로 업데이트를 시켜줘야 했는데 그렇지 않고 풀어서 다음번 GCD를 돌때 다시 큰 값으로 올라가서 이상한 숫자가 나오게 되었다. 즉, GCD(A,B) = GCD(a,b) * GCD(a, 또 다른 수) *... 이런 형태가 되었던 것 코드 package Math; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; impo..