자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 2. Array(4)

2024. 2. 22. 17:43Algorithm/inflearn

10. 봉우리

 

 

<나의 풀이>

- 배열을 n+2크기로 잡아, 행과 열의 인덱스0과 n+1에 0을 채워줌(생성하면 자동으로 0으로 초기화)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n=Integer.parseInt(br.readLine());
		int[][] arr=new int[n+2][n+2];
		StringTokenizer st;
		
		for(int i=0;i<n;i++) {
			String s=br.readLine();
			st=new StringTokenizer(s);
			
			for(int j=0;j<n;j++) {
				int num=Integer.parseInt(st.nextToken());
			
				arr[i+1][j+1]=num;
				
			}
		}
		
		int cnt=0;
		
		for(int i=1;i<n+1;i++) {
			for(int j=1;j<n+1;j++) {
				if((arr[i][j]>arr[i][j-1])&&(arr[i][j]>arr[i][j+1])&&(arr[i][j]>arr[i-1][j])&&(arr[i][j]>arr[i+1][j])) {
					cnt++;
				}
			}
		}
		
		System.out.println(cnt);
		
	}

}

 

 

<해설>

- dx, dy 배열 좌표를 둠으로서, 반복하여 상하좌우 좌표 값을 확인할 수 있다.

import java.util.*;
class Main {	
	int[] dx={-1, 0, 1, 0};
	int[] dy={0, 1, 0, -1};
	public int solution(int n, int[][] arr){
		int answer=0;
		for(int i=0; i<n; i++){
			for(int j=0; j<n; j++){
				boolean flag=true;
				for(int k=0; k<4; k++){
					int nx=i+dx[k];
					int ny=j+dy[k];
					if(nx>=0 && nx<n && ny>=0 && ny<n && arr[nx][ny]>=arr[i][j]){
						flag=false;
						break;
					}
				}
				if(flag) answer++;
			}
		}
		return answer;
	}

	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		int n=kb.nextInt();
		int[][] arr=new int[n][n];
		for(int i=0; i<n; i++){
			for(int j=0; j<n; j++){
				arr[i][j]=kb.nextInt();
			}
		}
		System.out.print(T.solution(n, arr));
	}
}

 

11. 임시반장 정하기

 

<나의 풀이>

- set을 사용하여 중복으로 같은반 학생을 했던 친구를 넣지않게 함

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n=Integer.parseInt(br.readLine());	//학생수
		int[][] cla=new int[n][5];
		StringTokenizer st;
		
		for(int i=0;i<n;i++) {
			String s=br.readLine();
			st=new StringTokenizer(s);
			
			for(int j=0;j<5;j++) {
				int num=Integer.parseInt(st.nextToken());
				
				cla[i][j]=num;
			}
		}
		
		int[] ans=new int[n];
		Set<Integer> tot=new HashSet<>();
		
		for(int i=0;i<n;i++) {
			for(int j=0;j<5;j++) {
				for(int z=0;z<n;z++) {
					int ban=cla[i][j];
					
					if(ban==cla[z][j]) {
						if(i!=z) tot.add(z+1);
					}
				}
			}
			ans[i]=tot.size();
			
			tot=new HashSet<>();
		}
		
		int max=Integer.MIN_VALUE;
		int maxIdx=0;
		
		for(int i=0;i<n;i++) {
			if(max<ans[i]) {
				max=ans[i];
				maxIdx=i;
			}
		}
		
		System.out.println(maxIdx+1);
	}

}

 

 

<해설>

- solution 메소드: i, j는 학생 수/ k는 반

- break는 꼭 해줘야함 , 안해주면 같은 반 한 친구가 중복으로 카운팅 됨

import java.util.*;
class Main {	
	public int solution(int n, int[][] arr){
		int answer=0, max=0;
		for(int i=1; i<=n; i++){
			int cnt=0;
			for(int j=1; j<=n; j++){
				for(int k=1; k<=5; k++){
					if(arr[i][k]==arr[j][k]){
						cnt++;
						break;
					}
				}
			}
			if(cnt>max){
				max=cnt;
				answer=i;
			}
		}
		return answer;
	}

	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		int n=kb.nextInt();
		int[][] arr=new int[n+1][6];
		for(int i=1; i<=n; i++){
			for(int j=1; j<=5; j++){
				arr[i][j]=kb.nextInt();
			}
		}
		System.out.print(T.solution(n, arr));
	}
}

 

 

 

 


 

12. 멘토링

 

 

<나의 풀이>

- 오답 => 추후 풀이

package inflearn_java;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Ex2_12 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String s=br.readLine();
		StringTokenizer st=new StringTokenizer(s);
		
		int n=Integer.parseInt(st.nextToken()); //학생 수
		int m=Integer.parseInt(st.nextToken()); //테스트 수
		int[][] game=new int[m][n];
		
		for(int i=0;i<m;i++) {
			s=br.readLine();
			st=new StringTokenizer(s);
			
			for(int j=0;j<n;j++) {
				int num=Integer.parseInt(st.nextToken());
				game[i][j]=num;
			}
		}
		
		int tot=0;
		
		for(int i=0;i<n;i++) {
			int cnt=0;
			int minScore=Integer.MIN_VALUE;
			
			for(int j=0;j<m;j++) {
				for(int k=0;k<n;k++) {
					if(game[j][k]==i+1&&minScore<k+1) {
						//본인이면
						minScore=k+1;
						cnt=n-minScore;
					}	
				}
			}
			tot+=cnt;
			//System.out.println("cnt: "+cnt);
		}
		
		System.out.println(tot);
		
	}

}

 

 

<해설>

- 4중 for 문

- 최대 경우의 수는 n*n

=> 짝을 지을 수 있는 모든 경우의 수를 체크하기 위해 1~n 이중 for문을 사용

import java.util.*;
class Main {	
	public int solution(int n, int m, int[][] arr){
		int answer=0;
		for(int i=1; i<=n; i++){
			for(int j=1; j<=n; j++){
				int cnt=0;
				for(int k=0; k<m; k++){
					int pi=0, pj=0;
					for(int s=0; s<n; s++){
						if(arr[k][s]==i) pi=s;
						if(arr[k][s]==j) pj=s;
					}
					if(pi<pj) cnt++;
				}
				if(cnt==m){
					answer++;
					//System.out.println(i+" "+j);
				}
			}
		}
		return answer;
	}

	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		int n=kb.nextInt();
		int m=kb.nextInt();
		int[][] arr=new int[m][n];
		for(int i=0; i<m; i++){
			for(int j=0; j<n; j++){
				arr[i][j]=kb.nextInt();
			}
		}
		System.out.print(T.solution(n, m, arr));
	}
}