5월, 2016의 게시물 표시

(데이터베이스) HAVING절과 WHERE 절의 차이

이미지
 GROUP BY 절과 HAVING 절의 특징    - GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용    - 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.    - GROUP BY 절에서는 SELECT 절과는 달리 ALIAS 명을 사용불가    - 집계 함수는 WHERE 절에는 올 수 없다. (집계 함수를 사용할 수 있는 GROUP BY 절보다 WHERE 절이 먼저 수행)    - WHERE 절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거시킨다.   - HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을 표시할 수 있다.   - GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING 절에서 제한 조건을 두어 조건을 만족하는 내용만 출력한다.   - HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치한다.  일부 데이터베이스의 과거 버전에서 GROUP BY 절에 명시된 칼럼의 순서대로 오름차순 정렬을 자동으로 정렬(비공식적인 지원이었음)하는 경우가 있었으나, 원칙적으로 관계형 데이터베이스 환경에서는 ORDER BY 절을 명시해야 데이터 정렬이 수행된다.  ANSI/ISO 기준에서도 데이터 정렬에 대한 내용은 ORDER BY 절에서만 언급되어있지,  GROUP BY 절에는 언급되어 있지 않다. 예) 잘못된 쿼리-수정전 SELECT POSITION                           포지션                ,COUNT                             인원수                , COUNT(HEIGHT)               키대상                , MAX(HEIGHT)                   최대키                , MIN(HEIGHT)                     최소키                , ROUND(AV

(데이터베이스) 내부조인:동등 조인

*크로스 조인:  한 테이블의 모든 행과 다른 테이블의 모든 행이 결합 * 내부조인: 동등조인  ->동등 조인은 같은지를 테스트하는 내부 조인입니다.  예)   SELECT boys.boy,toys.toy    FROM boys     INNER JOIN       toys   ON boys.toy_id= toys.toy_id; *내부조인: 비동등 조인  ->비동등 조인은 같지 않은 모든 행들을 반환합니다. 예)  SELECT boy.boy,toys.toy   FROM boys   INNER JOIN    toys   ON boys.toy_id<>toys.toy_id   ORDER BY boys.boy; *내부 조인: 자연조인(동등조인과 같은 결과가 발생 할 수 있다) ->자연조인은 두 테이블에 같은 이름의 열이 있을 때만 동작한다.  SELECT boys.boy,toys.toy   FROM boys   NATURAL JOIN    toys;

(데이터베이스) 다중 테이블 연산

같은 결과를 내는 여러가지 방법. 1. CREATE TABLE profession (  id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,  profession varchar(20) );  INSERT INTO profession(profession)   SELECT profession FROM my_contacts   GROUP BY profession   ORDER BY profession 2.   CREATE TABLE profession AS    SELECT profession FROM my_contacts    GROUP BY profession    ORDER BY profession ALTER TABLE profession ADD COLUMN id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY(id); 3. CREATE TABLE profession (  id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,  profession varchar(20) )AS  SELECT profession FROM my_contacts  GROUP BY profession  ORDER BY profession

(C++) iota함수

(SRM691) PlusOneGame(div2_300)

//각 숫자에 해당하는 인덱스의 배열을 만들고 해당 숫자가 나오는 갯수 만큼 횟수를 증가시켰다. 그런 후 출력시 그 갯수만큼 숫자를 출력하였다. +는 현재 숫자가 존재하는지 유무와 관계없이 i루프를 돌면서 계속 추가시켰다 또한 string t; t=t+'+' 를 하면 현재 문자열 맨 앞에 해당 '+'가 추가 되는 것을 명심하자 #include<iostream> #include<algorithm> #include<vector> #include<stack> #include<string> #include<bits/stdc++.h> using namespace std; class Plusonegame{ public: int cal[20]; public: string getorder(string s){ int n = s.size(); memset(cal, 0, sizeof(cal)); int cnt = 0; for (int i = 0; i < n; i++) { if (s[i] == '+')cnt++; else cal[s[i] - '0']++; } string ans; for (int i = 0; i <= 9; i++) { for (int j = 0; j < cal[i]; j++)ans = ans + char(i + '0'); if (cnt){ ans = ans + '+'; cnt--; } } while (cnt){ ans = ans + '+'; cnt--; } return ans; } };

(알고리즘) 기하(선분과 선분의 교차)

