λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

ν”„λ‘œκ·Έλž˜λ° 곡뢀/μ½”ν…Œ

[μΈν”„λŸ°] Array μ˜€λ‹΅ν’€μ΄

ex017

5. μ†Œμˆ˜(μ—λΌν† μŠ€ν…Œλ„€μŠ€ 체)

μ„€λͺ…

μžμ—°μˆ˜ N이 μž…λ ₯되면 1λΆ€ν„° NκΉŒμ§€μ˜ μ†Œμˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

λ§Œμ•½ 20이 μž…λ ₯되면 1λΆ€ν„° 20κΉŒμ§€μ˜ μ†Œμˆ˜λŠ” 2, 3, 5, 7, 11, 13, 17, 19둜 총 8κ°œμž…λ‹ˆλ‹€.

μž…λ ₯

첫 쀄에 μžμ—°μˆ˜μ˜ 개수 N(2<=N<=200,000)이 μ£Όμ–΄μ§‘λ‹ˆλ‹€.

좜λ ₯

첫 쀄에 μ†Œμˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ μž…λ ₯ 1 

20

μ˜ˆμ‹œ 좜λ ₯ 1

8

 

λ‹΅μ•ˆ

import java.util.Scanner;

public class Ex017 {
	
	public int solution(int n) {
		
		//풀이
		//ch = new int(n+1).. ch[0]=2λΆ€ν„° μ‹œμž‘ν•¨
		//μ†Œμˆ˜ λ§Œλ‚ λ•Œλ§ˆλ‹€ answer++
		//2의 배수 체크
		//3의 배수 체크
		//5의 배수 체크
		//7의 배수 체크
		
		
		int answer = 0;
		int[] ch = new int[n+1]; //λ°°μ—΄ μ΄ˆκΈ°ν™” > 0으둜 μ΄ˆκΈ°ν™”
		for(int i=2; i<=n; i++) {
			if(ch[i]==0) {
				answer++;
				for(int j=i; j<=n; j=j+i) ch[j]=1; //jκ°€ i의 배수둜 λŒμ•„μ•Όν•΄μ„œ iμ”© 증가
			}
		}
		
		return answer;
	
	}
	
	public static void main(String[] args) {
		Ex017 T = new Ex017();
		Scanner kb = new Scanner(System.in);
		int n = kb.nextInt();
		
		System.out.println(T.solution(n));
	}

}

 

ex018

6. 뒀집은 μ†Œμˆ˜
 

μ„€λͺ…

N개의 μžμ—°μˆ˜κ°€ μž…λ ₯되면 각 μžμ—°μˆ˜λ₯Ό 뒀집은 ν›„ κ·Έ 뒀집은 μˆ˜κ°€ μ†Œμˆ˜μ΄λ©΄ κ·Έ μ†Œμˆ˜λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

예λ₯Ό λ“€μ–΄ 32λ₯Ό λ’€μ§‘μœΌλ©΄ 23이고, 23은 μ†Œμˆ˜μ΄λ‹€. 그러면 23을 좜λ ₯ν•œλ‹€. 단 910λ₯Ό λ’€μ§‘μœΌλ©΄ 19둜 μˆ«μžν™” ν•΄μ•Ό ν•œλ‹€.

첫 μžλ¦¬λΆ€ν„°μ˜ μ—°μ†λœ 0은 λ¬΄μ‹œν•œλ‹€.

μž…λ ₯

첫 쀄에 μžμ—°μˆ˜μ˜ 개수 N(3<=N<=100)이 μ£Όμ–΄μ§€κ³ , κ·Έ λ‹€μŒ 쀄에 N개의 μžμ—°μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€.

각 μžμ—°μˆ˜μ˜ ν¬κΈ°λŠ” 100,000λ₯Ό λ„˜μ§€ μ•ŠλŠ”λ‹€.

좜λ ₯

첫 쀄에 뒀집은 μ†Œμˆ˜λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€. 좜λ ₯μˆœμ„œλŠ” μž…λ ₯된 μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ μž…λ ₯ 1 

9
32 55 62 20 250 370 200 30 100

μ˜ˆμ‹œ 좜λ ₯ 1

23 2 73 2 3

 

λ‹΅μ•ˆ

import java.util.ArrayList;
import java.util.Scanner;

public class Ex018 {
	
