자료구조와 알고리듬 With Java/[인프런] Algorithm

Chapter 02. Array (1, 2차원 배열)

계란💕 2022. 4. 11. 16:01

1. 큰 수 출력하기

<hide/>
import java.util.*;
public class Main {

	public static void main(String[] args){
		Main T = new Main();
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		int[] arr = new int[n];
		
        for(int i = 0; i < n; ++i){
        	arr[i] = scan.nextInt();
        }
        
      	for(int x : T.solution(n, arr)){
          System.out.print(x + " ");     
        }
	}
	
	public ArrayList<Integer> solution(int n, int[] arr) {
		
		ArrayList<Integer> answer = new ArrayList<>();
		answer.add(arr[0]);
		for(int i = 1; i < n; ++i) {
			if(arr[i] > arr[i - 1]) {
				answer.add(arr[i]);
			}
		}
		return answer;
	}
}

  Note)

  - arrayList<> 형태로 반환하는 solution메서드 만든다.

  - solution(n, arr)을 for문에 넣고 하나씩 출력한다.

  - 배열의 맨 앞에 있는 값은 일단 넣는다.

 

 

2. 보이는 학생

<hide/>
import java.util.*;
public class Main {
  public static void main(String[] args){
    Main T = new Main();
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int [] arr = new int[n];
	for(int i = 0 ; i < n; ++i){
      	arr[i] = in.nextInt();
    }
    System.out.println(T.solution(n, arr));
    return ;
  }
  
  public int solution(int n, int[] arr){
  
 	int answer = 1, max = arr[0];	// 맨 앞의 학생은 일단 넣는다.
    for(int i = 1; i < n; ++i) {
    
      	if( arr[i] > max ) {
        	answer++;
          	max = arr[i];
        } 
    }
  	return answer;
  }
}

  Note)

  - int형  변수 max를 정한다. (초깃값은 배열의 맨 앞 값)

 

 

3. 가위바위보

<hide/>
import java.util.Scanner;
public class Main {
  public static void main(String[] args){
    Main T = new Main();
    Scanner in=new Scanner(System.in);
    int n = in.nextInt();
    int [] A = new int[n];
    int [] B = new int[n];
    
   for(int i = 0; i < n; ++i){
    	A[i] = in.nextInt();
    }
    
   for(int i = 0; i < n; ++i){
    	B[i] = in.nextInt();
    }
    
   for( int i = 0 ; i < n; ++i){
   		System.out.println(T.solution(A[i] , B[i]));
   } 
  }
  
  public char solution(int x , int y){
  	if( x == y )return 'D';
   	else if( x == 3 && y == 1 	||
           	 x == 2 && y == 3 	||
             x == 1 && y == 2 ) return 'B';
    return 'A';
  }
}

 

 

4. 피보나치 수열

<hide/>
import java.util.*;
public class Main {
  public static void main(String[] args){
    Main T = new Main();
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    for(int x : T.solution(n)){
    	System.out.print( x + " ");
    }
  }
  
  public int [] solution(int n){
    int [] answer = new int[n];
    answer[0] = 1;
    answer[1] = 1;
 	for(int i = 2; i < n; ++i){
    	answer[i] = answer[i-1] +  answer[i-2] ;
    }	   
  	return answer;
  }
}

  Note)

  - solution을 배열 형태로 반환한다.

  - 피보나치 수열의 각 항을 한 개씩 출력하도록 작성한다.

   

 

5. 에라토스테네스의 체

<hide/>
import java.util.Scanner;
public class Main {
  public static void main(String[] args){
   	Main T = new Main();
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    System.out.println(T.solution(n));
    return ;
  }
  
  public int solution(int n){
  
    int answer = 0; 
    int [] ch = new int[n + 1];
    
    for(int i = 2; i <= n; ++i){	// 2의 배수부터 시작한다.
    	if(ch[i] == 0){				// ch[i]가 0이면 소수니까 answer++해준다.
        	answer++;
          	for(int j = i; j <= n; j = j + i){	// j는 i의 배수로 돌아야한다.
            	ch[j] = 1;
            }
        }
    }
  	return answer;
  }
}

  Note)

  - 2부터 시작해서 입력받은 n까지 for문을 실행한다.

    -> 2의 배수, 3의 배수인 index에 대해 ch[i]에 1을 넣는다.

    -> ch[i] 가 0이면 소수이므로 카운트해서 반환하면 소수의 개수가 출력된다.

 

 

 

6. 뒤집은 소수

<hide/>
import java.util.*;
public class Main {
  public boolean isPrime(int num){
  	
    if(num == 1) return false;
    for(int i = 2; i < num ; ++i){
    	if(num % i == 0) return false;
    }
  	return true;
  }
  
