코딩/2-JAVA

C0701검색 ~ C0702중복금지

tree0505 2025. 6. 24. 10:05
반응형
    • 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문의 인덱스 → 출력 중인 현재 위치
    💡 즉, "출력 중인 현재 위치 j가, 현재 줄의 '내 자리'인 i와 같을 때", 그 자리에 *을 출력하라는 뜻입니다.
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 {
          // 위 조건들이 모두 거짓일 때 실행
      }
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-- 뒤에서 앞쪽으로 거꾸로 보기 "오른쪽에서 왼쪽으로 탐색"
  • 기준이 되는 건 항상 첫 번째 for문인가?
    • 네, 보통 **"기준이 되는 값"**은 **첫 번째 for문(i)**에서 돌게 하고,
      **"그 기준과 비교하거나 조사할 대상"**은 **두 번째 for문(j)**에서 돌게 됩니다.
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. 셔플 
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] +" ");
	    	}
	    }
	   
	}
}
반응형