🔷 문제의 해법으로 생각할 수 있는 모든 경우의 수를 나열해보고 확인하는 기법
Brute-force(브루트포스)
혹은 Generate-and-Test
기법이라고도 한다.💡 알고리즘 문제 풀이 시에 완전 검색으로 먼저 접근한 뒤에 다른 알고리즘으로 성능 개선을 하는 것이 가장 바람직하다.
🔷 순열(Permutation)
: 서로 다른 것들 중 몇 개를 뽑아서 한 줄로 나열하는 것
int [] cards = {1 ,5, 9};
int N = cards.length;
// 반복문을 이용한 순열 만들기
// 첫번째 카드 뽑기
for(int i =0; i < N; i++) {
// 두번째 카드 뽑기
for(int j =0; j < N; j++) {
// i와 j가 같지 않을 떄
if(i != j) {
for(int k =0; k < N; k++) {
// k가 i, j 와 같지 않을 때
if(k != i && k != j) {
System.out.println(cards[i] + " " + cards[j] + " " + cards[k]);
}
}
}
}
}
🔷 최적해를 구하는 데 사용되는 가장 근시안적인 방법
머릿속에 떠오르는 생각을 검증없이 바로 구현하면 그게 곧 그리디
(난가?)
🔷 동작 과정
1) 해 선택
: 현재 상태에서 부분 문제의 최적 해를 구한 뒤, 이를 부분 해 집합에 추가한다.
2) 실행 가능성 검사
: 새로운 부분해 집합이 실행 가능한지를 확인한다. 곧, 문제의 제약 조건을 위반하지 않는지 검사한다.
3) 해 검사
: 새로운 부분해 집합이 문제의 해가 되는지를 확인하고 아직 전체 문제의 해가 완성되지 않았다면 1)의 해 선택부터 다시 시작한다.
🔷 선언
int [][] arr = new int [2][3];
🔷 순회
int [][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int N = arr.length;
int M = arr[0].length;
// 행 우선 순회
System.out.print("행 우선 순회: ");
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
System.out.print(arr[i][j] + " ");
}
}
System.out.println();
// 행 우선 역순회
System.out.print("행 우선 역순회: ");
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
System.out.print(arr[i][M-1-j] + " ");
}
}
System.out.println();
// 열 우선 순회
System.out.print("열 우선 순회: ");
for(int j = 0; j < M; j++) {
for(int i = 0; i < N; i++) {
System.out.print(arr[i][j] + " ");
}
}
System.out.println();
// 열 우선 역순회
System.out.print("열 우선 역순회: ");
for(int j = 0; j < M; j++) {
for(int i = 0; i < N; i++) {
System.out.print(arr[N-1-i][j] + " ");
}
}
System.out.println();
// 지그재그 순회
System.out.print("지그재그 순회: ");
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
System.out.print(arr[i][j + (M-1-j-j) * (i%2)] + " ");
}
}
감사합니다. 이런 정보를 나눠주셔서 좋아요.