전체 글 54

[디자인패턴] 템플릿 메서드 패턴 과 전략 패턴의 비교

새로 입사한 회사에서 프로그래밍 중 제가 템플릿 메서드 패턴과 전략 패턴을 구분 없이 사용하고 있다 라는 피드백을 받았습니다. 사실 디자인 패턴에 대해 공부를 해보지 않았기 때문에 이 기회를 삼아 한번 정리해보고자 합니다. 제가 회사에서 보았던 코드는 아래와 같이 입력된 값에 의해서 구현체가 달라지는 상황이 었습니다. 아래 코드를 보고 무슨 패턴이지? 라고 생각이 드신다면 이 글을 보시며 함께 공부하면 좋겠습니다! public class Main { public static void main(String[] args) { String input = "a"; Strategy strategy; if (input.equals("a")) { strategy = new StrategyClass1(); } else..

[Spring boot 프로젝트 정리 2] 관리자페이지 도서 카테고리 관리

정리 1 : 자기 참조 - 도서 카테고리 구현 [Spring boot 프로젝트 정리 1] 자기참조 - 도서 카테고리 구현 NHN Acadmey에서 인증과정 중 제가 구현한 파트에 대해 정리하고자 글을 씁니다. 인터넷 도서 사이트를 제작하는 프로젝트였고 그 중 카테고리, 주문 조회, 결제, 캐싱처리를 담당하였습니다. 예스 tk-story-1201.tistory.com 위의 링크의 후속으로 도서 카테고리를 관리하는 페이지를 구현한 내용을 정리해보고자 합니다. 해당 UI는 프로젝트 구현의 시간이 촉박하여 유행하고 있는 vue.js 나 리액트를 쓰지 못했고 커리큘럼상 가장 많이 썼던 Thymeleaf를 의존성을 추가하여 사용하였습니다. (그러므로 Spring boot 기반의 Front Server에서 UI 및 ..

개발/Spring 2023.04.04

[백준 21608 JAVA] 상어 초등학교 : 조건 잘 구현하기

어떠한 알고리즘이 아닌 구현쪽 문제를 풀어보았다. 주어진 조건에 맞추어 주어진 예시 및 구글링해서 나오는 반례들을 모두 넣어서 맞는 값을 도출해내었다. 그러나 백준 제출에는 계속 틀렸습니다가 떠서 문제를 새로 풀었다. (가장 아래에 틀리지만 답은 제대로 나오는 코드를 추가하겠다) 이리 장황한 문제는 일단 문제를 읽고 어떻게 구현할지를 우선 생각하는 것이 아니라 예시를 정확하게 이해하는 것이 중요하다고 느꼈다. 고려한 점 아래 수식은 대각선 방향을 허용하지 않는 상,하,좌,우만을 의미한다. => 주변 = 상,하,좌,우 |r1 - r2| + |c1 - c2| = 1 3개의 조건을 순서대로 코드로 풀어내면 되었다. import java.util.*; public class Main { static int[] ..

[백준 - 14891 JAVA] 톱니바퀴 : 재귀 사용

일단 문제가 너무 장황해서 보기 어려웠지만 하나씩 이해하고자 하니 괜찮았다. 그러나 주어진 그림 예시에서는 하나가 움직이면 연쇄적으로 움직여야하는 상황에 대해 캐치하지 못하였어서 예시 4번에서 계속 원하는 값이 나오지 않았다. (이때까지는 재귀 생각 못함) 그래서 질문 게시판을 보니 연쇄적으로 움직이는 상황도 생각해야한다고 하여 재귀로 풀기로 결심하였다. 고려사항 모든 경우의 수에 맞춰 if문을 작성했다가 너무 코드가 복잡해지고 생각 못한 조건에 대해 커버를 하지 못해 재귀로 변경 1 base가 아니라 0 base 라서 시작시 wheelNum - 1 로 진행 방문했다는 visited를 사용해야만 문제가 해결 되었다. 해당 톱니바퀴를 돌리고자 했었다 라는 표시를 해둬야 연쇄적으로 돌아가야하는 재귀에서 돌아..

[백준 - 10799 JAVA] 쇠막대기 : Stack 사용

생각보다 오래걸린 문제! 스택을 활용하여 풀면 간단하게 풀릴것이라 생각했지만 레이저의 개수를 직접 세어 막대기의 갯수를 세아리려고 하니 재귀함수 까지 생각이 닿았지만 그럴 필요는 없었음 고려사항 주어진 그림을 가로로만 봐서 어려웠는데, 세로로 보니 답이 보였음 레이저가 발견되면 스택에 쌓여있는 갯수만큼 잘린다 -> 그만큼 더하면됨 열린 괄호를 만나면 스택에 넣고, 직전 글자를 확인하여 레이저 이면 pop시키고 토탈 카운트를 누적 연산 레이저가 아닌 닫힌 괄호는 해당 막대기의 마무리에 대한 연산은 없었기 때문에 마지막 조각을 더해준다(+1) import java.util.*; import java.io.*; public class Main { public static void main(String[] ar..

[백준 - 3273 JAVA] 두 수의 합 : set 2개 사용

주어진 문제의 조건이 서로 다른 양의 정수였기 때문에 중복 고려를 하지 않아도 되고, 이미 한번 연산한 내용에대해서는 따로 체크할 필요가 없기때문에 Contains 의 시간복잡도가 O(1)인 Set을 사용하기로 하였다. Set중 HashSet은 중복 저장하지않고, 순서 없이 저장되지만 속도는 빠르기때문에 자바로 문제푸는 본인은 set을 사용하기로 선택! 고려사항 첫번째 입력값으로 주어지는 정수 갯수는...의미가 없었음 -> 한줄로 들어오는 입력 값을 Tokenizer 를 사용하여 분리했음 결국엔 (finalNum - 현재 정수) 가 입력된 수열안에 있기만 하면 카운트 증가 대신 체크한 정수인지 확인하기위해 set을 하나 더 사용하여, 체크된 정수는 set에 저장하여 while 문 안에서 Contains로..

[백준 - 4949 JAVA] 균형잡힌 세상 : 스택 잘 사용하기

문제에 입력되는 영어 소문자들도 균형을 맞춰라 라고하는 느낌이 있어서 헤매다가 silver 등급의 문제길래 신경쓰지않았다. 신경썼던 부분이 stack을 static으로 전역에 선언했기 때문에 clear를 잊지않고 해줬어야했다. 입력된 모든 문자열을 검사 한 이후에 문제가 없었을 경우 스택이 비어있지 않았다면 실패로 간주 : 여는 괄호 하나만 넣으면 verifyBlank 함수에서 못걸러내기 때문 import java.util.*; import java.io.*; public class Main { static Stack stack = new Stack(); public static void main(String[] agrs) throws Exception { BufferedReader br = new Bu..

[백준 - 2446 Java] 별찍기 9

머리 식히기 용 별찍기! 자바 11에도 "*".repeat(4)이 되어서 편하게 풀었음 package beakjoon.bronze.b2446; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int num = Integer.parseInt(scanner.nextLine()); int size = num - 1; for (int i = size; i >= 0; i--) { int repeat = 2 * i + 1; String s = "*".repeat(repeat); String blank = " ".repeat(num - ..

[백준 - 10828 Java] 스택

기본적인 스택 문제였다. 그냥 스택을 쓰면 되는 문제였겠지..? 배열을 썼어야한건가... 일단 통과 import java.util.*; import java.io.*; public class Main { static Stack stack = new Stack(); public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int count = Integer.parseInt(br.readLine()); for (int i = 0; i < count; i++) { int num = myStack(br.readLine()); if (n..

[백준 - 10808 Java] 알파벳 개수

단순한 문자 개수 세기 문제였다. import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String s = scanner.nextLine(); char[] chars = s.toCharArray(); int[] result = new int[26]; for (char aChar : chars) { result[(aChar - 'a')]++; } for (int i : result) { System.out.print(i + " "); } } } Character 는 int로도 따로 캐스팅 필요 없이 치환이 가능하다. ('a' -> 97) 고로..