  public static void main(String[] args){
    Scanner in=new Scanner(System.in);
   	Main T = new Main();
    int n = in.nextInt();
    int[] arr =  new int[n];
    for(int i = 0; i < n; ++i){
      arr[i] = in.nextInt();
    }
    for(int x : T.solution(n, arr)){
      	    System.out.print(x +" ");
    }
  }
  
  public ArrayList<Integer> solution(int n , int[] arr){
  		ArrayList<Integer> answer = new ArrayList<>();
    	for(int i = 0 ; i < n ; ++i){
        	int tmp = arr[i];
          	int res = 0;
        	while(tmp > 0){
            	int t = tmp % 10;
            	res = res * 10 + t;
            	tmp = tmp / 10;
        	}
          if(isPrime(res)) answer.add(res);
        }
  		return answer;
  }
}

  Note)

  - 소수인지 판단하기위해  isPrime()을 만든다.

 

 

7. 점수계산

<hide/>
import java.util.*;
public class Main {
	public static void main(String[] args){
    Main T = new Main();
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int [] arr = new int[n];
    
    for(int i = 0; i < n; ++i ){
      arr[i] = in.nextInt();
    }
    System.out.println(T.solution(n, arr));
    return ;
  }
  
	public int solution(int n, int[] arr){
   		int answer = 0, cnt = 0;
      	for(int i = 0; i < n ; ++i){
        	if(arr[i] == 1){
            	cnt++;
              	answer = answer + cnt;
            }else{
            	cnt = 0;
            }
        }
      	return answer;
    }
}

  Note)

  - cnt가 증가할 때마다 answer에 cnt를 누적시킨다.

  - arr[i]가 1일 때만 cnt증가 & answer에 누적한다.

 

 

8. 등수 구하기

<hide/>
import java.util.Scanner;
public class Main {
  public static void main(String[] args){
    Main T = new Main();
    Scanner in=new Scanner(System.in);
    int n = in.nextInt();
    int [] arr = new int[n];
    for(int i = 0; i < n; ++i ){
      arr[i] = in.nextInt();
    }
    for(int x : T.solution(n, arr)){
     	System.out.print(x +" ");
    }
  }
  
  public int []solution( int n, int[] arr){
  
    int [] answer = new int[n];
    for(int i = 0; i < n; ++i){
      int cnt = 1;
      for(int j = 0 ; j < n; ++j ){
      	if(arr[j] > arr[i]) cnt++;
      }
      answer[i] = cnt;
    }
    return answer;
  }
}

  Note)

  - arr[i] 보다 큰 arr[j]의 개수에 따라 cnt가 하나씩 증가한다.

  - 각각의 cnt에 대해 answer배열에 추가한다.

  - 순위를 세는 cnt는 1부터 시작한다.

 

 

9. 격자판 최대합

<hide/>
import java.util.*;
public class Main {
  public static void main(String[] args){
   
    Main T = new Main();
    Scanner in  =new Scanner(System.in);
    int n = in.nextInt();
    int[][] arr = new int[n][n];
    for(int i = 0; i < n ; ++i){
    	for(int j = 0; j < n ; ++j){
      		arr[i][j] = in.nextInt();
        }
    }
    System.out.println(T.solution(n, arr));
    return;
  }
  
  public int solution(int n, int[][] arr){
  	int answer = Integer.MIN_VALUE;
    int sum1 = 0, sum2 = 0;
    
    for(int i = 0;i < n; ++i){
    	sum1 = sum2 = 0; 
      for(int j = 0 ;j < n; ++j){
      	sum1 += arr[i][j]; 		// 행
        sum2 += arr[j][i];		// 열
      }
    	answer = Math.max(answer, sum1);
    	answer = Math.max(answer, sum2);
    }
    sum1 = sum2 = 0;
    
    for(int i = 0; i < n ; ++i){	// 대각선 합 구하기
    	sum1 += arr[i][i];
      	sum2 += arr[i][n-1-i];
      
    }
   		answer = Math.max(answer, sum1);
    	answer = Math.max(answer, sum2);
  	return answer;
  }
  
}

  Note)

  - 2차원 배열을 이용한다.

  - 가로줄 세로줄 대각선끼리의 합을 구해서 max와 비교한다.

  -  Math클래스의 max()메서드를 이용한다.

 

 

 

10. 봉우리

