Main
선수과목 찾기 함수(find)
(매개변수로 과목, 배열을 넣어)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sub = new Scanner(System.in);
int x = sub.nextInt();
int y = sub.nextInt();
int[][] subject = new int[y][2];
for(int i=0; i<y; i++) {
subject[i][0] = sub.nextInt();
subject[i][1] = sub.nextInt();
}
String answer = "";
for(int i=0; i<x; i++) {
int a = 0;
int result;
do {
a++;
result = find(subject, i);
} while (result != 0);
answer += i!=x-1 ? a + " " : a;
}
System.out.println(answer);
}
public static int find(int[][] arr, int subject) {
int result = 0;
for(int i=0; i< arr.length; i++) {
result = arr[i][1] == subject ? Math.max(result, subject) : result;
}
return result;
}
}
이렇게 코드를 완성 했는데..
콘솔창에서 내 입력값을 안 받아준다
인텔리제이 설정 상의 문제인가 싶어 기본 코드를 입력해봤는데 걔는 받아줌..
뭐가 문제지? -> 무한 루프가 돌아서..
result = find(subject, i);
result = Math.max(result, 과목)
일단 위의 오류사항? 반영..
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sub = new Scanner(System.in);
int x = sub.nextInt();
int y = sub.nextInt();
int[][] subject = new int[y][2];
for(int i=0; i<y; i++) {
subject[i][0] = sub.nextInt();
subject[i][1] = sub.nextInt();
}
String answer = "";
for(int i=1; i<x+1; i++) {
int a = 0;
int result = i;
do {
a++;
result = find(subject, result);
} while (result != 0);
answer += i!=x ? a + " " : a;
}
System.out.println(answer);
}
public static int find(int[][] arr, int subject) {
int result = 0;
for(int i=0; i<arr.length; i++) {
result = arr[i][1] == subject ? arr[i][0] : result;
}
return result;
}
}

Main
선수과목 찾기 함수(find)
(매개변수로 과목, 배열을 넣어)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sub = new Scanner(System.in);
int x = sub.nextInt();
int y = sub.nextInt();
int[][] subject = new int[y][2];
for(int i=0; i<y; i++) {
subject[i][0] = sub.nextInt();
subject[i][1] = sub.nextInt();
}
int[] answer = new int[x];
String end = "";
for(int i=0; i<y; i++) {
int a = 1;
int result = subject[i][0];
do {
a++;
result = find(subject, result);
} while (result != 0);
answer[subject[i][1]-1] = Math.max(answer[subject[i][1]-1], a);
}
for(int i=0; i<answer.length; i++) {
end += answer[i] == 0 ? 1 + " " : answer[i] + " ";
}
end = end.substring(0, end.length() - 1);
System.out.println(end);
}
public static int find(int[][] arr, int subject) {
int result = 0;
for(int i=0; i<arr.length; i++) {
result = arr[i][1] == subject ? arr[i][0] : result;
}
return result;
}
}

재귀함수
- 함수 내부에서 자신을 참조(호출)하는 함수
- 필수 조건 : 재귀 함수 내부에 재귀의 탈출조건이 있어야 함
- 참고한 블로그
내가 한 건 재귀가 아니라 냅다 반복한 거였음..
import java.util.Scanner;
public class Main {
static Scanner sub = new Scanner(System.in);
static int x = sub.nextInt();
static int y = sub.nextInt();
public static void main(String[] args) {
int[][] subject = new int[y][2];
for(int i=0; i<y; i++) {
subject[i][0] = sub.nextInt();
subject[i][1] = sub.nextInt();
}
int[] answer = new int[x];
String end = "";
for(int i=0; i<y; i++) {
int result = find(subject, subject[i][1]);
answer[subject[i][1]-1] = Math.max(answer[subject[i][1]-1], result);
}
for(int i=0; i<answer.length; i++) {
end += answer[i] == 0 ? 1 + " " : answer[i] + " ";
}
end = end.substring(0, end.length() - 1);
System.out.println(end);
}
public static int find(int[][] arr, int subject) {
for(int i=0; i<y; i++) {
if (arr[i][1] == subject) {
return 1 + find(arr, arr[i][0]);
}
}
return 1;
}
}

ArrayList
- 배열을 기반으로 한 컬렉션
- 데이터를 추가, 삭제 시 내부에서 동적으로 배열의 길이를 조절
- ArrayList - 나의 기술 블로그
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
static Scanner sub = new Scanner(System.in);
static int x = sub.nextInt();
static int y = sub.nextInt();
static List<Integer>[] presubject = new ArrayList[x];
public static void main(String[] args) {
for(int i=0; i<x; i++) {
presubject[i] = new ArrayList<>();
}
for(int i=0; i<y; i++) {
int subj = sub.nextInt();
int ject = sub.nextInt();
presubject[ject-1].add(subj-1);
}
int[] answer = new int[x];
String end = "";
for(int i=0; i<x; i++) {
answer[i] = find(i, answer);
end += answer[i] + " ";
}
end = end.substring(0, end.length() - 1);
System.out.println(end);
}
public static int find(int subject, int[] answer) {
if (answer[subject] != 0 ) return answer[subject];
int maxN = 1;
for(int pre : presubject[subject]) {
maxN = Math.max(maxN, 1+find(pre, answer));
}
return maxN;
}
}
ArrayList<>를 사용해서 과목 인덱스에 각각의 선수 과목을 넣어줌..List<Iteger>[] 선언