자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 2. Array(4)
2024. 2. 22. 17:43ㆍAlgorithm/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));
}
}
'Algorithm > inflearn' 카테고리의 다른 글
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 3. Two pointers, Sliding window(1) (0) | 2024.02.26 |
---|---|
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 2. Array(3) (0) | 2024.02.20 |
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 2. Array(2) (0) | 2024.02.19 |
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 2. Array(1) (1) | 2024.02.13 |
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 1. 문자열(3) (1) | 2024.02.07 |