struct vector2{ public: double x, y; public: explicit vector2(double _x, double _y) :x(_x), y(_y){} bool operator<(const vector2& rhs)const{ return x != rhs.x ? x < rhs.x : y < rhs.y; } vector2 operator-(const vector2& rhs){ return vector2(x - rhs.x, y - rhs.y); } vector2 operator*(const vector2& rhs){ return vector2(x*rhs.x, y*rhs.y); } double cross(const vector2& rhs)const{ return x*rhs.y - y*rhs.x; } //벡터(x,y)의 기이 double norm() {return hypot(x,y);} //방향이 같은 단위벡터를 반환한다 //0일경우 반환하지 않는다. vector2 normalize()const {  return vector2(x/norm(),y/norm()); } //이 벡터를 rhs정사영항 결과 vecotor2 project(const vector2& rhs) { vector2 r=rhs.normalize(); return r*r.dot(*this); //이 부분 다시보기 } }; double ccw(vector2 a, vector2 b){ return a.cross(b); } double ccw(vector2 p, vector2 a, vector2 b) { return ccw(a - p, b - p); } vector<vector2> cor; bool segmentIntersection(vector2 a, vector2 b, vector

(C++) const 개념

이미지
일반적으로 const int a=10;을 하게되면 변수 a의 값을 10으로 상수화하겠다는 의미이다. 문제는 포인터를 상수화 시킬 때 헷갈린다. int a=10; const int *p=&a; *p=20(컴파일 에러) 그 이유는 포인터 p는 변수 a의 주소를 가리키지만 직접 포인터를 통해 변수 a의 값을 변경시키지 못하게 막겠다는 의미이다. 대신에 int b=20; p=&b;를 하게 되면 *P의 값은 20으로 변경된다. - 포인터 선언할때 이름 앞에 붙어서 포인터 자체를 상수화 한다.(포인터가 가리키는 대상이 고정됨 ex) int a=10; int b=20; int *const pA=&a; pA=&b;  //컴파일 오류 int a = 10; int b = 20; int *const p = &a; *p = 20; 대신 포인터를 통해 특정 변수의 값을 변경 할 수 있다. ●const 맴베 함수 - 멤버 함수에 const를 선언하면 멤버 함수를 상수화하겠다는 뜻이다. - 멤버 변수가 상수화되면, 이 함수를 통해서 멤버 변수의 값이 변경되지 않는다. - 상수화된 멤버 함수는 상수화되지 않은 함수의 호출을 허용하지 않는다. - 상수화된 멤버 함수는 멤버 변수의 포인터를 리턴하는 것을 허용하지 않는다. ex) 참고: http://pacs.tistory.com/entry/

(알고리즘) KMP알고리즘

KMP알고리즘에서는 부분 일치 테이블을 만들기 위해서 다음과 같은 개념을 알아야 한다. 첫번째 는 접두사(prefix)와 접미사(suffix)입니다. 직관적으로 "banana"의 접미사와 접두사를 보면 무엇인지 이해될 것 입니다. <banana의 접두사> b ba ban bana banan banana 이 6개가 banana의 접두사(prefix) 입니다. <banana의 접미사> a na ana nana anana banana 이 6개가 banana의 접미사(suffix) 입니다. 두번째 로 pi배열 입니다. pi[i]는 주어진 문자열의 0~i 까지의 부분 문자열 중에서 prefix == suffix가 될 수 있는 부분 문자열 중에서 가장 긴 것의 길이 (이때 prefix가 0~i  까지의 부분 문자열과 같으면 안된다.) 무슨 말인지 모르겠죠? 예시를 보면 직관적으로 이해할 수 있을 겁니다. 먼저 문자열 "ABAABAB"의 pi배열을 구해봅시다.  i 부분 문자열   pi[i]  0 A  0  1 AB   0  2 A B A  1  3 A BA A  1  4 AB A AB  2  5 ABA ABA  3  6 AB AAB AB  2 #include<algorithm> #include<vector> #include<string> using namespace std; vector<int> pi; //부분 테이블 구하는 함수 void getPartialMatch(const string& T) { int n = T.size(); pi.resize(n, 0); int begin = 1, matched = 0;

(알고리즘)TSP알고리즘

이미지
참고: http://hsp1116.tistory.com/40

(알고리즘) 최단거리 알고리즘 차이(다익스트라,벨만포드,프림,크루스칼, 플로이드)

**다익스트라와 벨만포드 알고리즘은 한 정점으로부터 각 정점으로까지의 최단 거리를 구할 때 사용한다.(비순환) <다익스트라 vs 프림> 다익스트라는 시작 노드로 부터 그래프 상에 존재하는 모든 사이 즉, 두 노드 사이의 최단거리를 구하는 것. 반면 프림알고리즘은 Tree상에 존재하는 모든 노드들을 최소비용으로 연결시키는 것이다. 예) 철도레일을 깔려고하는데 자재비용을 최소로 할 때 **한 개의 시작점이 아니라 모든 정점 쌍에 대해 둘 사이의 최단거리를 구할 때 Floyd알고리즘을 사용한다

