서론
자바 교육 과정을 마무리하고, 기초적이고 대표적인 알고리즘 문제풀이를 접하는 한 주였습니다.
일생활에서도 많은 일이 있었습니다. 그런 일들도 마무리되어 가는 과정이고,
체계화가 되고 있어 보다 빠른 학습이 가능할 것으로 보입니다.
1. 내용정리
가중치
버블 정렬 평균 O(n2)
/* map에 그래프 정보 작성 */
for(int i = 0; i < edge; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
map[a][b] = 1;
// 무방향 그래프이므로 둘 다 1로 설정
// map[a][b] = map[b][a] = 1;
}
[1][1] [1][2] [1][3]
↑(0,-1)↑
[2][1] ←(-1,0) [2][2] →(1,0)→ [2][3]
↓(0,1)↓
[3][1] [3][2] [3][3]
선택의 순간마다 당장 눈앞에 보이는 최적의 상황만을 쫓아 최종적인 해답에 도달하는 것 (탐욕적 선택)
어노테이션 정리
- @BeforeAll // 모든 테스트 전에 딱 1번 실행되는 메서드 지정
- @BeforeEach // 각 테스트 전에 실행
- @AfterEach // 각 테스트 후 실행
- @Test // 테스트 코드 실행
- @DisplayName("") // 테스트 이름
- @Timeout // test 실행시간 제한 테스트
- @ParameterizedTest // 여러 입력값으로 테스트 반복 실행
- @MethodSource("") // 테스트 데이터 제공
다익스트라 알고리즘
최소 신장 트리 - 크루스칼알고리즘
복잡한 문제를 여러 개의 간단한 문제로 분리하여 문제들을 해결하는 방법 (큰 문제를 작은 문제로 나눔)
수열의 합 사이에 성립하는 관계식 (대표적인 예)
피보나치 : f(n) = f(n-1) + (n-2)
봉지 3, 5kg 최소 패턴을 공식화 : f(n) = f(n-3) or f(n-5) + 1
그외 펙토리얼, 동전 교환, 평범한 배낭, 계단 오르기 등
// 기본 재귀 함수 - 피보나치 수열
public static int getFibonacciNumber(int n) {
if(n == 0) return 0;
else if(n == 1) return 1;
return getFibonacciNumber(n - 1) + getFibonacciNumber(n - 2);
}
// 메모이제이션 dp에 저장
dp[n] = getFibonacciNumberDP(n - 1) + getFibonacciNumberDP(n - 2);
// '계단 연속 오르기' 문제에서 2, 3칸 중복 불가
for(int i = 3; i <= n; i++) {
dp[i] = Math.max(dp[i-3] + arr[i-1], dp[i-2]) + arr[i];
}
애자일 스프린트 : 문서화 변화에 유연하게 대응하고, 짧은 개발 사이클을 통해 점진적으로 제품 개선
주의사항
유스케이스는 실제로 현실에서 발생하는 기능 (사용자가 눈에 보이는 하나의 기능 단위)
관계형 데이터 베이스(java와 mysql 연결하기)
데이터 원본에 JDBC driver를 통하여 Connection을 만드는 역할 / Driver는 인터페이스 역할
위치홀더(placeholder) 개념에 해당되는 인수가 많아 특정 값만 바꾸어 여러 번 실행하는 상황에 유용하다.
SELECT문 수행 성공 시 반환한 결과값을 받아오는 객체
JDBC Configuration Properties 파일 작성
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost/employee
user=ohgiraffers
password=ohgiraffers
DriverManager Class (추가)
JDBCTemplate에서 효율적인 트랜잭션, close 처리 (자동설정 가능)
PreparedStatement (추가)
[취약코드]
String query = "SELECT * FROM employee WHERE emp_id = '" + empId + "' AND EMP_NAME = '" + empName + "'";
SQL 인젝션(SQL Injection)에 취약한 코드 - 보안상 PreparedStatement 사용
입력값이 문자열로 감싸져 그대로 처리되며 SQL 구문에 영향을 주지 않음
Statement타입이기도 함 / 상속구조이기 때문이고, 그래서 다형성을 적용할 수 있다.
그래서, close는 기존 Statement의 객체를 가져다 쓸 수 있다.
각 계층마다 해야할 역할과 책임
view : 사용자가 보는 화면, 기능의 결과에 따라 보여질 페이지
controller : 사용자가 전달한 값을 정제해야할 경우가 있으면 처리, 적절한 service계층으로 전달, 결과 에 따른 페이지 이동
service : 연결 객체를 생성, 비지니스로직, 트랜잭션 처리
repository : 비지니스 로직에 따라 insert(생성), select, insert / DB와 연결하고 결과값을 잘 리턴
복잡한 현실 세계를 단순화하고 목적에 부합하며 정확한 내용으로 표현하기 위함 (단순화, 추상화, 명확화)
데이터 관점 모델링 : 데이터 중심, 실제 속성과 데이터, 데이터 간의 관계에 대한 모델링 (예: ERD 산출)
프로세스 모델링 : 업무 처리 중심으로 순서와 조건으로 실행되는지 표현
상관 모델링 : 프로세스와 데이터 사이의 상호작용 중심
무결성 데이터 값이 정확한 상태를 의미(완전하고 정확해야함)
엔티티 무결성(Entity Integrity) : 모든 인스턴스는 고유해야 하며 인스턴스를 대표하는 속성에는 널 값을 가지면 안됨 (같은 데이터를 두 번 저장하지 않음)
참조 무결성 : 엔티티의 왜래 식별자 속성은 참조하는 인티티의 주 식별자 값에 포함되거나 널이어야 함
도메인 무결성(Domain Integrity) : 특정 속성 값은 같은 데이터 타입, 길이, 널 여부, 중복 값 허용 (NOT NULL, CHECK, 데이터 타입 등을 통해 구현됨)
업무 무결성(Business Integrity) : 기업에서 업무를 수행하는 방법이나 데이터를 처리하는 규칙
2. 문제 풀이

