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

2024. 2. 20. 11:30Algorithm/inflearn

 

7. 점수계산

 

 

<나의 풀이>

- 이기면(1을 만나면), cnt를 1 추가하고 tot에 누적하기

- 지면(0을 만나면), cnt 초기화

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 NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		String s = br.readLine();
		StringTokenizer st = new StringTokenizer(s);
		
		int cnt=0;
		int tot=0;
		for(int i=0;i<n;i++) {
			int res= Integer.parseInt(st.nextToken());
			
			if(res==1) {
				//이기면
				cnt++;
				tot+=cnt;
			}else {
				//지면
				if(cnt>0) {
					cnt=0;
				}
			}
		}
		
		System.out.println(tot);
		
	}

}

 

<해설>

- 나의 풀이와 같음

import java.util.*;
class Main {	
	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+=cnt;
			}
			else cnt=0;
		}	
		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];
		for(int i=0; i<n; i++){
			arr[i]=kb.nextInt();
		}
		System.out.print(T.solution(n, arr));
	}
}

 

 


 

 

8. 등수구하기

 

<나의 풀이>

- 점수를 list 두개(list, rankList)에 누적

- rankList: 점수 순서대로 list를 저장(Collections.sort(rankList, Comparator.reverseOrder()) 

- list 대로 다시 순환하며 각각의 순서를 찾아 출력(각 점수 rankList의 index+1)

- list.indexOf(): 같은 수면 제일 앞의 index를 가져오기 때문에 동일 등수로 출력된다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
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());
		String s = br.readLine();
		StringTokenizer st = new StringTokenizer(s);
		
		List<Integer> list= new ArrayList<>();
		List<Integer> rankList= new ArrayList<>();
		
		for(int i=0;i<n;i++) {
			int num= Integer.parseInt(st.nextToken());
			list.add(num);
			rankList.add(num);
		}
		
		Collections.sort(rankList, Comparator.reverseOrder());
		
		StringBuilder sb = new StringBuilder();
		for(int score:list) {
			 sb.append((rankList.indexOf(score)+1)+" ");
		}
		
		System.out.println(sb.toString().trim());
	}

}

 

<해설>

- 이중 반복문을 돌면서, arr[i] 보다 arr[j]가 더크면 cnt++ (cnt: 현재 순위)

- answer[]: 점수 배열 arr[] 의 등수 배열 

import java.util.*;
class Main {	
	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<arr.length; j++){
				if(arr[j]>arr[i]) cnt++;
			}
			answer[i]=cnt;
		}
		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];
		for(int i=0; i<n; i++){
			arr[i]=kb.nextInt();
		}
		for(int x :T.solution(n, arr)) System.out.print(x+" ");
	}
}

 

 


 

 

 

9. 격자판 최대합

 

 

<나의 풀이>

- row, col, 대각선 순서대로 직접 더하며 더 큰수로 저장

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 NumberFormatException, 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][n];
		int max=Integer.MIN_VALUE;
		
		//row
		for(int i=0;i<n;i++) {
			int tot=0;
			
			String s = br.readLine();
			StringTokenizer st = new StringTokenizer(s);
			for(int j=0;j<n;j++) {
				int num=Integer.parseInt(st.nextToken());
				arr[i][j]=num;
				tot+=num;
			}
			
			if(max<tot) max=tot;
		}
		
		//col
		for(int i=0;i<n;i++) {
			int tot=0;
			
			for(int j=0;j<n;j++) {
				int num=arr[j][i];
				tot+=num;
			}
			if(max<tot) max=tot;
		}
		
		//대각선 1
		int tot=0;
		for(int i=0;i<n;i++) {
			tot+=arr[i][i];
		}
		if(max<tot) max=tot;
		
		
		//대각선 2
		tot=0;
		for(int i=0;i<n;i++) {
			tot+=arr[i][n-1-i];
		}
		if(max<tot) max=tot;
		
		
		System.out.println(max);
		
	}

}

 

 

<해설>

- sum1: 열의 합/ sum2: 행의 합

- 행과 열의 합을 반복문 하나에 동시에 max값을 구한다.

- 대각선 두개도 마찬가지로 반복문 하나에 동시에 계산하기!

import java.util.*;
class Main {	
	public int solution(int n, int[][] arr){
		int answer=-2147000000;
		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-i-1];
		}
		answer=Math.max(answer, sum1);
		answer=Math.max(answer, sum2);
		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));
	}
}