<hide/>
import java.util.Scanner;
public class Main {
  public static void main(String[] args){
    Main T = new Main();
    Scanner in=new Scanner(System.in);
    int n = in.nextInt();
    int [][] arr = new int[n+2][n+2];
    
    for(int i = 0; i < n+2; ++i){
      for(int j = 0; j < n+2; ++j){
      
        if(i == 0 || i == n + 1 || j == 0 || j == n + 1) arr[i][j] = 0;
        else{
        	arr[i][j] = in.nextInt();
        }        
      }
    }
    
    System.out.println(T.solution(n, arr));
    return ;
  }
 
  public int solution(int n, int [][] arr){
    int cnt = 0;
    for(int i= 1; i <= n; ++i){
      for(int j = 1; j <= n; ++j){
       	if(  arr[i][j] > arr[i-1][j] 
     		&& arr[i][j] > arr[i+1][j] 
      		&& arr[i][j] > arr[i][j-1] 
      		&& arr[i][j] > arr[i][j+1] 
      		) ++cnt;
      }
    }
    return cnt;
    }
}

 

 

 

11. 임시 반장 선정하기

<hide/>
import java.util.*;
public class Main {
  public int solution(int n, int[][] arr){
  
	int answer = 0;
    int max = 0;
    
	for(int i = 1; i <= n; ++i ){
    	int cnt = 0;							// 새로운 학생을 카운트 할 때마다 cnt 초기화
      	for(int j = 1; j <= n; ++j){ 			// i와 j가 같은 경우도 상관없다.
        	for(int k = 1; k <= 5; ++k){
            	if(arr[i][k] == arr[j][k]){		// 학생 i와 j가 k학년 때 같은 반인 경우 
                	cnt++;
                  	break;
                }
            }
        }
    	if(cnt > max){		// for문의 맨 아래마다 실행한다.
        	max = cnt;
          	answer = i;		// i번 학생이 반장으로 적절하다.
        }    
    }	
    return answer;
  }
  
  public static void main(String[] args){
    Main T = new Main();
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int [][] arr = new int[n+1][6];			// 	인덱스 1부터 사용하기 위해
    
    for(int i = 1; i <= n ;++i){
    	for(int j = 1; j <=5 ; ++j){		// 1~5학년 까지라서 j는 5까지
          arr[i][j] = in.nextInt();
        }
    }
    System.out.println(T.solution(n, arr));
  }
}

  Note)

  - i, j : 학생, (1 ~ n명 까지) , k : 1 ~5 (5학년 까지)

  - i, j가 같은 경우도 카운트해도 상관없다. 모든 학생에게 동등한 조건이기 때문.

  - 3중 for문 이용한다.

  - arr[][]은 n명의 학생에 대한 5학년 까지의 반 정보를 나타낸 것이다.

     -> index를 1부터 시작하기 위해 arr[n+1][5+1]로 사이즈를 맞춘다.

 

 

12. 멘토링

<hide/>
import java.util.*;
public class Main {
 	public int solution(int n, int m, int[][] arr){
    	int answer = 0;
      	for(int i = 1; i <= n ; ++i){		// 학생 1 ~ i번
        	for(int j = 1 ; j <= n; ++j){	// 학생 1 ~ j번
            	int cnt = 0; 
              		for(int k = 0; k < m; ++k){			// test 번호
                		int pi= 0, pj = 0;				// 일단, 0등으로 리셋
                  		for(int s = 0; s < n; ++s){		
                    		if(arr[k][s] == i) pi = s;	// 무조건 참이 되는 경우가 있다.
                    		if(arr[k][s] == j) pj = s;	// j번 학생의 등수를 넣어준다. 
                 		 }
                  		if(pi < pj) cnt++;	// 멘토의 등수는 멘티 등수보다 작은 숫자
               		 }
              	if(cnt == m) answer++;
            }
        }
      return answer;
    }
  
  public static void main(String[] args){
  	Main T = new Main();
    Scanner in=new Scanner(System.in);
    int n = in.nextInt();
    int m = in.nextInt();
	int[][] arr = new int[m][n];
    for(int i = 0; i < m; ++i){
    	for(int j = 0; j < n; ++j ){
        	arr[i][j] = in.nextInt();
        }
    }
    System.out.println(T.solution(n, m, arr));
    return ;
  }
}

  Note)

  - i: 멘토,  j: 멘티

  - k: 테스트 번호 ( 0번째 시험 ~ (m - 1)번째 시험 )

  - s: 0등 ~ (n - 1)등 까지

  - pi: i번 학생의 등수, pj: j번 학생의 등수

  - 시험 횟수: m, 학생 수: n 

  - 4중 for문을 이용한다.

  - 포인터 변수 pi, pj를 이용한다.

  - 자기 자신끼리 멘토 - 멘티가 되는 경우도 함께 카운트해도 상관 없다.

  - cnt가 테스트 횟수 m과 같아지면  m번 모두 앞서 있다는 뜻이므로 answer ++