매니저님이 지금은 알고리즘 문제의 답을 맞췄냐보다 얼마나 고민했는가에 초점을 두어야할 때라고 말씀하셨다. 나는 또 일주일 공부했다고 어느새 정답을 구해내는 것에 혈안이 되어 공부방법의 초점이 좀 엇나가고 있었던 것 같다. 지금은 문제가 풀리지 않아서 고민을 하며 불면의 밤 보내야할 때...!!!! 고민의 시간을 얼마나 가졌는지에 따라 성장속도가 달라질 것이다. 다시 한 번 마음 잡고 더 고민하는 시간을 가져보아야겠다 !! 알고리즘을 정복하는 그 날까지!! 🔜
- 오늘의 목표 :: 아이디어 떠올리고 코드 구현 해보기, 많은 고민 하기
- T.I.L
<자료구조 & 알고리즘>
* 동적계획법 (Dynamic Programming)
: 복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법
: 부분 문제 반복과 최적 부분 구조를 가지고 있는 알고리즘을 더 적은 시간에 풀 때 사용
: 다시 계산하지 말자! 반복되는 구조가 있을 때 여러번 계산할 것 같으니, 결과를 미리 적어두고(memoization) 다시 계산하지 않도록 효율적으로 진행
- 재귀적으로 풀 수 있고 / 반복문을 사용하여 풀 수 있음
*** 기초적인 것부터 공부하고 추후에 심도있게 공부해볼 것 ⭐⭐⭐
* 반복
1) 사전 판단 반복 : while, for 문 → 처음에 제어식을 평가한 결과가 0이면 루프 본문은 한번도 실행되지 않음 2) 사후 판단 반복 : do-while 문 → 루프 본문이 반드시 1번 실행되고 조건문 판단 후 진행 |
// 뺄셈 함수 만들기
static void subtraction() {
Scanner sc = new Scanner(System.in);
System.out.print("a의 값 : ");
int a = sc.nextInt();
int b = 0;
// 사전 판단 반복
while ( true ) {
System.out.print("b의 값 : ");
b = sc.nextInt();
if (a < b) {
break;
}
System.out.println("a보다 큰 값을 입력하세요!");
}
// 사후 판단 반복
do {
System.out.print("b의 값 : ");
b = sc.nextInt();
} while (a > b);
System.out.println(b-a);
}
* 구조적 프로그래밍 (structured programming)
: 하나의 입구와 하나의 출구를 가진 구성 요소만을 계층적으로 배치하여 프로그램을 구성하는 방법
: 순차, 선택, 반복 이라는 3종류의 제어 흐름을 사용함
** 논리연산자의 단축평가 (short circuit evaluation)
: || (or, 논리합) / && (and, 논리곱) → 왼쪽 피연산자에 의해 결과값이 도출되어 오른쪽 연산을 진행하지 않아도 될 때
** 드모르간 법칙 (De Morgan's lows)
: 각 조건을 부정하고 논리곱을 논리합으로, 논리합을 논리곱으로 바꾸고, 전체를 부정하면 원래의 조건과 같다.
do { } while ( n<10 || n > 99 ); |
do { } while ( !( n>=10 && n <= 99 ) ); |
* 다중 루프 : 중첩된 반복문 ( 이중 루프, 삼중 루프 ...)
아주 대표적인 구구단 만들기 예시..!
static void gugudan(){
Scanner sc = new Scanner(System.in);
System.out.print("단을 입력하세요 : ");
int dan = sc.nextInt();
for (int i = dan; i <= dan; i++) {
System.out.println("-------" + dan + "단 -------");
for (int j = 1; j <=9 ; j++) {
System.out.printf("%02d * %02d = %02d", i, j, i * j);
System.out.println();
}
}
}
↓ 곱셈표 만들기 ↓
static void multipleTable() {
System.out.print(" |");
for (int i = 1; i <= 9; i++) {
System.out.printf(" %2d", i);
}
System.out.println("\n--+----------------------------");
for (int i = 1; i <= 9; i++) {
System.out.print(i + " |");
for (int j = 1; j <= 9; j++) {
System.out.printf("%3d", i * j);
}
System.out.println();
}
}
↓ n단의 피라미드 만들기 ↓
static void piramid() {
Scanner sc = new Scanner(System.in);
System.out.print("몇 단의 피라미드를 만들까요 ? :");
int n = sc.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 0; j < n - i; j++) {
System.out.print(" ");
}
for (int j = 0; j < (i - 1) * 2 + 1; j++) {
System.out.print("*");
}
System.out.println();
}
}
- 오늘 푼 문제
다리놓기 :: https://www.acmicpc.net/problem/1010
피보나치 함수 :: https://www.acmicpc.net/problem/1003
(하나도 신나지 않지만) 신나는 함수 실행 :: https://www.acmicpc.net/problem/9184
'T.I.L. :: Today I Learned > 항해99 14기 온보딩' 카테고리의 다른 글
3월 16일 Day11. (0) | 2023.03.16 |
---|---|
3월 15일 Day10. (0) | 2023.03.15 |
3월 13일 Day8. (0) | 2023.03.13 |
3월 11일 Day6. (0) | 2023.03.11 |
3월 10일 Day 5. (0) | 2023.03.10 |