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