(알고리즘) Floyd 워셔 알고리즘

이미지
복잡도 플로이드-워셜 알고리즘으로 모든 정점 간 경로의 최소비용을 구하는 것은  의   시간 복잡도 를 갖는다. 경유지를 기록한 경우, 경로를 역으로 추출하는 알고리즘의 복잡도는   의 시간 복잡도를 갖는다. 종종   다익스트라  알고리즘과 자주 비교되곤 하는데, 두 알고리즘 모두 각각의 장단점이 있기 때문에 상황에 맞는 알고리즘 선정 필요성이 요구된다.

(알고리즘) 문자열 비교

#include <iostream> #include <string> #include <cstring> #include <algorithm> #include <vector> using namespace std; struct cmp { bool operator() (const char* a, const char* b) const { return strcmp(a, b) < 0; } }; int main() { FILE *empty; freopen_s(&empty,"ee.txt", "r", stdin); char str[5001]; cin >> str; vector<char*> suffix; int len = strlen(str); for (int i = 0; i<len; i++) { suffix.push_back(str + i); } sort(suffix.begin(), suffix.end(), cmp()); int max = 0; for (int i = 0; i<suffix.size() - 1; i++) { int k = 0; while (suffix[i][k] == suffix[i + 1][k]) k++; max = std::max(max, k); } printf("%d\n", max); return 0; }

(C++) 포인터와 배열

이미지
[1]문자열 표현 방식의 이해 -  포인터가 표현하는  문자열 상수 이건 쫌 중요한문제입니다..ㅇ-ㅇ 문자열을 표현하실 때 어떻게 표현하시나요? 대부분 printf함수를 쓰거나 배열을 사용하여 표현하곤 합니다. 하지만, 포인터로도 문자열을 표현할 수 있다는 사실 알고 계셨나요~? char  string[5]="abcd"; char   *pString[5]="ABCD"; //문자 ABCD를  가리킨다 <배열을 이용한 문자열 표현 string[5]="abcd";> <포인터를 이용한 문자열 표현  pString[5]="ABDC";> [2]문자열 상수에 대한 조금 더 깊은 이해 ■ 위에서는 포인터로 문자열을 표현할 수 있는 대신에 상수(고정값)로 만 사용할 수 있다고 설명드렸습니다.    여기에 덧붙여 설명드리겠습니다.    우선, 아래 두가지를 기억하세요! ■ 1. 문자열 상수는 메모리 공간에 할당되면 주소를반환한다. - char   *str  = " ABCDEFG "; [*str이 짝사랑한 '주소값'... 그러나 예기치 못한 ABCDEFG라는 여인이 나에게 다가왔는데...] 사건의 전말은 다음과 같습니다.  *str은  오른쪽에 있는 변수의 '주소값'이 오기를 대기하고 있음 하지만 주소값은 커녕 상수' ABCDEFG'가 와버렸음.. '*str'은 그래도 당황하지 않았음.. 나쁘지 않았던것임.. 생각보다 외모가 괜찮았음.. 어떻게하면 ABCDEFG를 내 것으로 만들 수 있을까 순간 두뇌회전 RPM은 급상승함. 결론을 내림.  우선, ABCDEFG에게 메모리공간(0x10번지)를 사줌. Give & Take 사회라 ABCDEFG도 나

(알고리즘) BinarySearch 시 주의사항

참고:http://googleresearch.blogspot.kr/2006/06/extra-extra-read-all-about-it-nearly.html

(알고리즘) 최장부분수열(LIS)의 시간복잡도 N^2--->NlogN으로 줄이기

1. Lower Bound를 이용한 방법 Our strategy determined by the following conditions, 1. If A[i] is smallest among all  end  candidates of active lists, we will  start  new active list of length 1. 2. If A[i] is largest among all  end  candidates of active lists, we will clone the  largest  active list, and extend it by A[i]. 3. If A[i] is in between, we will find a list with  largest end element that is smaller than  A[i]. Clone and extend this list by A[i]. We will discard all other lists of same length as that of this modified list. Note that at any instance during our construction of active lists, the following condition is maintained. “end element of smaller list is smaller than end elements of larger lists” . It will be clear with an example, let us take example from  wiki  {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15}. A[0] = 0. Case 1. There are no active lists, create one. 0. ----------------------------------------------------------------------------- A[1] =