728x90

소인수분해! 

이 문제는 제가 이전에 설명했던 에네스토체네스의 체를 이용하면 더 욱더 쉽게 풀수 있는 문제입니다.

 

수학적으로 소인수분해를 할때는 루트를 사용하여 문제를 푸시면 더욱더 쉽게 풀수있습니다 .

Math.sqrt(값) 루트를 씌우는 함수? 입니다. 

import java.util.Scanner;

public class  Main{

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		
		for(int i=2; i<= Math.sqrt(n); i++) {
			while(n %i ==0) {
				System.out.println(i);
				n/=i;
			}
		}
		if(n !=1) {
			System.out.println(n);
		}
	}
}

소수 2를 시작으로 해서 값의 루트를 씌운 수를 나누면 됩니다. 

728x90
728x90

 

 

백준 문제를 푸는 도중에 에라토스테네스의 체 라는 효율적인 알고리즘을 공유해보고자 이글을 적습니다.

 

소수는 약수가 자기 자신과 1만 있는 숫자를 말하는데, 단순 반복문으로도 구할수 있습니다. 

 

작은 수에 대한 소수를 구할때는 반복문으로 구해도 괜찮지만 숫자들이 커지면 반복문으로 

판별하는것은 시간낭비입니다. 

 

이때 알고리즘 '에라토스테네스의 체 '를 사용합니다. 

더보기

에라토스테네스의 체 : 

 - 체처럼 걸러낸다고 하여 붙여진 알고리즘은 2이상 n이하의 정수 x가 소수인지 아닌지를 효율적으로 판단할 수 있도록 추가적인 배열을 만드는 전처리 알고리즘 입니다.  

배열 array[x] =0 이면 소수이고 1이면 소수가 아니다라고 정의할수 있습니다. 

 

초기의 모든 값은 0으로 되어있습니다. 

2부터 차례대로 정수를 살펴 볼때 2는 소수이기 때문에 2의 배수들은 전부 1로 표시합니다. 

예를들면 array[4]=array[6]=array[8] ..... 등이 1로 표현됩니다. 

검사를 다 하지 않아도 쉽게 1로 표시할수 있습니다. 

 

3은 array[x]=0 이며 따라서 소수입니다 3의 배수들은 전부 1로 표시합니다. 

4는 이미 1로 판별이 되어서 건너뜁니다. 

5는 array[5]=0 이므로 소수이고 5의 배수들은 전부 1로 표시합니다. 

 

쭉 이런식으로 새로운 소수 x를 발견할때마다 그 소수의 배수들은 모두 소수가 아니라고 표시를 하는겁니다. 

 

이렇게 하면 반복문 내에서 건너뛸 수 있는 숫자들이 많아지므로 숫자 하나하나마다 일일이 나누기 등을 해가면서 소수인지 하나씩 판단하는것보다 매우 빨라지게 됩니다. 

 

알고리즘 수행 시간이 O(nlog*log_n)임을 보일수 있는데 이것은 O(n)에 매우 근접한 시간 복잡도라고 합니다. 

 

위의 코드에서 안에 있는 반복문은 x가 소수일때만 수행되기 때문에 사실 알고리즘의 수행 상한보다 더 효율적입니다. 

 

예시 코드를 보시면 더욱 쉽게 아실수 있습니다. 

//소인수 분해 

for(int i =0; n>1; i++){
	if(array[i]==0){
		while (n %i ==0){
			printf("d%",i);
			n/=i; }
			}
		}
   }

i가 소수였을경우

그리고 n이 소수로 나누어 떨어진다면 그 소수를 출력하고 n을 소수로 나눈훈 다시 반복하는 작업의 코드입니다. 

 

백준 문제들중에 소수 관련 문제를 푸시게 되면 더욱더 이해하실수 있을겁니다. 

728x90

'문제풀이 > 백준' 카테고리의 다른 글

[백준] 11653번 자바 문제풀이  (0) 2022.05.25
백준 자바 1152번 문제풀이  (0) 2022.04.26
1157번 백준 자바 문제 풀이  (0) 2022.04.19
백준 2675번 문자열 문제  (0) 2022.04.04
백준 4344 평균은 넘겠지?  (0) 2022.03.17
728x90
이 문제는 이전에도 언급했던 next와 nextline을 잘 구분하고 활용해야합니다. 

 

 

안녕하세요! 오늘은 백준 단어의 개수 문제를 풀어보도록하겠습니다. 

 

브론즈2에 해당하는 쉬운 문제입니다. 

 

(nextLine은 공백까지 문자열로 받기때문에 next가 아닌nextline을 써주어야합니다)

제가 푼 문제는 자바 8이 아닌 11버전으로 체출을 해야 정답 처리가 됩니다.

 

import java.util.Scanner;

