완전 탐색 (Brute Force)
완전 탐색 (Brute Force)이란?
완전 탐색(Brute Force) 구현 방법
최소 직사각형
접근 방법
(더 긴 쪽의 길이를 height으로, 더 짧은 쪽의 길이를 width로 담아도
)
소스 코드
public class Solution { // 최소 직사각형
public static void main(String[] args) {
int[][] sizes = { { 60, 50 }, { 30, 70 }, { 60, 30 }, { 80, 40 } };
// int[][] sizes = {{10, 7}, {12, 3}, {8, 15}, {14, 7}, {5, 15}};
// int[][] sizes = {{14, 4}, {19, 6}, {6, 16}, {18, 7}, {7, 11}};
System.out.println(solution(sizes));
}
private static int solution(int[][] sizes) {
int answer = 0;
// 1. 가로와 세로 변수 생성
int width = 0; // 작은 수 담기
int height = 0; // 큰 수 담기
// 2. sizes 배열 탐색
for (int i = 0; i < sizes.length; i++) {
// 3. 더 짧은 쪽의 길이를 width와 비교, 더 긴 쪽의 길이를 height과 비교하여 각 변수 초기화
if(sizes[i][0] <= sizes[i][1]) {
width = Math.max(width, sizes[i][0]);
height = Math.max(height, sizes[i][1]);
}else {
width = Math.max(width, sizes[i][1]);
height = Math.max(height, sizes[i][0]);
}
}
// 4. 지갑의 크기 구하기
answer = width * height;
return answer;
}
}
Java
복사
모의고사
접근 방법
소스 코드
import java.util.ArrayList;
public class Solution {
public static void main(String[] args) {
int[][] sizes = { { 60, 50 }, { 30, 70 }, { 60, 30 }, { 80, 40 } };
// int[][] sizes = {{10, 7}, {12, 3}, {8, 15}, {14, 7}, {5, 15}};
// int[][] sizes = {{14, 4}, {19, 6}, {6, 16}, {18, 7}, {7, 11}};
System.out.println(solution(sizes));
}
private public int[] solution(int[] answers) {
int[] one = {1, 2, 3, 4, 5};
int[] two = {2, 1, 2, 3, 2, 4, 2, 5};
int[] three = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
ArrayList<Integer> list = new ArrayList<>();
int[] success = new int[3];
for (int i = 0; i < answers.length; i++) {
if(answers[i] == one[i%one.length]) {
success[0]++;
}
if(answers[i] == two[i%two.length]) {
success[1]++;
}
if(answers[i] == three[i%three.length]) {
success[2]++;
}
}
int max = 0;
for (int i = 0; i < success.length; i++) {
if(max < success[i]) max = success[i];
}
for (int i = 0; i < success.length; i++) {
if(success[i] == max) {
list.add(i);
}
}
int[] answer = new int[list.size()];
for(int i=0; i<list.size(); i++) {
answer[i] = list.get(i)+1;
}
// System.out.println(Arrays.toString(answer));
return answer;
}
}
Java
복사
피드백 받은 부분 Refactoring (22.10.15 수정)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
public static void main(String[] args) {
// int[] answers = { 1, 2, 3, 4, 5 };
int[] answers = { 1, 3, 2, 4, 2 };
System.out.println(solution(answers));
}
private static int[] solution(int[] answers) {
int[] one = {1, 2, 3, 4, 5};
int[] two = {2, 1, 2, 3, 2, 4, 2, 5};
int[] three = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int[] success = new int[3];
for (int i = 0; i < answers.length; i++) {
if(answers[i] == one[i%one.length]) {
success[0]++;
}
if(answers[i] == two[i%two.length]) {
success[1]++;
}
if(answers[i] == three[i%three.length]) {
success[2]++;
}
}
ArrayList<Integer> list = new ArrayList<>(); // 많이 맞춘 수포자가 여러명일 수 있으므로 수포자를 담을 List 생성하기
int max = Math.max(Math.max(success[0], success[1]), success[2]);
for (int i = 0; i < success.length; i++) {
if(success[i] == max) {
list.add(i);
}
}
int[] answer = new int[list.size()];
for(int i=0; i<list.size(); i++) {
answer[i] = list.get(i)+1;
}
return answer;
}
}
Java
복사
소수 찾기
접근 방법
(2~소수를 판별하고자 하는 수의 제곱근까지의 수 중 나누어 떨어지는 수가 있다면 소수
)
소스 코드
import java.util.HashSet;
public class Solution { // 소수 찾기
public static void main(String[] args) {
String numbers = "17";
// String numbers = "011";
System.out.println(solution(numbers));
}
private static int solution(String numbers) {
// 1. 문자열을 한글자씩 잘라서 배열에 담기
String[] num = new String[numbers.length()];
for (int i = 0; i < numbers.length(); i++) {
num[i] = numbers.substring(i, i+1);
}
hash = new HashSet<>(); // 모든 경우의 수에 대해 소수인 수 담을 HashSet
// 2. 자를 문자열 길이를 늘려가며 조합 구하기
for(int i = 1; i <= numbers.length(); i++) {
Permutation(num, new boolean[numbers.length()], "", i);
}
return hash.size();
}
// 재귀 함수
static HashSet<Integer> hash;
private static void Permutation(String[] num, boolean[] v, String str, int lng) {
if(str.length() == lng) { // 구하고자 하는 길이만큼 문자열이 합해졌다면
if(isPrime(Integer.parseInt(str))) { // 2. 소수판별
hash.add(Integer.parseInt(str)); // 4. 소수가 맞다면 HashSet에 담아 중복 제거
return;
}
}
for(int i=0; i<num.length; i++) {
if(v[i]) continue;
v[i] = true;
Permutation(num, v, str + num[i], lng);
v[i] = false;
}
}
// 소수 판별
private static boolean isPrime(int n) {
if(n <= 1) return false; // 0인 경우와 1인 경우에는 소수x
for (int i = 2; i <= Math.sqrt(n); i++) { // 2~n의 제곱근까지의 수에서 소수 판별
if(n % i == 0) { // 1과 자신외에 나누어 떨어지는 수가 있다면
return false; // 소수 x
}
}
return true; // 위의 if문에 걸리지 않았다면 소수 o
}
}
Java
복사