-
오늘의 계획
-
대표적인 관계형 DB인 MYSQL 강의 듣기
- 섹션 2. MySQL 기본
-
완전 탐색 알고리즘 공부 및 문제 풀이
- 프로그래머스 문제 풀이
-
-
오늘의 회고 - 인프런 DataBase 강의 수강 (출처 : 생활코딩) - table들을 grouping 한 것을 데이터 베이스(스키마)/ 이 스키마들이 저장된 곳이 데이터 베이스 서버
- CREATE DATABASE name; 명령어로 database를 생성할 수 있다. - DROP DATABASE name; 명령어로 database를 삭제할 수 있다.
- SHOW DATABASES; 명령어로 database들을 표시할 수 있다.
- database 사용 전 USE name; 명령어로 사용을 알려야 한다. 앞으로의 명령을 name이라는 database(스키마)에 있는 표를 대상으로 실행함- 완전 탐색 알고리즘 문제 : 프로그래머스 LEVEL 2(카펫) - 완전 탐색 알고리즘 : 완전 탐색 알고리즘은 모든 경우의 수를 고려하는 탐색 알고리즘이다. 완전 탐색의 방법으로는 다음과 같은 방법이 있다. - Brute Force : for문과 if문을 이용하여 처음부터 끝까지 탐색하는 방법 - 비트 마스크 : 이진수 표현을 자료구조로 사용하는 방법 - 재귀 함수 : 함수 내에서 함수 자기 자신을 계속해서 호출하는 것 - 순열 : 서로 다른 n개의 원소에서 r개의 중복을 허용하지 않고 순서대로 늘어 놓은 수 - 백트랙킹 : 분할 정복을 잉요한 기법, 재귀 함수를 이용, 답을 찾아가는 도중 답이 될 것 같지 않다면 되돌아간다. - BFS : 너비 우선 탐색 - DFS : 깊이 우선 탐색 ![image](https://user-images.githubusercontent.com/34560965/104460338-52d37080-55f1-11eb-9b15-ca2eac4ebbc6.png) **-해결 방법** : 우선 brown의 개수에서 네 모서리를 빼 yellow의 둘레를 알 수 있고, 그 값을 2로 나누어 yellow의 가로 세로 합을 구할 수 있다. 완전 탐색 문제이므로 가능한 모든 경우의 수를 찾기 위해 for문으로 모든 약수를 찾아 그 약수중 큰 값을 가로, 작은 값을 세로로 설정했다. 이렇게 찾아 설정한 가로 세로가 yellow의 가로 세로의 합과 같은 경우일 때 answer vector에 push하여 문제를 해결하였다. 이 때 row와 col은 yellow의 가로와 세로이므로 전체 카펫을 요구하는 문제에서의 답은 각각 + 2를 해주어 해결하였다. - 코드 ``` #include <string> #include <vector> using namespace std; vector<int> solution(int brown, int yellow) { vector<int> answer; int total_size = brown*yellow; int horizontalPlusVertical = (brown-4)/2; //yellow의 가로 세로 합 for(int i = 1; i*i<=yellow; i++){ if(yellow%i == 0){ //약수 찾기 int row = (i >= yellow/i ? i : yellow/i); //큰 값을 가로 int col = yellow/row; //작은 값을 세로 if(horizontalPlusVertical == row+col){ //두 값의 합이 yellow의 가로 세로 합과 같은 것이 최종 카펫 answer.push_back(row+2); //전체 카펫의 가로는 yellow의 가로 + 2 answer.push_back(col+2); //마찬가지로 세로 + 2 break; } } } return answer; } ```