	public boolean isPrime(int num) {
		if(num==1) return false;
		for(int i=2; i<num; i++) { //2λΆ€ν„° μžκΈ°μžμ‹  μ „κΉŒμ§€ λ‹€ λ‚˜λˆ λ΄„
			if(num%i==0) return false; 
		}
		return true;
		
	}
	
	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;
	}
	
	public static void main(String[] args) {
		Ex018 T = new Ex018();
		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 + " ");
		}
	}

}

 

 

*숫자 λ’€μ§‘κΈ°

		
//숫자 λ’€μ§‘κΈ°
//tmp (뒀집을 수)
//res (뒀집은 κ²°κ³Ό)
//res = res*10 + t
//t = tmp % 10

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;
}

//  μ½”λ“œ μ„€λͺ…
//	tmp : 뒀집을 숫자
//	res : 뒀집은 κ²°κ³Όλ₯Ό μ €μž₯ν•  λ³€μˆ˜
//	while 루프λ₯Ό μ‚¬μš©ν•˜μ—¬ μ£Όμ–΄μ§„ 숫자λ₯Ό λ’€μ§‘λŠ”λ‹€. 쑰건 tmp > 0λŠ” μ£Όμ–΄μ§„ μˆ«μžκ°€ 아직 뒀집을 μžλ¦Ώμˆ˜κ°€ λ‚¨μ•„μžˆμ„ λ•ŒκΉŒμ§€ λ°˜λ³΅μ„ μ˜λ―Έν•œλ‹€
//	tmp % 10은 μ£Όμ–΄μ§„ 숫자 tmp의 일의 자리 숫자λ₯Ό κ΅¬ν•œλ‹€. 이 일의 자리 숫자λ₯Ό tλΌλŠ” λ³€μˆ˜μ— μ €μž₯
//	res에 ν˜„μž¬κΉŒμ§€ λ’€μ§‘ν˜€μ§„ μˆ«μžμ— 10을 κ³±ν•˜κ³  tλ₯Ό 더해쀀닀. μ΄λ ‡κ²Œ ν•˜λ©΄ 기쑴에 λ’€μ§‘νžŒ μˆ«μžμ— μƒˆλ‘œμš΄ 일의 자리 μˆ«μžκ°€ 좔가됨
//	λ§ˆμ§€λ§‰μœΌλ‘œ, tmpλ₯Ό 10으둜 λ‚˜λˆ„μ–΄ λ‹€μŒ 자릿수λ₯Ό μ€€λΉ„. 예λ₯Ό λ“€μ–΄, μ›λž˜ μˆ«μžκ°€ 1234μ˜€λ‹€λ©΄ tmpλŠ” 이제 123이 됨
//	이 과정을 계속 λ°˜λ³΅ν•˜λ©΄μ„œ tmpκ°€ 0보닀 μž‘μ•„μ§ˆ λ•ŒκΉŒμ§€ 루프가 μ‹€ν–‰λ©λ‹ˆλ‹€. κ·Έλ ‡κ²Œ 되면 resμ—λŠ” μ£Όμ–΄μ§„ μˆ«μžκ°€ λ’€μ§‘ν˜€μ„œ μ €μž₯되게 λ©λ‹ˆλ‹€.

 

 

Ex022

10. λ΄‰μš°λ¦¬
 

μ„€λͺ…

지도 정보가 N*N κ²©μžνŒμ— μ£Όμ–΄μ§‘λ‹ˆλ‹€. 각 κ²©μžμ—λŠ” κ·Έ μ§€μ—­μ˜ 높이가 μ“°μ—¬μžˆμŠ΅λ‹ˆλ‹€.

각 격자판의 숫자 쀑 μžμ‹ μ˜ μƒν•˜μ’Œμš° μˆ«μžλ³΄λ‹€ 큰 μˆ«μžλŠ” λ΄‰μš°λ¦¬ μ§€μ—­μž…λ‹ˆλ‹€. λ΄‰μš°λ¦¬ 지역이 λͺ‡ 개 μžˆλŠ” μ§€ μ•Œμ•„λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

격자의 κ°€μž₯μžλ¦¬λŠ” 0으둜 μ΄ˆκΈ°ν™” λ˜μ—ˆλ‹€κ³  κ°€μ •ν•œλ‹€.

λ§Œμ•½ N=5 이고, 격자판의 μˆ«μžκ°€ λ‹€μŒκ³Ό κ°™λ‹€λ©΄ λ΄‰μš°λ¦¬μ˜ κ°œμˆ˜λŠ” 10κ°œμž…λ‹ˆλ‹€.

μž…λ ₯

