////////
Search

이소영

완전 탐색 (Brute Force)

완전 탐색 (Brute Force)이란?

Brute (단순히, 순전히) + Force (힘)
순전히 힘만 갖고(머리는 쓰지 않고) 모든 것을 다 해보겠다는 의미
주로 비밀번호를 해킹할 때 사용되었던 용어로, 특정 비밀번호를 유추해보는 것이 아닌 비밀번호가 될 수 있는 모든 조합을 다 시도해 보는 기법으로 Brute Force Attack 이라고 부름

완전 탐색(Brute Force) 구현 방법

For / While 문과 같은 반복문 간단한 문제
재귀함수 복잡한 문제

최소 직사각형

접근 방법

지갑의 가로와 세로의 길이를 담을 변수 생성
sizes배열을 탐색하면서 각 배열의 0번째 값과 1번째 값을 비교
더 짧은 쪽의 길이를 width와 비교, 더 긴 쪽의 길이를 height과 비교하여 각 변수 초기화
(더 긴 쪽의 길이를 height으로, 더 짧은 쪽의 길이를 width로 담아도 )
width*height 으로 지갑의 크기 구하기

소스 코드

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
복사

모의고사

접근 방법

각 수포자가 찍는 방식을 배열을 생성하여 담기
정답 배열을 순회하며 각 번호의 수포자의 번호와 일치한다면 success[수포자 번호-1]+1
현재 정답 배열의 인덱스%각 수포자 정답의 길이 = 수포자가 입력한 정답 인덱스
success 배열을 순회하며 최댓값 찾기
success 배열을 한번 더 순회하며 최댓값이 같은 수가 있는지 확인하고 있다면 리스트에 인덱스 (수포자의 번호-1) 추가
수포자 번호 정답 배열에 입력
인덱스는 0부터 시작하므로 수포자의 번호 입력 시 +1 해주기

소스 코드

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
복사

소수 찾기

접근 방법

numbers 문자열을 한 글자씩 담은 배열 생성 및 초기화
한글자씩 담은 배열을 이용해서 나올 수 있는 모든 조합의 경우의 수 구하기
에서 구한 모든 경우의 수에 대해 소수 판별
(2~소수를 판별하고자 하는 수의 제곱근까지의 수 중 나누어 떨어지는 수가 있다면 소수 )
소수라면 HashSet에 담아 중복 없애기
HashSet의 길이 구하기

소스 코드

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
복사