728x90
배열(Array) 섹션 - (3)
2-9. 격자판 최대합
- 각각의 행의 합, 열의 합 = 이중 for문 돌면서 arr[i][j] 누적 or arr[j][i] 누적
- 두 대각선 각각의 합 = 그냥 for문 돌면서 arr[i][i] 누적 or arr[i][n-i-1] 누적
import java.util.Scanner;
/* 2-9. 격자판 최대합
[입력]첫 줄에 자연수 N이 주어진다.(2<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다.
각 자연수는 100을 넘지 않는다.
[출력]최대합 출력
*/
public class Main1 {
//솔루션 함수
public int solution(int n, int[][]arr) {
int answer = Integer.MIN_VALUE;
int sum1, sum2;
//1) 행의 합, 열의 합 한번에 구하기
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에는 더 큰 값이 비교된 뒤 저장됨
answer = Math.max(answer, sum1);
answer = Math.max(answer, sum2);
}
//2) 두 대각선의 합 (sum1. sum2)
sum1 = sum2 = 0;
for(int i=0; i<n; i++) {
//왼쪽 대각선 합
sum1 += arr[i][i];
//오른쪽 대각선 합
//주의 n에 따라 값이 달라져야 하므로 n-i-1 처리해야함
sum2 += arr[i][n-i-1];
// answer에는 더 큰 값이 비교 후 저장됨
answer = Math.max(answer, sum1);
answer = Math.max(answer, sum2);
}
return answer;
}
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Main1 T = new Main1();
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.println(T.solution(n, arr));
}
}
2-10. 봉우리 | 어렵다 . . .
import java.util.Scanner;
/* 2-10. 봉우리
* [입력]
첫 줄에 자연수 N이 주어진다.(2<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다.
각 자연수는 100을 넘지 않는다.
[출력] 봉우리 개수 출력
* */
public class Main2 {
//상하좌우 인덱스 지칭 목적의 변수 두개 생성
int [] dx = {-1, 0, 1, 0};
int [] dy = {0, 1, 0, -1};
// 상, 우, 하, 좌
//솔루션 함수
public int solution(int n, int[][]arr) {
int answer = 0;
//각각의 arr[i][j] vs 상. 하,좌,우 비교해서 봉우리 카운팅
for(int i = 0; i< n; i++) {
for(int j = 0; j<n; j++) {
//봉우리 판별
boolean flag = true;
//상하좌우 탐색용 dx, dy
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;// f 주고
break;
}
}
//통과한 상태는 봉우리 맞으니까 카운팅
if(flag) answer++; //여기서 카운팅
}
}
return answer;
}
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Main2 T = new Main2();
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.println(T.solution(n, arr));
}
}
2-11. 임시반장 정하기 | 어렵다 . . .
import java.util.Scanner;
/* 2-11번. 임시반장 정하기
[입력]
첫째 줄에는 반의 학생 수를 나타내는 정수가 주어진다.
둘째 줄부터는 1번 학생부터 차례대로 각 줄마다 1학년부터 5학년까지 몇 반에 속했었는지 나온다
[출력]
첫 줄에 임시 반장으로 정해진 학생의 번호를 출력한다.
여러 명이면 작은 번호 출력한다.
* */
public class Main3 {
//솔루션 함수
public int solution(int n, int[][] arr) {
int answer = 0, max = Integer.MIN_VALUE;
//[기준] i번 학생 기준
for(int i = 1; i<= n; i++) {
int cnt=0; //매번 i와 같은 반 학생 카운팅용
//[비교] j번 학생들
for(int j = 1; j<=n; j++) {
// 1~5 학년까지 돌면서 같은 반 누적하기
for(int k = 1; k <=5; k++) {
// i 학생의 k 학년때 반이 == j 학생의 k학년때 반과 같다면
if(arr[i][k] == arr[j][k]) {
cnt++; //누적
break;
}
}
}
//가장 같은반 많이 했던 학생을 임시반장으로 선출
if(cnt > max) { //기존 max값보다 큰 경우
max=cnt;
answer = i; //현재의 학생으로 임시반장 갱신
}
}
return answer;
}
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Main3 T = new Main3();
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
//인덱스 1번부터 시작하게 배열 생성
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.println(T.solution(n, arr));
}
}
2-12. 멘토링 | 어렵다 . . .
import java.util.Scanner;
/* 2-12. 멘토링
[입력]
첫 번째 줄에 반 학생 수 N(1<=N<=20)과 M(1<=M<=10)이 주어진다.
두 번째 줄부터 M개의 줄에 걸쳐 수학테스트 결과가 학생번호로 주어진다.
학생번호가 제일 앞에서부터 1등, 2등, ...N등 순으로 표현된다.
만약 한 줄에 N=4이고, 테스트 결과가 3 4 1 2로 입력되었다면
3번 학생이 1등, 4번 학생이 2등, 1번 학생이 3등, 2번 학생이 4등을 의미합니다.
[출력]
첫 번째 줄에 짝을 만들 수 있는 총 경우를 출력합니다.
*/
public class Main4 {
//솔루션 함수
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++;
}
}
}
return answer;
}
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Main4 T = new Main4();
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.println(T.solution(n, m, arr));
}
}
728x90
'알고리즘 이론 [개념] > [개념] 코테 알고리즘 공부 - 시즌 1' 카테고리의 다른 글
효율성[O(n2) -> O(n)] 섹션 - (2) (0) | 2023.03.03 |
---|---|
효율성[O(n2) -> O(n)] 섹션 - (1) (0) | 2023.03.02 |
배열(Array) 섹션 - (2) (0) | 2023.02.28 |
배열(Array) 섹션 - (1) (0) | 2023.02.27 |
String(문자열) 섹션 - (3) (0) | 2023.02.23 |