본문 바로가기

분류 전체보기

(15)
피보나치 수열 with 재귀(메모이제이션) 피보나치 수열의 총 항을 입력받아 피보나치 수열을 출력한다. 예를들어 5를 입력 받으면 1, 1, 2, 3, 5를 출력한다. 재귀함수를 사용해 구현을 할 계획인데 우선 재귀의 기본 형태부터 구현하여 원리를 이해해 본다. public static void main(String[] args) { System.out.println(DFS(5)); } public static int DFS(int n) { if(n == 1) return 1; else if(n == 2) return 1; else return DFS(n - 2) + DFS(n - 1); } 우선 위 코드는 피보나치 수열의 n번째 항을 구하기 위해 이전전항(n-2)와 이전항(n-1)의 항을 재귀하며 값을 구하고 최종 합산하여 결과를 출력한다. 대..
Spring MVC에 WebClient 사용해보기 개인적인 생각이지만 아직 국내의 일반적인 시스템은 WebFlux를 사용하여 전체 모든 구간을 Asynchronous Non-blocking I/O로 처리하기 어려울것 같다. Reactive 프로그래밍에 대한 난이도도 높을 뿐더러 R2DBC가 나오긴 했지만 아직은 기존 기능에 비해 기술 성숙도가 부족하기 때문이다. 또한, 무엇보다 아직은 서블릿 기반의 멀티 스레드 처리가 빠르다...(아직 부족을 못느끼고 있음) 아무튼, 여러가지 이유로 아직은 Spring-boot-starter-web를 이용한 Web MVC를 사용하지만, WebClient는 학습해봐야 할것 같아 간단한 테스트를 하며 정리한 내용을 포스팅 하려 한다. WebClient에 대한 기본적인 설명은 생략한다. 우선 간단한 테스트 환경을 구성하기 위..
주문하기 (1) 먼저 주문쪽 Entity를 조금 수정했다. Order와 OrderDetail 관계는 일반적인 업무 로직이 Order를 중심으로 OrderDetail이 생성되거나 수정되기 때문에 ManyToOne 보다는 OneToMany로 변경하였고 이를 효율적으로 관리하기 위해 양방향 연관관계를 통해 mappedBy를 통해 FK를 OrderDetail로 내렸다. (이렇게 하지 않으면 OneToMany로 동시 Insert 시 불필요한 Update 쿼리가 날라갈 수 있음) 추가로 Order Entity 내에 addOrderDetail()와 createOrder() 를 통한 도메인 로직을 추가하였고, orderStatusCode는 Enum Class를 활용하였다. @Entity @Table(name = "TB_ORDER") ..
8. 유효한 팰린드롬 문제 설명 문자열이 입력되면 해당 문자열이 회문 문자열이면 "YES", 회문 문자열이 아니면 “NO"를 출력하는 프로그램을 작성하세요. 단, 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않습니다. 입력예시: found7, time: study; Yduts; emit, 7Dnuof 출력예시: YES 문제 풀이 초기 접근 아이디어는 앞에서 사용한 lt, rt를 사용해 중앙으로 이동하면서 모두 문자라면 서로 값이 같은지 비교 하는 방법이다. public String solution(String s) { String result = "YES"; int lt = 0, rt = s.length() -1; while(lt < rt) { if(!Character.isAlphabetic(s.c..
7. 회문 문자열 문제 설명 문자열이 입력되면 해당 문자열이 회문 문자열이면 "YES", 회문 문자열이 아니면 “NO"를 출력하는 프로그램을 작성하세요. 단, 회문을 검사할 때 대소문자는 구분하지 않습니다. 입력예시: gooG 출력예시: YES 문제 풀이 일반적인 방법은 포문을 반만 돌면서 양끝을 서로 비교해 다른 부분이 있으면 바로 return fasle를 내보내는 방법이다. public String solution(String s) { String result = "YES"; int len = s.length(); s = s.toLowerCase(); for(int i = 0; i < len/2; i++) { if(s.charAt(i) != s.charAt(len-i-1)) { return "NO"; } } retur..
6. 중복문자제거 문제 설명 소문자로 된 한개의 문자열이 입력되면 중복된 문자를 제거하고 출력하는 프로그램을 작성하세요. 중복이 제거된 문자열의 각 문자는 원래 문자열의 순서를 유지합니다. 입력예시: ksekkset 출력예시: kset 문제 풀이 이상하게도 중복 제거라는 말이 나오면 Set이나 Map이 먼저 떠오른다. 지금 같은 경우는 Key에 대한 Value는 필요 없는 상황이니 먼저 Set으로 문제를 접근해 본다. public String solution(String s) { Set set = new LinkedHashSet(); for(char c : s.toCharArray()) { set.add(c); } Iterator iter = set.iterator(); String result =""; while(ite..
프로젝트 생성 우선 전체를 설계하고 시작하지 않고 대략적인 아웃라인을 통해 기본적인 기능을 구현하고 이후 상세화를 통해 develop을 하기로 한다. gradle기반의 멀티모듈을 통해 이후 필요한 공통 모듈등을 도출할 계획이고, 우선 아래와 같이 3개의 서비스를 구성하여 기본적인 상품조회, 주문, 주문내역 조회 등을 구현한다. toy-project-1 ├ order-svc │ ├ com.rara.toy1 │ │ ├ order │ │ └ OrderSvcApplication.java │ └ build.gradle ├ product-svc │ ├ com.rara.toy1 │ │ ├ product │ │ └ ProductSvcApplication.java │ └ build.gradle ├ user-svc │ ├ com.rar..
5. 특정 문자 뒤집기 문제 설명 영어 알파벳과 특수문자로 구성된 문자열이 주어지면 영어 알파벳만 뒤집고, 특수문자는 자기 자리에 그대로 있는 문자열을 만들어 출력하는 프로그램을 작성하세요. 입력예시: a#b!GE*T@S 출력예시: S#T!EG*b@a 문제 풀이 초기 아이디어는 입력 문자열에서 배열로 변환 후 index를 유지하면서 알파벳만 별도로 분리하고 이를 SpringBuilder 클래스를 통해 reverse하고 원래 문자열에 뒤집힌 문자를 넣어주는 방식이었다. 이를 코드로 구현하면 다음과 같다. public String solution(String s) { char[] result = s.toCharArray(); String alphaString = ""; for(int i = 0; i < result.length; ..
Spring Web MVC와 Spring WebFlux 같이 사용하기 Spring Boot는 웹 어플리케이션 개발을 위해 embedded Tomcat, Jetty, Undertow, or Netty를 지원하며 이를 이용하여 빠르게 관련 모듈을 구성하기 위해 spring-boot-starter-web와 spring-boot-starter-webflux를 지원한다. 각 모듈의 역할 및 기능은 이미 많은 블로그에 포스팅 되어 있기에 관련 추가 설명은 생략한다. 토이프로젝트를 진행하며 궁금했던 부분은 우선 spring-boot-starter-web을 사용하면서 spring-boot-starter-webflux 의webclient를 사용할 수 있을까? 였다. 여러 블로그를 찾아봐도 명확하게 확인되는 내용이 없어 직접 두 모듈을 적용해 보며 어떤 차이가 있는지 비교, 분석해 보았다...
4. 단어 뒤집기 문제 설명 N개의 단어가 주어지면 각 단어를 뒤집어 출력하는 프로그램을 작성하세요. 첫 줄에 자연수 N(3