풀이
1. 수열 문제라는 것을 파악하고 점화식을 뽑아내는게 관건
2. 빠른 처리를 위해 Scanner 대신 BufferedReader를 사용
3. 두 가지 경우의 점화식 중 최대값을 뽑아내기 위해 Math.max를 활용
'연속 3계단 금지'라는 조건을 만족하기 위해 두 가지 점화식을 뽑아냄
dp[i-3] + arr[i-1]dp[i-2] + arr[i][풀이 코드]
public static int solution(String input) throws IOException {
BufferedReader br = new BufferedReader(new StringReader(input));
int n = Integer.parseInt(br.readLine()); // 계단의 개수
int[] arr = new int[n + 1]; // 계단별 점수
int[] dp = new int[n + 1]; // 최적(최대 점수 합계)의 값 누적
for (int i = 1; i <= n; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
// 초기값 설정
dp[1] = arr[1];
if(n >= 2) dp[2] = dp[1] + arr[2];
// 점화식은 3번 계단부터 적용
for(int i = 3; i <= n; i++) {
dp[i] = Math.max(dp[i-3] + arr[i-1], dp[i-2]) + arr[i];
}
return dp[n];
}
}
위 문제풀이는 아직 익숙치 않은 예외처리도 필요한 상황이였습니다.
강사님께서 함께 풀어주신 문제, 막막한 문제였는데 이렇게 간단하게 코드로 풀어낼 수 있다는 것을 알았습니다.
당장은 이런 문제를 풀어내지 못하지만, 기억에 깊이 남는 문제였습니다.
3. 마무리
전체적으로 체계화가 되고 있습니다.
복습하며 마무리하는 것에 익숙해졌습니다.
지난 몇 주간 욕심이 과했던 것 같습니다. 조급함도 많았고, 일생활에서 신경 쓰일 일이 많았던 것 같습니다.
인간 관계에 너무 신경쓴 점도 큰 문제였던 것 같습니다.
대신 적응기가 지나 이제부터는 문제점을 보다 명확히 짚는 과정이 될 거 같습니다.
조금 더 길게 보고 조금함을 덜어내도록 할 예정입니다.
수업시간 이해하는 것에 어려움이 있어 선행 학습이 부족한 것 같습니다.
공부에 집중할 수 있게 수면조절, TASK관리, 운동에 신경 쓸 예정입니다.
프로젝트 관련 기획 / 유스케이스, 모델링, DDD 분석, 피그마 등의 활동이 있을 예정입니다.
04/21 : 4지 선다 개념 시험
04/23 : PCCE 코딩테스트
04/23 ~ 24 : 프로젝트 (수요일, 목요일)
05/31 : SQLD 자격증 시험
코딩테스트와 프로젝트로 객관적인 평가를 받을 예정입니다.