1. 큰 수 출력하기
<hide/>
import java.util.*;
public class Main {
public static void main(String[] args){
Main T = new Main();
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; ++i){
arr[i] = scan.nextInt();
}
for(int x : T.solution(n, arr)){
System.out.print(x + " ");
}
}
public ArrayList<Integer> solution(int n, int[] arr) {
ArrayList<Integer> answer = new ArrayList<>();
answer.add(arr[0]);
for(int i = 1; i < n; ++i) {
if(arr[i] > arr[i - 1]) {
answer.add(arr[i]);
}
}
return answer;
}
}
Note)
- arrayList<> 형태로 반환하는 solution메서드 만든다.
- solution(n, arr)을 for문에 넣고 하나씩 출력한다.
- 배열의 맨 앞에 있는 값은 일단 넣는다.
2. 보이는 학생
<hide/>
import java.util.*;
public class Main {
public static void main(String[] args){
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int [] arr = new int[n];
for(int i = 0 ; i < n; ++i){
arr[i] = in.nextInt();
}
System.out.println(T.solution(n, arr));
return ;
}
public int solution(int n, int[] arr){
int answer = 1, max = arr[0]; // 맨 앞의 학생은 일단 넣는다.
for(int i = 1; i < n; ++i) {
if( arr[i] > max ) {
answer++;
max = arr[i];
}
}
return answer;
}
}
Note)
- int형 변수 max를 정한다. (초깃값은 배열의 맨 앞 값)
3. 가위바위보
<hide/>
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Main T = new Main();
Scanner in=new Scanner(System.in);
int n = in.nextInt();
int [] A = new int[n];
int [] B = new int[n];
for(int i = 0; i < n; ++i){
A[i] = in.nextInt();
}
for(int i = 0; i < n; ++i){
B[i] = in.nextInt();
}
for( int i = 0 ; i < n; ++i){
System.out.println(T.solution(A[i] , B[i]));
}
}
public char solution(int x , int y){
if( x == y )return 'D';
else if( x == 3 && y == 1 ||
x == 2 && y == 3 ||
x == 1 && y == 2 ) return 'B';
return 'A';
}
}
4. 피보나치 수열
<hide/>
import java.util.*;
public class Main {
public static void main(String[] args){
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int x : T.solution(n)){
System.out.print( x + " ");
}
}
public int [] solution(int n){
int [] answer = new int[n];
answer[0] = 1;
answer[1] = 1;
for(int i = 2; i < n; ++i){
answer[i] = answer[i-1] + answer[i-2] ;
}
return answer;
}
}
Note)
- solution을 배열 형태로 반환한다.
- 피보나치 수열의 각 항을 한 개씩 출력하도록 작성한다.
5. 에라토스테네스의 체
<hide/>
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
System.out.println(T.solution(n));
return ;
}
public int solution(int n){
int answer = 0;
int [] ch = new int[n + 1];
for(int i = 2; i <= n; ++i){ // 2의 배수부터 시작한다.
if(ch[i] == 0){ // ch[i]가 0이면 소수니까 answer++해준다.
answer++;
for(int j = i; j <= n; j = j + i){ // j는 i의 배수로 돌아야한다.
ch[j] = 1;
}
}
}
return answer;
}
}
Note)
- 2부터 시작해서 입력받은 n까지 for문을 실행한다.
-> 2의 배수, 3의 배수인 index에 대해 ch[i]에 1을 넣는다.
-> ch[i] 가 0이면 소수이므로 카운트해서 반환하면 소수의 개수가 출력된다.
6. 뒤집은 소수
<hide/>
import java.util.*;
public class Main {
public boolean isPrime(int num){
if(num == 1) return false;
for(int i = 2; i < num ; ++i){
if(num % i == 0) return false;
}
return true;
}
public static void main(String[] args){
Scanner in=new Scanner(System.in);
Main T = new Main();
int n = in.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; ++i){
arr[i] = in.nextInt();
}
for(int x : T.solution(n, arr)){
System.out.print(x +" ");
}
}
public ArrayList<Integer> solution(int n , int[] arr){
ArrayList<Integer> answer = new ArrayList<>();
for(int i = 0 ; i < n ; ++i){
int tmp = arr[i];
int res = 0;
while(tmp > 0){
int t = tmp % 10;
res = res * 10 + t;
tmp = tmp / 10;
}
if(isPrime(res)) answer.add(res);
}
return answer;
}
}
Note)
- 소수인지 판단하기위해 isPrime()을 만든다.
7. 점수계산
<hide/>
import java.util.*;
public class Main {
public static void main(String[] args){
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int [] arr = new int[n];
for(int i = 0; i < n; ++i ){
arr[i] = in.nextInt();
}
System.out.println(T.solution(n, arr));
return ;
}
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 = answer + cnt;
}else{
cnt = 0;
}
}
return answer;
}
}
Note)
- cnt가 증가할 때마다 answer에 cnt를 누적시킨다.
- arr[i]가 1일 때만 cnt증가 & answer에 누적한다.
8. 등수 구하기
<hide/>
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Main T = new Main();
Scanner in=new Scanner(System.in);
int n = in.nextInt();
int [] arr = new int[n];
for(int i = 0; i < n; ++i ){
arr[i] = in.nextInt();
}
for(int x : T.solution(n, arr)){
System.out.print(x +" ");
}
}
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 < n; ++j ){
if(arr[j] > arr[i]) cnt++;
}
answer[i] = cnt;
}
return answer;
}
}
Note)
- arr[i] 보다 큰 arr[j]의 개수에 따라 cnt가 하나씩 증가한다.
- 각각의 cnt에 대해 answer배열에 추가한다.
- 순위를 세는 cnt는 1부터 시작한다.
9. 격자판 최대합
<hide/>
import java.util.*;
public class Main {
public static void main(String[] args){
Main T = new Main();
Scanner in =new Scanner(System.in);
int n = in.nextInt();
int[][] arr = new int[n][n];
for(int i = 0; i < n ; ++i){
for(int j = 0; j < n ; ++j){
arr[i][j] = in.nextInt();
}
}
System.out.println(T.solution(n, arr));
return;
}
public int solution(int n, int[][] arr){
int answer = Integer.MIN_VALUE;
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-1-i];
}
answer = Math.max(answer, sum1);
answer = Math.max(answer, sum2);
return answer;
}
}
Note)
- 2차원 배열을 이용한다.
- 가로줄 세로줄 대각선끼리의 합을 구해서 max와 비교한다.
- Math클래스의 max()메서드를 이용한다.
10. 봉우리
<hide/>
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Main T = new Main();
Scanner in=new Scanner(System.in);
int n = in.nextInt();
int [][] arr = new int[n+2][n+2];
for(int i = 0; i < n+2; ++i){
for(int j = 0; j < n+2; ++j){
if(i == 0 || i == n + 1 || j == 0 || j == n + 1) arr[i][j] = 0;
else{
arr[i][j] = in.nextInt();
}
}
}
System.out.println(T.solution(n, arr));
return ;
}
public int solution(int n, int [][] arr){
int cnt = 0;
for(int i= 1; i <= n; ++i){
for(int j = 1; j <= n; ++j){
if( arr[i][j] > arr[i-1][j]
&& arr[i][j] > arr[i+1][j]
&& arr[i][j] > arr[i][j-1]
&& arr[i][j] > arr[i][j+1]
) ++cnt;
}
}
return cnt;
}
}
11. 임시 반장 선정하기
<hide/>
import java.util.*;
public class Main {
public int solution(int n, int[][] arr){
int answer = 0;
int max = 0;
for(int i = 1; i <= n; ++i ){
int cnt = 0; // 새로운 학생을 카운트 할 때마다 cnt 초기화
for(int j = 1; j <= n; ++j){ // i와 j가 같은 경우도 상관없다.
for(int k = 1; k <= 5; ++k){
if(arr[i][k] == arr[j][k]){ // 학생 i와 j가 k학년 때 같은 반인 경우
cnt++;
break;
}
}
}
if(cnt > max){ // for문의 맨 아래마다 실행한다.
max = cnt;
answer = i; // i번 학생이 반장으로 적절하다.
}
}
return answer;
}
public static void main(String[] args){
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int [][] arr = new int[n+1][6]; // 인덱스 1부터 사용하기 위해
for(int i = 1; i <= n ;++i){
for(int j = 1; j <=5 ; ++j){ // 1~5학년 까지라서 j는 5까지
arr[i][j] = in.nextInt();
}
}
System.out.println(T.solution(n, arr));
}
}
Note)
- i, j : 학생, (1 ~ n명 까지) , k : 1 ~5 (5학년 까지)
- i, j가 같은 경우도 카운트해도 상관없다. 모든 학생에게 동등한 조건이기 때문.
- 3중 for문 이용한다.
- arr[][]은 n명의 학생에 대한 5학년 까지의 반 정보를 나타낸 것이다.
-> index를 1부터 시작하기 위해 arr[n+1][5+1]로 사이즈를 맞춘다.
12. 멘토링
<hide/>
import java.util.*;
public class Main {
public int solution(int n, int m, int[][] arr){
int answer = 0;
for(int i = 1; i <= n ; ++i){ // 학생 1 ~ i번
for(int j = 1 ; j <= n; ++j){ // 학생 1 ~ j번
int cnt = 0;
for(int k = 0; k < m; ++k){ // test 번호
int pi= 0, pj = 0; // 일단, 0등으로 리셋
for(int s = 0; s < n; ++s){
if(arr[k][s] == i) pi = s; // 무조건 참이 되는 경우가 있다.
if(arr[k][s] == j) pj = s; // j번 학생의 등수를 넣어준다.
}
if(pi < pj) cnt++; // 멘토의 등수는 멘티 등수보다 작은 숫자
}
if(cnt == m) answer++;
}
}
return answer;
}
public static void main(String[] args){
Main T = new Main();
Scanner in=new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[][] arr = new int[m][n];
for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j ){
arr[i][j] = in.nextInt();
}
}
System.out.println(T.solution(n, m, arr));
return ;
}
}
Note)
- i: 멘토, j: 멘티
- k: 테스트 번호 ( 0번째 시험 ~ (m - 1)번째 시험 )
- s: 0등 ~ (n - 1)등 까지
- pi: i번 학생의 등수, pj: j번 학생의 등수
- 시험 횟수: m, 학생 수: n
- 4중 for문을 이용한다.
- 포인터 변수 pi, pj를 이용한다.
- 자기 자신끼리 멘토 - 멘티가 되는 경우도 함께 카운트해도 상관 없다.
- cnt가 테스트 횟수 m과 같아지면 m번 모두 앞서 있다는 뜻이므로 answer ++
'자료구조와 알고리듬 With Java > [인프런] Algorithm' 카테고리의 다른 글
Chapter 06. Sorting and Searching (정렬, 이분검색과 결정알고리즘) (0) | 2022.04.14 |
---|---|
Chapter 05. Stack, Queue (자료구조) (0) | 2022.04.13 |
Chapter 04. HashMap, TreeSet (해쉬, 정렬지원 Set) (0) | 2022.04.12 |
Chapter 03. Two pointers, Sliding window (0) | 2022.04.12 |
Chapter 01. String (문자열) (0) | 2022.04.09 |