첫 쀄에 μžμ—°μˆ˜ N이 μ£Όμ–΄μ§„λ‹€.(2<=N<=50)

두 번째 쀄뢀터 N쀄에 걸쳐 각 쀄에 N개의 μžμ—°μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. 각 μžμ—°μˆ˜λŠ” 100을 λ„˜μ§€ μ•ŠλŠ”λ‹€.

좜λ ₯

λ΄‰μš°λ¦¬μ˜ 개수λ₯Ό 좜λ ₯ν•˜μ„Έμš”.

μ˜ˆμ‹œ μž…λ ₯ 1 

5
5 3 7 2 3
3 7 1 6 1
7 2 5 3 4
4 3 6 4 1
8 7 3 5 2

μ˜ˆμ‹œ 좜λ ₯ 1

10

 

λ‹΅μ•ˆ

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));
	}
}

 

 

 

Ex023

11. μž„μ‹œλ°˜μž₯ μ •ν•˜κΈ°
 

μ„€λͺ…

김갑동 μ„ μƒλ‹˜μ€ μ˜¬ν•΄ 6ν•™λ…„ 1반 λ‹΄μž„μ„ 맑게 λ˜μ—ˆλ‹€.

김갑동 μ„ μƒλ‹˜μ€ μš°μ„  μž„μ‹œλ‘œ 반μž₯을 μ •ν•˜κ³  학생듀이 μ„œλ‘œ μΉœμˆ™ν•΄μ§„ 후에 μ •μ‹μœΌλ‘œ μ„ κ±°λ₯Ό 톡해 반μž₯을 μ„ μΆœν•˜λ €κ³  ν•œλ‹€.

κ·ΈλŠ” 자기반 학생 μ€‘μ—μ„œ 1ν•™λ…„λΆ€ν„° 5ν•™λ…„κΉŒμ§€ μ§€λ‚΄μ˜€λ©΄μ„œ ν•œλ²ˆμ΄λΌλ„ 같은 λ°˜μ΄μ—ˆλ˜ μ‚¬λžŒμ΄ κ°€μž₯ λ§Žμ€ 학생을 μž„μ‹œ 반μž₯으둜 μ •ν•˜λ € ν•œλ‹€.

κ·Έλž˜μ„œ 김갑동 μ„ μƒλ‹˜μ€ 각 학생듀이 1ν•™λ…„λΆ€ν„° 5ν•™λ…„κΉŒμ§€ λͺ‡ λ°˜μ— μ†ν–ˆμ—ˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν‘œλ₯Ό λ§Œλ“€μ—ˆλ‹€.

예λ₯Ό λ“€μ–΄ 학생 μˆ˜κ°€ 5λͺ…일 λ•Œμ˜ ν‘œλ₯Ό μ‚΄νŽ΄λ³΄μž.

μœ„ κ²½μš°μ— 4번 학생을 보면 3번 학생과 2ν•™λ…„ λ•Œ 같은 λ°˜μ΄μ—ˆκ³ , 3번 학생 및 5번 학생과 3ν•™λ…„ λ•Œ 같은 λ°˜μ΄μ—ˆμœΌλ©°,

2번 ν•™μƒκ³ΌλŠ” 4ν•™λ…„ λ•Œ 같은 λ°˜μ΄μ—ˆμŒμ„ μ•Œ 수 μžˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ 이 ν•™κΈ‰μ—μ„œ 4번 학생과 ν•œλ²ˆμ΄λΌλ„

같은 λ°˜μ΄μ—ˆλ˜ μ‚¬λžŒμ€ 2번 학생, 3번 학생과 5번 ν•™μƒμœΌλ‘œ λͺ¨λ‘ 3λͺ…이닀.

이 μ˜ˆμ—μ„œ 4번 학생이 전체 학생 μ€‘μ—μ„œ 같은 λ°˜μ΄μ—ˆλ˜ 학생 μˆ˜κ°€ 제일 λ§ŽμœΌλ―€λ‘œ μž„μ‹œ 반μž₯이 λœλ‹€.

각 학생듀이 1ν•™λ…„λΆ€ν„° 5ν•™λ…„κΉŒμ§€ μ†ν–ˆλ˜ 반이 μ£Όμ–΄μ§ˆ λ•Œ, μž„μ‹œ 반μž₯을 μ •ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 μ€„μ—λŠ” 반의 학생 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. 학생 μˆ˜λŠ” 3 이상 1000 μ΄ν•˜μ΄λ‹€.

