반응형
- C07셀프완전탐색
- C0701검색
- C0701개념01_전체검색
- 언제 많이 사용하는가. 셀프완전탐색
- 1001,김철수,사원1003
- 1002,이민수,사원,1004
- 1003,조정민,주임,1006
- 1004,이철민,과장,1005
- 1005,이상철,부장,1006
- 1006,이사장,사장,
- 자신이 나머지를 검사할 때.
- 언제 많이 사용하는가. 셀프완전탐색
package C0701검색;
public class C0701개념01_전체검색 {
public static void main(String[] args) {
/*
[문제]
배열의 각각의 값들 수만큼 반복하면서
배열전체를 출력하시오.
[정답]
10 20 30 40 30 10 50 60
10 20 30 40 30 10 50 60
10 20 30 40 30 10 50 60
10 20 30 40 30 10 50 60
10 20 30 40 30 10 50 60
10 20 30 40 30 10 50 60
10 20 30 40 30 10 50 60
10 20 30 40 30 10 50 60
*/
int[] arr = {10, 20, 30, 40, 30, 10, 50, 60};
//셀프완전탐색
//각각의 값이 나머지를 전부 검사하는것
//다른것을 다 검사하는것
//10이 나머지를 전부 검사. 20이 나머지를 전부 검사. .....
for(int i = 0; i<arr.length; i++) {
for(int j = 0; j < arr.length; j++){
System.out.print(arr[j] + " ");
}
System.out.println();
}
}
}
- C0701개념02_나와같은값검색
package C0701검색;
public class C0701개념02_나와같은값검색 {
public static void main(String[] args) {
/*
[문제]
각각의 배열의 값들이 배열전체의 값들과 하나씩 비교해서 서로 같은값을 출력하시오.
단, 서로 같은값이 아닐때에는 0을 출력하시오.
[정답]
10 0 0 0 0 10 0 0
0 20 0 0 0 0 0 0
0 0 30 0 30 0 0 0
0 0 0 40 0 0 0 0
0 0 30 0 30 0 0 0
10 0 0 0 0 10 0 0
0 0 0 0 0 0 50 0
0 0 0 0 0 0 0 60
*/
int[] arr = {10, 20, 30, 40, 30, 10, 50, 60};
for(int i = 0; i<arr.length; i++) {
int a = arr[i];
for(int j = 0; j < arr.length; j++){
int b = arr[j];
if(a == b){
System.out.print(arr[j] + " ");
}else{
System.out.print(0 + " ") ;
}
}
System.out.println();
}
}
}
- C0701개념03_내앞만출력
package C0701검색;
public class C0701개념03_내앞만출력 {
public static void main(String[] args) {
/*
[문제]
각각의 배열의 값들이 배열전체의 값들과 비교하면서 현재값의 앞에 위치한 값들만 출력하시오.
[정답]
=10
10 =20
10 20 =30
10 20 30 =40
10 20 30 40 =30
10 20 30 40 30 =10
10 20 30 40 30 10 =50
10 20 30 40 30 10 50 =60
*/
int[] arr = {10, 20, 30, 40, 30, 10, 50, 60};
for(int i = 0; i<arr.length; i++) {
//i가 0,1,2,3,4,5,6,7 만큼 증가
for(int j = 0; j < i; j++){
System.out.print(arr[j] + " ");
}
System.out.println("="+arr[i]);
}
}
}
- C0701개념04_내뒤만출력
package C0701검색;
public class C0701개념04_내뒤만출력 {
public static void main(String[] args) {
/*
[문제]
각각의 배열의 값들이 배열전체의 값들과 비교하면서 현재값의 뒤에 위치한 값들만 출력하시오.
[정답]
10=20 30 40 30 10 50 60
20=30 40 30 10 50 60
30=40 30 10 50 60
40=30 10 50 60
30=10 50 60
10=50 60
50=60
60=
*/
int[] arr = {10, 20, 30, 40, 30, 10, 50, 60};
for(int i = 0; i<arr.length; i++) {
System.out.print(arr[i]+"=");
for(int j = i + 1; j < arr.length; j++){
System.out.print(arr[j] + " ");
}
System.out.println();
}
}
}
- C0701검색_문제
- C0701문제01
- 📌 정리
- 셀프완전탐색은 "내 자신을 기준으로 전체를 비교하는 탐색".
- 앞쪽 요소까지 보는 이유: 나보다 앞에 있더라도, 나보다 큰 값일 수 있기 때문.
- 의도: 각 원소에 대해 자신보다 큰 값들을 전체 배열에서 찾아서 표현하려는 것.
- 📌 정리
package C0701검색_문제;
public class C0701문제01 {
public static void main(String[] args) {
/*
[문제]
각가의 배열의 값들이 나머지값들과 비교해서 현재의 배열값보다 큰값들만 출력하시오.
단, 같거나 작을때에는 0을 출력하시오.
[정답]
0 20 30 40 30 0 50 60
0 0 30 40 30 0 50 60
0 0 0 40 0 0 50 60
0 0 0 0 0 0 50 60
0 0 0 40 0 0 50 60
0 20 30 40 30 0 50 60
0 0 0 0 0 0 0 60
0 0 0 0 0 0 0 0
*/
int[] arr = {10, 20, 30, 40, 30, 10, 50, 60};
for(int i = 0; i<arr.length; i++) {
//바깥쪽 for문은 기준이 되는 요소를 하나씩 선택합니다.
//!!! i번째 요소를 기준으로, 그 값보다 큰 값을 찾아내려고 해요.
//첫번째 for가 검사 기준이다.
int a = arr[i];
for(int j = 0; j<arr.length; j++) {
//안쪽 for문은 그 기준값을 가지고 전체 배열과 비교하는 역할
//안쪽 for문은 배열 전체를 다시 돌면서, 기준값 a보다 큰 값을 찾기 위한 반복문이에요.
//이게 바로 **"셀프 완전탐색"**의 핵심: 자기 자신 포함해서 전체를 검사해요.
int b = arr[j]; //현재 비교 대상이 되는 요소 b를 저장합니다.
if(a<b) {
System.out.print(arr[j]+" ");
}else {
System.out.print(0 +" ");
}
}
System.out.println();
}
}
}
- C0701문제02
- 🧠 두 변수의 역할 정리
-
변수 역할 반복 범위 의미
i 바깥쪽 루프 0부터 arr.length-1까지 지금 몇 번째 줄을 출력 중인가? (= 기준 자리) j 안쪽 루프 0부터 arr.length-1까지 지금 한 줄에서 어떤 위치를 출력하고 있나?
- ❓ 정확한 의미: if (i == j)
- 이 조건은 현재 줄에서 *을 출력할 자리를 결정합니다.
- i는 바깥 for문의 인덱스 → 현재 줄에서 "내 자리"
- j는 안쪽 for문의 인덱스 → 출력 중인 현재 위치
package C0701검색_문제;
public class C0701문제02 {
public static void main(String[] args) {
/*
[문제]
배열의 각각의 값들 수만큼 반복하면서
배열전체를 출력하시오.
단, 내자리는 숫자대신 * 을출력하시오.
[정답]
* 20 30 40 30 10 50 60
10 * 30 40 30 10 50 60
10 20 * 40 30 10 50 60
10 20 30 * 30 10 50 60
10 20 30 40 * 10 50 60
10 20 30 40 30 * 50 60
10 20 30 40 30 10 * 60
10 20 30 40 30 10 50 *
*/
int[] arr = {10, 20, 30, 40, 30, 10, 50, 60};
for(int i = 0; i<arr.length; i++) {
//바깥쪽 for문: 기준 위치를 정하는 역할
//한 줄을 출력할 때, 내 자리를 정하는 것이 바로 i입니다.
//지금 출력 중인 줄에서 어떤 위치에 *을 찍을지 결정하는 인덱스가 i다
//즉, i는 자기 자리, j는 전체 반복 출력 중인 현재 위치예요.
//예: i = 0이면, 0번째 자리에 *을 찍고, 나머지는 숫자를 그대로 출력
for(int j = 0; j<arr.length; j++) {
//안쪽 for문: 배열을 처음부터 끝까지 돌면서, 출력할 값을 선택합니다.
//이 루프는 실제로 한 줄에 어떤 값을 출력할지 결정합니다.
if(i == j) {
System.out.print("* ");
}else {
System.out.print(arr[j]+" ");
}
}
System.out.println();
}
}
}
- C0701문제03
- if (조건1) {
// 조건1이 참일 때 실행되는 코드
} else if (조건2) {
// 조건1이 거짓이고, 조건2가 참일 때 실행
} else {
// 위 조건들이 모두 거짓일 때 실행
}
- if (조건1) {
package C0701검색_문제;
public class C0701문제03 {
public static void main(String[] args) {
/*
[문제]
각각의 배열의 값들이 나머지값들과 비교해서 현재의 배열값보다 다른값만 출력하시오.
단, 값이 같은때에는 #을 출력하시오.
그리고, 내자리는 숫자대신 "*" 을출력하시오.
[정답]
* 20 30 40 30 # 50 60
10 * 30 40 30 10 50 60
10 20 * 40 # 10 50 60
10 20 30 * 30 10 50 60
10 20 # 40 * 10 50 60
# 20 30 40 30 * 50 60
10 20 30 40 30 10 * 60
10 20 30 40 30 10 50 *
*/
int[] arr = {10, 20, 30, 40, 30, 10, 50, 60};
for(int i = 0; i<arr.length; i++) {
int a = arr[i]; // 기준값
//바깥쪽 반복문의 현재 인덱스 i를 기준값으로 잡음.
//즉, 이 줄에서는 arr[i]를 기준으로 배열 전체를 비교합니다.
for(int j = 0; j<arr.length; j++) {
int b = arr[j]; // 비교 대상값
//안쪽 반복문이 돌아가며 배열의 모든 값(arr[j])과 기준값 a를 비교할 준비.
if(a != b) {
//기준값 a와 비교 대상 b가 다르면, b 그대로 출력
// 다르면 무조건 출력하고 끝
System.out.print(arr[j]+" ");
}else if(i == j) {
//a와 b가 같지만, 현재 위치가 자기 자신일 때 즉, 자기 자리일 때는 * 출력
// 값이 같을 때만 오는데, 자기 자리면 *
System.out.print("* ");
}else {
//a와 b가 같고, i ≠ j → 내 자리는 아닌데, 값이 같은 경우
//이럴 땐 # 출력
//값이 같고, 자기 자리도 아니면 #
System.out.print("# ");
}
}
System.out.println();
}
}
}
- C0701문제04
- 우왕 내가 풀었는데. 거의 맞음
- 출력을 반복문 안에서 하니까. 이상하게 나왔음
if(a == b) {
count += 1;
// System.out.print(count);
}
package C0701검색_문제;
public class C0701문제04 {
public static void main(String[] args) {
/*
[문제]
각가의 배열의 값들이 나머지값들과 비교해서 현재의 배열값과 같은값의 개수를 출력하시오.
단, 같거나 작을때에는 0을 출력하시오.
[정답]
10:2
20:1
30:2
40:1
30:2
10:2
50:1
60:1
*/
int[] arr = {10, 20, 30, 40, 30, 10, 50, 60};
for(int i = 0; i<arr.length; i++) {
int count = 0;
int a = arr[i];
//System.out.print(arr[i] +" : ");
for(int j = 0 ; j<arr.length; j++) {
int b = arr[j];
if(a == b) {
count += 1;
// System.out.print(count);
}
}
System.out.println(a + ":" + count);
}
}
}
- C0701문제05
- 우왕!~~~ 내가 한거 맞았따````````````````````````````
package C0701검색_문제;
public class C0701문제05 {
public static void main(String[] args) {
/*
[문제]
각가의 배열의 값들이 나머지값들과 비교해서 현재의 배열값과 같은값의 개수를 출력하시오.
단, 같거나 작을때에는 0을 출력하시오.
[정답]
10:6
20:5
30:3
40:2
30:3
10:6
50:1
60:0
*/
int[] arr = {10, 20, 30, 40, 30, 10, 50, 60};
for(int i = 0; i<arr.length; i++) {
int a = arr[i];
int count = 0;
for(int j = 0; j<arr.length; j++) {
int b = arr[j];
if(a < b ) {
count += 1;
}
}
System.out.println(arr[i] + " : " +count);
}
}
}
- C0701문제06
- ✨ j < i를 잘 쓰는 방법 (응용력 키우는 법)
- "나는 지금 **누구 기준(i)**으로"
- "**누구와 비교(j)**하려고 하지?"
- 그럼 j는 어디서부터 어디까지 돌아야 해?
- "i번째 값 기준으로, 그 앞의 값들과 비교하고 싶어"
→ 자연스럽게 j < i가 떠오름!
- 🎯 1. "누구를 기준으로, 무엇을 비교하는가?" 질문하기
- 🎯 2. 다양한 패턴을 연습해보기
- 패턴 설명 예제 문제
j = 0; j < arr.length; j++ 전체 탐색 최대값 찾기 j = 0; j < i; j++ 내 앞만 보기 "내 앞에 나보다 큰 수 찾기" j = i + 1; j < arr.length; j++ 내 뒤만 보기 "뒤에서 나보다 큰 값 찾기" j = i - 1; j >= 0; j-- 뒤에서 앞쪽으로 거꾸로 보기 "오른쪽에서 왼쪽으로 탐색"
- ✨ j < i를 잘 쓰는 방법 (응용력 키우는 법)
- 기준이 되는 건 항상 첫 번째 for문인가?
- 네, 보통 **"기준이 되는 값"**은 **첫 번째 for문(i)**에서 돌게 하고,
**"그 기준과 비교하거나 조사할 대상"**은 **두 번째 for문(j)**에서 돌게 됩니다.
- 네, 보통 **"기준이 되는 값"**은 **첫 번째 for문(i)**에서 돌게 하고,
package C0701검색_문제;
public class C0701문제06 {
public static void main(String[] args) {
/*
[문제]
각각의 배열의 값들이 배열전체의 값들과 비교하면서 현재값의 앞에 위치한 값들만 출력하시오.
단, 내앞의 값둘중 나보다 큰값들만 출력하시오.
[정답]
=10
=20
=30
=40
40 =30
20 30 40 30 =10
=50
=60
*/
int[] arr = {10, 20, 30, 40, 30, 10, 50, 60};
for(int i = 0; i<arr.length; i++) {
int a = arr[i]; // 현재 기준값 a 설정
for(int j = 0; j<i; j++) { // 내 앞쪽 값만 비교
//j < i
//이건 **"현재 위치(i) 이전의 값들만 검사하겠다"**는 뜻이에요.
//j < arr.length
//이건 배열 전체를 비교하게 되므로
//내 앞이 아닌 뒤쪽 값들까지 포함하게 돼요
//그래서 이 문제에서 원하는 **"내 앞만 검사"**와는 맞지 않아요
int b = arr[j];
if(a < b) { // 앞의 값이 현재 값보다 크면
System.out.print(arr[j] +" ");
}
}
System.out.println("=" + arr[i]); // 현재 값 출력
}
}
}
- C0701문제07
package C0701검색_문제;
public class C0701문제07 {
public static void main(String[] args) {
/*
[문제]
각각의 배열의 값들이 배열전체의 값들과 비교하면서 현재값의 뒤에 위치한 값들만 출력하시오.
단, 내뒤의 값둘중 나보다 큰값들만 출력하시오.
[정답]
20 30 40 30 50 60 =10
30 40 30 50 60 =20
40 50 60 =30
50 60 =40
50 60 =30
50 60 =10
60 =50
=60
*/
int[] arr = {10, 20, 30, 40, 30, 10, 50, 60};
for(int i = 0; i<arr.length; i++) {
int a = arr[i];
for(int j = i+1; j<arr.length; j++) {
//int j = 0; j>i; j++ => 잘못됨
int b = arr[j];
if(a < b) {
System.out.print(b +" ");
}
}
System.out.println("=" + arr[i]);
}
}
}
- C0701문제08
package C0701검색_문제;
public class C0701문제08 {
public static void main(String[] args) {
/*
[문제]
각각의 배열의 값들이 배열전체의 값들과 비교하면서 현재값의 앞에 위치한 값들만 출력하시오.
단, 내앞의 값둘중 나보다 큰값들만 출력하시오.
[정답]
=10
=20
=30
=40
40 =30
20 30 40 30 =10
=50
=60
*/
int[] arr = {10, 20, 30, 40, 30, 10, 50, 60};
for(int i = 0; i<arr.length; i++) {
int a = arr[i];
for(int j = 0; j<i; j++) {
//j<i => 검사 기준보다 앞을 검사.
int b = arr[j];
if(a<b) {
System.out.print(arr[j] +" ");
}
}
System.out.println("=" + arr[i]);
}
}
}
- C0702 중복금지
- C0702개념01_중복숫자해결
package C0702중복금지;
import java.util.Arrays;
import java.util.Random;
/*
# 중복숫자 금지 해결방법
[방법] 전체 검사
*/
public class C0702개념01_중복숫자해결 {
public static void main(String[] args) {
Random ran = new Random();
int arr[] = new int[4];
/*
[풀이]
2 1 1 3 2 2 4
i = 0, r = 2,
j반복X arr = [2, 0, 0, 0]
i = 1, r = 1,
j = 0 check = false arr = [2, 1, 0, 0]
i = 2, r = 1,
j = 0
j = 1 check = true arr = [2, 1, 0, 0]
i = 2, r = 3,
j = 0
j = 1 check = false arr = [2, 1, 3, 0]
i = 3, r = 2
j = 0
j = 1
j = 2 check = true
i = 3, r = 2
j = 0
j = 1
j = 2 check = true
i = 3, r = 4
j = 0
j = 1
j = 2 check = false arr = [2, 1, 3, 4]
*/
//내 앞만 검사
for(int i = 0; i < 4; ) {
int rNum = ran.nextInt(4) + 1;
System.out.println(rNum);
boolean check = false;
for(int j=0; j<i; j++) {
//j<i => 내 앞만 검사한것
if(rNum == arr[j]) {
check = true;
}
}
if(check == false) {
arr[i] = rNum;
i += 1;
}
}
System.out.println(Arrays.toString(arr));
}
}
- C0702개념02로또
- 중복검사가 크게 3가지가 있다.
- 1. for for => 내 앞만 검사
- 내 앞을 검사해서. 내 앞에 똑같은 숫자가 있는지 검사
- 2. 메모리를 늘려서 => for 1번
- arr = [ 1, 2, 3, 4]
- check = [ f , f, f, f]
- 원하는 숫자를 넣을 때마다. 그 자리에 true로 바꾸는것
- 3. 셔플
- 1. for for => 내 앞만 검사
- 중복검사가 크게 3가지가 있다.
package C0702중복금지;
import java.util.Arrays;
import java.util.Random;
/*
[문제]
1 ~ 45 사이의 랜덤 값 6개를 lotto배열에 저장한다.
단, 중복되는 숫자는 없어야 한다.
*/
public class C0702개념02로또 {
public static void main(String[] args) {
Random ran = new Random();
int[] lotto = new int[6];
// 중복숫자 금지 2단계
// check배열은 랜덤 숫자의 범위를 따라야 함.(0 ~ 44)
boolean[] check = new boolean[45];
for(int i=0; i<6; i++) {
int r = ran.nextInt(45);
System.out.println(r);
if(check[r] == false) {
check[r] = true;
lotto[i] = r + 1;
} else {
i -= 1;
}
}
System.out.println(Arrays.toString(lotto));
System.out.println(Arrays.toString(check));
}
}
- C0702개념03로또2
package C0702중복금지;
import java.util.Arrays;
import java.util.Random;
/*
[문제]
1 ~ 45 사이의 랜덤 값 6개를 lotto배열에 저장한다.
단, 중복되는 숫자는 없어야 한다.
*/
public class C0702개념03로또2 {
public static void main(String[] args) {
Random ran = new Random();
int[] lotto = new int[6];
// 중복숫자해결
// 내 앞만 검사
lotto = new int[6];
for(int i=0; i<6; ) {
int r = ran.nextInt(45) + 1;
boolean result = false;
for(int j=0; j<i; j++) {
if(r == lotto[j]) {
result = true;
break;
}
}
if(result == false) {
lotto[i] = r;
i += 1;
}
}
System.out.println(Arrays.toString(lotto));
}
}
- C0702중복금지 _문제
- C0702문제01
package C0702중복금지_문제;
public class C0702문제01 {
public static void main(String[] args) {
/*
[문제]
arr배열에서 혼자있는 숫자만 출력하시오.
[정답]
20 50
*/
int[] arr = {10, 20, 30, 40, 40, 10, 30, 10, 50};
for(int i = 0; i<arr.length; i++) {
int count = 0;
for(int j = 0; j<arr.length; j++) {
if(arr[i] == arr[j]) {
count += 1;
}
}
if(count == 1) {
System.out.print(arr[i] +" ");
}
}
}
}
반응형
'코딩 > 2-JAVA' 카테고리의 다른 글
C0801보통완전탐색 , C0802보통완전탐색데이터 , C0803중복해결 (1) | 2025.06.24 |
---|---|
C0703규칙찾기 ~ C0704셀프완전탐색입력 (0) | 2025.06.24 |
C0606중첩반복입력 (0) | 2025.06.24 |
C06중첩반복 => C0601중첩반복 ~ C0605소수여러개 (0) | 2025.06.23 |
C05배열과데이터 (0) | 2025.06.23 |