원지의 개발
article thumbnail
728x90

객체 배열 (Array of Objects)

  • 배열을 매개변수로 받는 메서드
  • 배열이 들어가는거지 숫자나 문자, 문자형이 들어가는게 아님
    호출시 배열을 호출하는 것!!!
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]
	}
	
}
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;
	}
}

 

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;
	}
}

Quiz 23

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;
	}
	
}
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;
//	}
	
}
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;
		}
}

메서드의 실행

동기적 실행

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

재귀적 실행 (재귀호출)

  • 다시 돌아오기 때문에 리턴으로 중지
  • 효율성이 떨어져서 된다고만 알면 됨. 잘 안 씀
  • 팩토리얼, 피보나치 수열
  • java study에서 다시 확인함
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

피보나치 수열

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

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

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. 재귀함수 사용 - 오버플로우 발생

//배열을 사용하는 것보다 더 느림
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

3. 정답

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