λ‘˜μ§Έ μ€„λΆ€ν„°λŠ” 1번 학생뢀터 μ°¨λ‘€λŒ€λ‘œ 각 μ€„λ§ˆλ‹€ 1ν•™λ…„λΆ€ν„° 5ν•™λ…„κΉŒμ§€ λͺ‡ λ°˜μ— μ†ν–ˆμ—ˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 5개의 μ •μˆ˜κ°€ 빈칸 ν•˜λ‚˜λ₯Ό 사이에 두고 μ£Όμ–΄μ§„λ‹€.

μ£Όμ–΄μ§€λŠ” μ •μˆ˜λŠ” λͺ¨λ‘ 1 이상 9 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€.

좜λ ₯

첫 쀄에 μž„μ‹œ 반μž₯으둜 μ •ν•΄μ§„ ν•™μƒμ˜ 번호λ₯Ό 좜λ ₯ν•œλ‹€.

단, μž„μ‹œ 반μž₯이 될 수 μžˆλŠ” 학생이 μ—¬λŸ¬ λͺ…인 κ²½μš°μ—λŠ” κ·Έ 쀑 κ°€μž₯ μž‘μ€ 번호만 좜λ ₯ν•œλ‹€.

μ˜ˆμ‹œ μž…λ ₯ 1 

5
2 3 1 7 3
4 1 9 6 8
5 5 2 4 4
6 5 2 6 7
8 4 2 2 2

μ˜ˆμ‹œ 좜λ ₯ 1

4

 

λ‹΅μ•ˆ

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));
	}
}

 

 

Ex024

12. λ©˜ν† λ§
 

μ„€λͺ…

ν˜„μˆ˜λ„€ 반 μ„ μƒλ‹˜μ€ 반 ν•™μƒλ“€μ˜ μˆ˜ν•™μ μˆ˜λ₯Ό ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄ λ©˜ν† λ§ μ‹œμŠ€ν…œμ„ λ§Œλ“€λ €κ³  ν•©λ‹ˆλ‹€.

λ©˜ν† λ§μ€ λ©˜ν† (λ„μ™€μ£ΌλŠ” 학생)와 λ©˜ν‹°(도움을 λ°›λŠ” 학생)κ°€ ν•œ 짝이 λ˜μ–΄ λ©˜ν† κ°€ λ©˜ν‹°μ˜ μˆ˜ν•™κ³΅λΆ€λ₯Ό λ„μ™€μ£ΌλŠ” κ²ƒμž…λ‹ˆλ‹€.

μ„ μƒλ‹˜μ€ M번의 μˆ˜ν•™ν…ŒμŠ€νŠΈ λ“±μˆ˜λ₯Ό κ°€μ§€κ³  λ©˜ν† μ™€ λ©˜ν‹°λ₯Ό μ •ν•©λ‹ˆλ‹€.

λ§Œμ•½ A학생이 λ©˜ν† μ΄κ³ , B학생이 λ©˜ν‹°κ°€ λ˜λŠ” 짝이 λ˜μ—ˆλ‹€λ©΄, A학생은 M번의 μˆ˜ν•™ν…ŒμŠ€νŠΈμ—μ„œ λͺ¨λ‘ B학생보닀 λ“±μˆ˜κ°€ μ•žμ„œμ•Ό ν•©λ‹ˆλ‹€.

M번의 μˆ˜ν•™μ„±μ μ΄ μ£Όμ–΄μ§€λ©΄ λ©˜ν† μ™€ λ©˜ν‹°κ°€ λ˜λŠ” 짝을 λ§Œλ“€ 수 μžˆλŠ” κ²½μš°κ°€ 총 λͺ‡ κ°€μ§€ 인지 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

μž…λ ₯

첫 번째 쀄에 반 학생 수 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등을 μ˜λ―Έν•©λ‹ˆλ‹€.

좜λ ₯

첫 번째 쀄에 짝을 λ§Œλ“€ 수 μžˆλŠ” 총 경우λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ μž…λ ₯ 1 

4 3
3 4 1 2
4 3 2 1
3 1 4 2

μ˜ˆμ‹œ 좜λ ₯ 1

3

힌트

좜λ ₯μ„€λͺ…

(3, 1), (3, 2), (4, 2)와 같이 3κ°€μ§€ 경우의 (λ©˜ν† , λ©˜ν‹°) 짝을 λ§Œλ“€ 수 μžˆλ‹€.

 

λ‹΅μ•ˆ

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));
	}
}