1부터 n까지 루프 없이 출력해라
package recur;
public class test {
public static void main(String[] args) {
int n = 10;
printNos(n);
}
public static void printNos(int n) {
if(n>0) {
printNos(n-1);
}
System.out.print(n + " ");
}
}
별도의 메서드로 분리해 자신의 메서드(public static void printNos(int n))를 계속 호출함
만약에 integer였다면 정수형태라고 표현했더라도 객체이다. n에 있는 주소값이 같이 만들어진다. 이거를 copy of reference (copy를 pass라고도 한다. pass by)
이동해가는 데이터를 value라고 한다. => pass by value
pass by reference가 될때의 문제점
주소값으로 할 수 있는게 없다. 객체를 일렬도 데이터만 쭉 보내 이동하는 걸 Serialigation이라고 한다.
그래서 pass by value로 해야하다. 이것이 기본이다.
자바는 웹이 기본(네트워크가 기본)이다. pass by value가 기본
local 시스템은 하나의 머신에서는! 객체를 이동할때 주소만 준다. 왜? 비용이 비싸서
stack에 10부터 0까지 차곡 차곡 쌓인다.
0이 호출되면 0은 지워지고
1이 호출되면 1은 지워지고
.
.
.
10이 호출되면 10이 지워진다.
print numbers 영역에서만 사용할 수 있다.
int는 4바이트 할당
재귀를 통해 시스템에서 제시해주는 stack을 사용한다.
재귀는 loof를 대신할 수 있다.
loof를 대신한다? 뭐가 이득임? 재귀를 통해 하려면 stack에 계속 쌓인다.
루프가 쵝오다~! 근데 조건에서.. 루프없이라고 하면 어쩔 수 없이 루프 사용해야함..
시스템 스택은
이렇게 사용하는걸 의미!
for문은 이렇게 사용하면 됩니다잉
package recur;
public class ForTest {
public static void main(String[] args) {
int n = 10;
for(int i = 1; i<= n; i++) {
System.out.print(n + " ");
}
}
}
재귀를 사용하는 사례
분할 정복 (Divide and Conquer): 문제를 더 작은 하위 문제로 나누어 해결하는 방식이 필요할 때.
예를 들어: 퀵 정렬 (Quick Sort) 및 병합 정렬 (Merge Sort): 배열을 여러 부분으로 나누고 각각을 정렬한 후 다시 합치는 방식입니다.
트리 및 그래프 탐색: 트리나 그래프 구조에서 깊이 우선 탐색(DFS)과 같은 탐색 알고리즘이 필요할 때. 예: 이진 트리의 순회 (전위, 중위, 후위 순회)
순열, 조합, 부분집합 생성: 주어진 집합에서 가능한 모든 조합이나 순열을 생성해야 할 때. 예: 특정 숫자의 조합을 구하는 문제
백트래킹 (Backtracking): 모든 가능한 경우를 탐색해야 하며, 특정 조건을 만족할 때 해결책을 찾는 경우.예: N-Queens 문제, 미로 찾기, 스도쿠 해결 등.
피보나치 수열: 앞의 두 수의 합이 바로 뒤의 수가 되는 수의 배열. 예: F(n) = F(n-1) + F(n-2)로 정의되는 피보나치 수열.
동적 프로그래밍: 재귀적 구조가 필요한 문제에서 메모이제이션 기법을 사용할 경우.예: 특정 문제를 재귀적으로 해결하면서 이전에 계산한 결과를 저장하여 성능을 개선하는 경우.
factorial 예제
package recur;
public class FactorialTest {
public static void main(String[] args) {
int n = 5;
// 리턴 값을 받는다.
int result = factorial(n);
System.out.println(result);
factorial(n);
}
public static int factorial(int n) {
if(n==0) {
return 1;
}
// 자신보다 한개 작은거 리턴해야함
return n * factorial(n-1);
}
// // for
// public static void main(String[] args) {
// int n = 5;
// int result =1;
// for(int i = 1; i <= n; i++) {
// result *= i;
// }
// System.out.println(result)
//
// }
}
// 출력 120
재귀는 메서드를 만든다.
팩토리얼은 곱하기
0은 곱하면 안된다잉
장점
코드를 간결하게 작성할 수 있음
복잡한 문제를 쉽게 해결할 수 있음
단점
함수 호출 시마다 시스템 스택 메모리를 사용하므로
스택오버플로우가 발생될 수 있음
성능이 비효율적==>반목문으로 대체할 수 있는지 고려
1차원 배열 (1) 투포인터
두개의 item을 더해서 6이 되게 해라
1과 3더하면 4가ㅗ딤
그래서
정렬을 해야한다.
이렇게!
만약에 끝에 수가 6이라면?
7이됨
그러면 포인터를 이동시킨다!
6이되게끔!
Q. 정렬된 배열 nums와 정수 target이 주어질 때, 두 수의 합이 target이 되는 두 수의 인덱스를 반환하세요
package array1;
public class TwoSum {
public static void main(String[] args) {
int []nums = {1, 2, 3, 4, 6};
int target = 6;
int left=0;
int right = nums.length-1;
// 두개가 교차가 되면 안됨으로 left<right로 설정
while(left<right) {
int sum = nums[left]+nums[right];
// 더한 값이 6이랑 맞냐를 물어봐야함!
if(sum == target) {
System.out.println(left+":"+right);
break;
} else if(sum < target) {
left++;
} else {
right--;
}
}
}
}
1차원 배열 (2) 투포인터 응용 => 슬라이딩 윈도우
어느 블록으로 만들어 놓고 이것을 옮기거나 범위를 넓혀갈 수 있게함
일반적으로 같은 범위를 옮겨간다!
💁🏻♀️ Exception (설명부터)
예외 혹은 오류 의미 즉, 비상상황의미
exception 상황을 (연출을 해서) 알려주고
package exception;
public class Test {
public static void main(String[] args) {
int x = 100;
int y = 0;
// args에 0번이 없다.
try{
y=Integer.parseInt(args[0]);
// args로 받아서 처리하려고 함
}catch (ArrayIndexOutOfBoundsException e) {
//밑에가 복구코드, 복구코드를 안넣고 처리하면 또 다른 오류 발생
// System.out.println("args[0]를 제공해야합니다");
// y = 1;
} try {
System.out.println(x/y);
} catch(ArithmeticException e) {
}
}
}
integer은 number 상속, java.lang.arrayindex에서 object까지 올라감
package exception;
public class Test {
public static void main(String[] args) {
int x = 100;
int y = 0;
try {
y = Integer.parseInt(args[0]); // args로 받아서 처리하려고 함
System.out.println(x / y);
} catch (ArrayIndexOutOfBoundsException e) {
// args[0]가 없을 때 처리
System.out.println("args[0]를 제공해야 합니다.");
y = 1; // 기본값을 할당
} catch (ArithmeticException e) {
// 0으로 나누기 예외 처리
System.out.println("0으로 나눌 수 없습니다.");
} catch (NumberFormatException e) {
// 숫자 형식 오류 처리
System.out.println("잘못된 숫자 형식입니다.");
} catch (Exception e) {
// 그 외의 예외 처리
System.out.println("예상치 못한 오류가 발생했습니다.");
}
System.out.println("더 좋은 말");
}
}
package exception;
public class Test {
public static void main(String[] args) {
int x = 100;
int y = 0;
try {
y = Integer.parseInt(args[0]); // args로 받아서 처리하려고 함
System.out.println(x / y);
// } catch (ArrayIndexOutOfBoundsException e) {
// // args[0]가 없을 때 처리
// System.out.println("args[0]를 제공해야 합니다.");
// y = 1; // 기본값을 할당
// } catch (ArithmeticException e) {
// // 0으로 나누기 예외 처리
// System.out.println("0으로 나눌 수 없습니다.");
// } catch (NumberFormatException e) {
// 숫자 형식 오류 처리
System.out.println("잘못된 숫자 형식입니다.");
} catch (Exception e) {
// 그 외의 예외 처리
System.out.println("정교한 복구 불가능 <= secure coding..");
}
System.out.println("더 좋은 말");
}
}
'
package exception;
public class Test {
public static void main(String[] args) {
int x = 100;
int y = 0;
int result = 0; // 결과를 담을 변수 추가
y = Integer.parseInt(args[0]); // args로 받아서 처리하려고 함
result = Divider.divide(x, y); // 나누기 결과를 result에 저장
System.out.println(result); // result 출력
System.out.println("더 좋은 말");
}
}
class Divider {
public static int divide(int x, int y) {
return x / y;
}
}
오류 발생한 코드
catch해서 잡겠도다.
// 꽝인 코드
package exception;
public class Test {
public static void main(String[] args) {
int x = 100;
int y = 0;
int result = 0; // 결과를 담을 변수 추가
y = Integer.parseInt(args[0]); // args로 받아서 처리하려고 함
result = Divider.divide(x, y); // 나누기 결과를 result에 저장
System.out.println(result); // result 출력
System.out.println("더 좋은 말");
}
}
class Divider {
public static int divide(int x, int y) {
try {
return x / y;
} catch(ArithmeticException e) {
return 0;
}
}
}
에러를 전송할 수 있는 별도의 방법이 필요하다.
error건들x excetion 건들o
컴파일러가 체크를 안한다는 무슨말?
왜? 에ㅣㄱ세녓능ㄹ 마들어야하고 왜 체크오애ㅙ왱
package array1;
public class SligingWindow {
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5};
int k = 3; // 연속된 요소의 개수
}
public static int maxSum(int[]nums, int k) {
int n= nums.length;
if(n<k) {
// exception 상황 연출
throw new IllegalArgumentException("배열의 길이가 k보다는 커야합니다.");
}
}
}
📌 정리
1. Exception 처리 기법 2가지
1) try~catch
2) throws
2. User define Exception
RuntimeException ==> Checked Exception
Exception Message 간단, 명확 전달
2차원 배열
행우선순회
package array2;
public class 행우선순회 {
public static void main(String[] args) {
int [][]array= {
{1,2,3},
{4,5,6},
{7,8,9}
};
trave(array);
}
public static void trave(int [][] arr) {
int rows=arr.length;
for (int i = 0; i < rows; i++) {
int cols=arr[i].length;
for (int j = 0; j < cols; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
열우선순회
package array2;
public class 열우선순회 {
public static void main(String[] args) {
int [][]array= {
{1,2,3},
{4,5,6},
{7,8,9}
};
trave(array);
}
public static void trave(int [][] arr) {
int rows=arr.length;
int cols=arr[0].length;
for (int j = 0; j < cols; j++) {
for (int i = 0; i < rows; i++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
지그재그순회
package array2;
public class 지그재그순회 {
public static void main(String[] args) {
int [][]array= {
{1,2,3},
{4,5,6},
{7,8,9}
};
trave(array);
}
public static void trave(int [][] arr) {
int rows=arr.length;
int cols=arr[0].length;
for (int i = 0; i < rows; i++) {
if(i % 2 == 0) {
for (int j = 0; j < cols; j++) {
System.out.print(arr[i][j]+" ");
}
}else {
for (int j = cols-1; j >=0 ; j--) {
System.out.print(arr[i][j]+" ");
}
}
System.out.println();
}
}
}
자바 40문제는 주말에 정리해서 올리겠습니당
'💡 URECA' 카테고리의 다른 글
[URECA] DAY15 자바 (1) | 2025.02.14 |
---|---|
[URECA] 프로그래머스 입문 - 20문제 (0) | 2025.02.13 |
[URECA] Day 13 | 자바(5) | 컬렉션 API(ArrayList, HashSet, TreeSet, HashMap) 재귀 (0) | 2025.02.12 |
[URECA] DAY 12 | 자바(4) (1) | 2025.02.11 |
[URECA] DAY11 | 자바(3) (0) | 2025.02.10 |