public class Main{

public static void main(stringp[ args) {

	Scanner sc= new Scanner(System.in);
	String s = sc.nextLine();
	int count = 0; //문제에도 나와있지만 단어의 개수를 확인할 변수를 담을 변수를 선언해줍니다. 

	String arr[] = s.split(""); // 문자열을 집어넣은 s를 다시 "" 로 쪼개고 arr에 담아줍니다. 
//그 후에 for문으로 받은 값의 길이만큼 돌려줍니다. 

	for(int i = 0; i<arr.length; i++){
			if(arr[i]==""){
			continue; //만약에 arr[i]값이 공백이라면 진행시킵니다. 
				}
count++; //더이상 없다면 count를 하나 추가합니다 .
			}
System.out.println(count);
		}
}

일단! 문제를 읽어보시면 살짝 ?? 함정이 있습니다. 공백이 앞에 있을수도 있고 뒤에 있을수도 있기때문에 공백을 기준으로 카운팅을 하게되면 카운팅수가 부족할수 있습니다. 그래서 "" 을넣어서 진행시킵니다. 

솔직히 큰 어려움이 없는 문제이기때문에 잘풀수있을거라 생각됩니다. 

728x90
728x90

안녕하세요 요즘 국비학원에서 프로젝트를 진행하는중에 너무 정신이 없어서 업로드를 못하고있었습니다. 

 

조만간 문제풀이 외에도 프로젝트 진행하면서 쓰이는 코드들 또한 정리해서 올려보겠습니다. 

 

1157번 문제 또한 아스킷 코드를 사용해서 풀수 있는 문제입니다. 

 

 

예제 입력2 번을 보게 되시면 zZa 입력을 했는데 출력은 Z로 나오게 됩니다. 문제에서 보시면 알겠지만 대소문자를 구별하지 않습니다.  여기에서 힌트를 얻으실수 있을거라고 판단됩니다. 

 

import java.util.Scanner;

public class solution1157 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] arr = new int[26]; //이미 영단어의 갯수는 26개 이기때문에 array로 값을 주어줍니다.
		String s = sc.next();
		
		for(int i =0; i<s.length(); i++) { //input값의 길이만큼 for문을 돌립니다. 
			
			if('A' <=s.charAt(i) && s.charAt(i)<='Z') {//charAt을 통해서 대문자인지 소문자인지 구별합니다. 
				arr[s.charAt(i)-'A']++;//A만큼 수를 빼줍니다. 0으로 시작될겁니다. 
				
			}else {
				arr[s.charAt(i)-'a']++; //여기서는 소문자 a값 만큼 빼주빈다. 
			}
		}
		int max=0;
		char result='?';
		
		for(int i =0; i<26; i++) { //알파벳 크기 만큼 반복문을 돌리면서 array에 카운팅된 값이 맥스값보다
        //큰지 작은지 결정해서 max값을 계속해서 바꾸줍니다.(array값이 max값보다 크면 
			if(arr[i]>max) {
				max=arr[i];
				result=(char)(i+65);//'A'를 대신 쓸수있다.
				
			}else if(arr[i]==max) { //동일한 값이 나온다면 ?를 출력받게 해줍니다. 
				result='?';
				
			}
		}
		System.out.println(result);
	}
}

 

 

대문자와 소문자를 구분하는 문제입니다. 아스킷코드를 사용합니다. 

문자열관련 문제가 나온다면 꼭!! 아스킷코드를 생각해주시는게 중요합니다.!! 항상 문자열은 아스킷 코드를 생각해주세요 ㅎㅎㅎ

728x90
728x90

오늘은 백준 2675 문자열 반복 풀기입니다.

 

 

저는 2가지 방법으로 풀어보겠습니다.

 

 

Scanner를 통해 문제를 풀어볼건데 for문을 사용하는방법과 아닌 방법 두가지를 설명드리겠습니다.

 

일단 밑에 나와있는것처럼 저는 문자열을 repeat을 사용해서 값을 만들어봤습니다. 

java 8 에는 없지만 java11부터 사용한다는 "repeat" 입니다. 

 

 

 

 

Java에서 단일 문자열을 정렬하는 방법을 보여줍니다.

사용되는 가장 일반적인 순서는 알파벳 순서입니다. 정렬은 데이터를 표준 형식으로 변환하고 사람이 읽을 수있는 형식을 만드는 프로세스입니다.

Arrays.sort()방법으로 문자를 정렬하기 이전에 

repeat을 사용하여서 문자열을 반복시켜줍니다. 

문자열 클래스에는 정렬 방법이 없습니다. 문자열을 정렬할때 주된 아이디어는 toCharArray()메소드를 사용하여 주어진 문자열을 문자 배열로 변환 시키는것입니다. 그후에 Arrays.sort() 메서드를 사용하여 해당 배열을 정렬시킵니다. 

문자열 생성 이후 toCharArray() 메소드를 사용하여 문자 배열로 변환 한 후 Arrays.sort를 사용하여 변환 된 문자 배열을 정렬하고 문자열로 형변환 합니다. 

 

 


두번째 방법입니다. 전형적인 for문을 사용하여 문자열을 반복하여 돌리고 charAt으로 문자를 쪼개어서 반복시킵니다.

문자열 s 를 입력받을 때 Scanner.nextLine() 이 아닌 Scanner.next() 로 입력받아야 한다.

nextLine() 으로 입력받으면 입력 과정에서 공백까지 읽어버리기 때문이다.

nextLine() 은 엔터값을 입력받을 때까지 기준으로 한 줄을 읽어버린다.

반면에 next() 는 공백을 기준으로 하나의 문자열만 읽어들인다.

 

nextLine() 은 3과 ABC 사이에 있는 공백까지 읽어들이기 때문에 위와 같은 현상이 나타나므로 반드시 next() 로 문자열을 입력받아야 한다.

 

그럼 이만~ 

728x90

'문제풀이 > 백준' 카테고리의 다른 글

백준 자바 1152번 문제풀이  (0) 2022.04.26
1157번 백준 자바 문제 풀이  (0) 2022.04.19
백준 4344 평균은 넘겠지?  (0) 2022.03.17
8958번 백준 자바 문제 풀이  (0) 2022.03.14
백준 1546번 자바  (0) 2022.03.09

+ Recent posts