24.03.18

서린·2024년 3월 18일

혼자개발

목록 보기
71/82
// 10
public static void main(String[] args) {

  //1~100000까지의 숫자중 소수 구하기
  for (int n = 2; n <= 100000; n++) {
		
    // n이 소수인지 알고싶을 때
    // 2,3,4,...,n-1 중의 정수롤 n을 나누었을 때 하나라도 나누어 떨어지면 소수가 아니다
    // 이때 n-1까지 안가도 되고 n/2까지만 해봐도 충분. n의 약수는 n/2보다 클수는 없어서
    boolean isPrime = true; // 일단 소수라고 하고 소수가 아닌 증거를 찾기
    for (int i = 2; i <= n/2 && isPrime; i++) { //isPrime이 되면 for문을 더이상 진행하지 않고 빠져나온다
      if (n % i == 0) { // 소수가 아니다
      	isPrime = false;
      }	
    }

    if (isPrime) { // 소수면 출력
    	System.out.println(n);
    }
  }
}

사실 n/2까지도 안가도 되고 루트n까지만 돌아도 충분히 구할 수 있다
이때 루트를 나타내기 위해서는
for (int i = 2; i <= n/2 && isPrime; i++) { 이 for문을
for (int i = 2; i * i <= n && isPrime; i++) { 로 수정해주면 된다

// 11
public static void main(String[] args) {

		//정수의 개수 n과 n개의 정수를 입력받아 배열에 저장한다
		//중복된 정수 쌍의 개수를 카운트하여 줄력하기
		//n=6이고 정수들이 2,4,2,4,5,2라면 중복된 정수 쌍은 (2,2), (2,2), (2,2),(4,4) 이다  
		Scanner kb = new Scanner(System.in);
		
		int n = kb.nextInt();
		int[] data = new int [n];
		
		for (int i = 0; i < n; i++) {
			data[i] = kb.nextInt();
		}
		
		int count = 0;
		for (int i = 0; i < n-1; i++) {
			for (int j = i+1; j < n; j++) { // i < j
				if (data[i] == data[j]) {
					count++;
				}
			}
		}
		System.out.println(count);
	}

// 12
public static void main(String[] args) {

		//n개의 정수를 입력받아 배열에 저장 후 이들 중에 0개 이상의 연속된 정수들을 더하여 얻을 수 있는 최대값을 구하기
		Scanner kb = new Scanner(System.in);
		
		int n = kb.nextInt();
		int [] data = new int[n];
		
		for (int i = 0; i < n; i++) {
		data[i] = kb.nextInt();
		}
	
		int max = 0;
		for (int i = 0; i < n; i++) {
			int sum = 0; //i의 출발점이 변경될 때 sum이 0으로 리셋
			for (int j = i; j < n; j++) { //j=i라는건 시작점과 끝점이 같다는 뜻
					// data[i]...data[j]까지 더할 때
					//만약 sum > max이면
					//max = sum;
				sum += data[j];
				if (sum > max) {
					max = sum;
				}
			}
		}
		
		System.out.println(max);
		
	}

// 13
public static void main(String[] args) {

		//n개의 음이 아닌 한자리 정수를 입력받아 배열에 저장
		//1개이상의 연속된 정수들을 이어붙여 하나의 정수로 만들어(ex. 7, 3, 1이라면 731) 얻을 수 있는 소수들 중에서 최댓값 구하기
		Scanner kb = new Scanner(System.in);
		
		int n = kb.nextInt();
		int [] data = new int[n];
		
		for (int i = 0; i < n; i++) {
		data[i] = kb.nextInt();
		}
		
		int max = 0;
		for (int i = 0; i < n; i++) {
			for (int j = i; j < n; j++) {
				// data[i]~data[j]를 하나의 정수로 변경
				int val = 0;
				for (int k = i; k <= j; k++) {
					val = val * 10 + data[k];
				}
				
				// 정수가 소수인지 검사
				boolean isPrime = true;
				for (int k = 2; k * k <= val && isPrime; k++) {
					if (val % k == 0) {
						isPrime = false;
					}
				}
				
				//만약 소수가 맞다면 최댓값 확인
				if (isPrime && val > 1 && val > max) {
					max = val;
				}
			}
		}
		if (max > 0) {
			System.out.println(max);			
		} else {
			System.out.println("소수가 아닙니다");
		}
	}

val = val * 10 + data[k]; 이 val에 대한 설명!
만약 1, 9, 4 라는 세 정수를 사용한다면

val = 0;
val = val * 10 + 1 = 1;
val = val * 10 + 9 = 19;
val = val * 10 + 4 = 194;

이 과정으로 하나의 정수로 변경한다

그리고 만약 8짜리 배열 00010000을 입력했을때
소수가 없음에도 1이 출력되는 상황을 방지하기 위해
if (isPrime && val > 1 && val > max) { 이 if문 안에 val>1 조건을 추가해줬다


0개의 댓글