원지의 개발
article thumbnail
728x90

1. 객체 배열 (Array of Objects)

  • 배열을 매개변수로 받는 메서드
  • 배열이 들어가는거지 숫자나 문자, 문자형이 들어가는게 아님
    호출시 배열을 호출하는 것!!!
<java />
package dayo4; import java.util.Arrays; public class MethodEx04 { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5}; // int형으로 된 배열 있음 method01(arr); // 변수명 or 생성구문 } // end main // 정수 배열을 매개변수로 받는 메서드 static void method01(int[] a) { // a를 이용해서 배열밖의 사용 가능 System.out.println( Arrays.toString(a) ); // [1, 2, 3, 4, 5] } }
<java />
package dayo4; import java.util.Arrays; public class MethodEx04 { public static void main(String[] args) { String[] arr2 = {"월", "화", "수"}; method02(arr, arr2); } // end main // 정수 배열과 문자열 배열을 매개변수로 받는 메서드 static int method02(int[] arr, String[] arr2) { for(int a : arr) { // 향상된 for문: 정수형 배열a를 배열 arr에 담겠다! System.out.print(a); // 12345 } // 중간에 sysout해서 문단 나누기 for(String b : arr2) { // 향상된 for문: 문자형 배열b를 배열 arr2에 담겠다! System.out.print(b); // 월화수 } return 0; } }

 

<java />
package dayo4; import java.util.Arrays; public class MethodEx04 { public static void main(String[] args) { int[] arr3 = method03(); // return이 있는 메서드는 반드시 반환을 해줘야 함 System.out.println(Arrays.toString(arr3)); } // end main // 배열을 반환하는 메서드 static int[] method03() { int[] arr = new int[5]; arr[0] = 0; arr[1] = 1; arr[2] = 2; arr[3] = 3; arr[4] = 4; return arr; } }

1.1. Quiz 23

<java />
import java.util.Arrays; public class Quiz23 { public static void main(String[] args) { char[] arr = {'A', 'B', 'C'}; String result = method6(arr); // 결과변수(굳이 return한 str아니어도 됨) = 메서드이름(변수명) System.out.println(result); // A, B, C // System.out.println(method6(arr)); // 바로 넣어서 출력 } // end main // method6 / String / char[] / char배열의 요소를 문자열로 모두 붙여서 리턴 static String method6(char[] arr) { // char[] arr 배열이 들어올 것이라고 확신 String str = ""; 문자열 붙이기 for(int i = 0; i < arr.length; i++ ) { str += arr[i]; } return str; } }
<java />
import java.util.Arrays; public class Quiz23 { public static void main(String[] args) { int [] arr2 = {1, 2, 3, 4, 5}; int result2 = method7(arr2); // 여기도 굳이 sum 아니어도 됨 System.out.println(result2); // 15 // System.out.println(method7(arr2)); } // end main // method7 / int / int[] / 배열의 요소의 합을 리턴 static int method7(int[] arr2) { int sum = 0; for(int i = 0; i < arr2.length; i++) { sum += arr2[i]; } return sum; } // static int method7(int[] arr2) { // int a는 요소값 // for(int a : arr) { // sum += a; // } // return sum; // } }
<java />
import java.util.Arrays; public class Quiz23 { public static void main(String[] args) { String[] arr3 = method8("홍길동", "이순신"); System.out.println( Arrays.toString(arr3)); // [홍길동, 이순신] // System.out.println( Arrays.toString(method8("월", "화")) ); // [월, 화] } // end main // method8 / String[] / String, String / 매개 변수를 배열에 저장하여 배열 리턴 static String[] method8(String a, String b) { String[] arr = {a, b}; return arr; } }

2. 메서드의 실행

2.1. 동기적 실행

  • 순서대로 실행
  • 함수 안에서는 필요하면 언제든 불러서 출력 가능
    test01 사이에 test02 부르기 가능 → test01-1 / test02-1 / test02-2 / test01-2 순서로 진행

2.2. 재귀적 실행 (재귀호출)

  • 다시 돌아오기 때문에 리턴으로 중지
  • 효율성이 떨어져서 된다고만 알면 됨. 잘 안 씀
  • 팩토리얼, 피보나치 수열
  • java study에서 다시 확인함
<java />
package dayo4; public class MethodEx05 { public static void main(String[] args) { // 메서드의 (동기적) 실행 test01(); // test01-1 / test02-1 / test02-2 / test01-2 // 메서드의 재귀적 실행 recursive(0); // 0번 호출 ~ 9번 호출 int result = fac(5); System.out.println(result); // 5*4*3*2*1 = 120, fac(1) = 1 } // main 끝 static void test01() { System.out.println("1번 메서드 실행"); test02(); System.out.println("1번 메서드 종료"); } static void test02() { System.out.println("2번 메서드 실행"); System.out.println("2번 메서드 종료"); } static void recursive(int a) { // 재귀적 함수는 탈출의 구문을 반드시 명시한다. if(a == 10) return; System.out.println(a + "번 호출"); a++; // 1증가 recursive(a); // 다시 나 자신 실행 } static int fac(int a) { if(a == 1) return 1; // f(1) = 1 return a * fac(a-1); } }
  • recursive 메서드는 a == 10이면 출력하지 않고 return되므로, 0 ~ 9번까지만 호출됨
  • fac 메서드는 fac(1) = 1이 나오고, 5를 넣으면 5*fac(4)=5*4*fac(3)= 5*4*3*2*1 = 120

2.3. 피보나치 수열

  • 첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열
  • 1, 1, 2, 3, 5, 8, 13, 21 . . .

2.3.1. 1. 배열 사용 - 오버플로우 발생

<java />
class Solution { public int solution(int n) { int[] answer = new int[n+1]; //인덱스 0부터 시작하므로 크기는 n+1 return fibo(n, answer); } public static int fibo(int i, int[] answer) { if (answer[i] != 0) { } else { if (i <= 2) { // 1번 항과 2번 항은 1로 초기화 answer[i] = 1; } else { // 3번째 항 부터는 계산 answer[i] = fibo(i - 1, answer) + fibo(i - 2, answer); } } return answer[i]; } //end fibo }

2.3.2. 2. 재귀함수 사용 - 오버플로우 발생

<java />
//배열을 사용하는 것보다 더 느림 class Solution { public int solution(int n) { return fibo(n); } public static int fibo(int i) { if (i <= 1) { return i; } else { return fibo(i - 1) + fibo(i - 2); } } //end fibo }
  • n이 매우 큰 경우 n번째 피보나치 수는 언어가 표현할 수 있는 자료형의 범위를 넘어가, 오버플로우 생성
  • int 형은  -2,147,483,648 ~ 2,147,483,647 (32비트)
  • 44번째 피보나치 수만 가도 2,971,215,073로 int 범위를 넘어버림

출처: 아래 url

모듈러 연산 : (A + B) % C ≡ ( ( A % C ) + ( B % C) ) % C 

https://school.programmers.co.kr/questions/11991

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

2.3.3. 3. 정답

<java />
class Solution { public int solution(int n) { int[] answer = new int[n+1]; //인덱스 0부터 시작하므로 크기는 n+1 for(int i = 0; i <= n; i++) { if(i == 0) answer[i] = 0; else if(i == 1) { answer[i] = 1; } else { int sum = answer[i-2] + answer[i-1]; answer[i] = sum % 1234567; } } return answer[n]; } }
  • 매번 1234567로 나눈 나머지를 넣어줌

 

2023.05.08 - [Study/Data Structure&Algorithm] - [자료구조&알고리즘] 재귀 알고리즘(팩토리얼, 유클리드 호제법), 하노이의 탑, N퀸 문제 ???


오늘 하루

더보기

기억에 남는 부분

- 메서드는 보통 동기적으로 = 순서적으로 실행됨

- 결과 변수는 굳이 return한 값과 같지 않아도 되고, 두줄로 만들지 않고 한번에 출력도 가능
  하지만 나중에 제대로 출력되지 않을수도 있으니 정석대로 만들어서 출력 하는 것 추천!

 

어려운 부분

- 메서드에서 배열을 넣으면 메인에서 부를때도 배열 이름으로 호출해야 함

- 배열값을 입력하는게 아니라 그냥 배열을 만드는 매서드이므로 값을 따로 넣거나 만들어져 있는 것을 불러서 사용

 

문제 해결 부분

- 재귀적 함수는 제대로 이해하지 못했지만 fac메서드가 어떻게 돌아가는지 이해함

 

728x90
profile

원지의 개발

@원지다

250x250