기본 콘텐츠로 건너뛰기

프로그래머스 - 전화번호 목록

#include <string> #include <vector> #include <algorithm> using namespace std ; bool solution ( vector < string > phone_book ) { sort ( phone_book . begin (), phone_book . end ()); vector < string >:: iterator it ; for ( it = phone_book . begin (); it != phone_book . end (); ++ it ) { vector < string >:: iterator it2 = it ; for ( ++ it2 ; it2 != phone_book . end (); ++ it2 ) { if (( * it2 ). find (( * it ). c_str (), 0 , ( * it ). size ()) != string :: npos ) { return false ; } } } return true ; }

프로그래머스 - 완주하지 못한 선수

#include <string> #include <vector> #include <map> using namespace std ; string solution ( vector < string > participant , vector < string > completion ) { map < string , int > input ; map < string , int >:: iterator mit ; vector < string >:: iterator it ; for ( it = participant . begin (); it != participant . end (); ++ it ) { input [ * it ] ++ ; } for ( it = completion . begin (); it != completion . end (); ++ it ) { input [ * it ] -- ; } string answer = "" ; for ( mit = input . begin (); mit != input . end (); ++ mit ) { if ( mit -> second == 1 ) { answer = mit -> first ; break ; } } return answer ; }

책뿌수기 - SQL 레벨업 6

6. 결합(결합을 지배하는 자가 SQL을 지배한다) ch 18. 기능적인 관점으로 구분하는 결합의 종류 크로스 결합 내부 결합 외부 결합 자기 결합 등가 결합/비등가 결합 자연 결합 위에서 3개는 배타적 결합이다. 컬럼) 자연 결합 구문 자연결합 = 내부 결합 + 등가 결합 1) 크로스 결합 - 모든 결합의 모체 데카르트 곱 (1) 실무에서 사용하지 않음 그런 결과가 필요없다 비용이 크다 (2) 실수로 사용한 크로스 결합 SELECT * FROM Employees, Departments; 2) 내부 결합 - 왜 ‘내부’라는 말을 사용할까? (1) 내부 결합의 작용 크로스 결합 결과의 부분집합 (2) 내부 결합과 같은 기능을 하는 상관 서브쿼리 스칼라 서브쿼리 = 리턴값이 하나인쿼리(SELECT의 필요 조건) 상관 서브쿼리보다 결합이 우수하다 3) 외부 결합 - 왜 ‘외부’라는 말을 사용할까? (1) 외부 결합의 작동 왼쪽/오른쪽/완전 외부 결합 키를 모두 가진 레이아웃의 리포트를 만들때 사용 4) 외부 결합과 내부 결합의 차이 외부 결합은 NULL을 생성한다 5) 자기 결합 - ‘자기’란 누구일까? ch 19. 결합 알고리즘과 성능 Nested Loops Hash Sort Merge 1) Nested Loops 이중 반복 바깥 반복 테이블(구동 테이블, 외부 테이블) <-> 내부 테이블 접근하는 레코드 수 R(A) * R(B)이며 실행 시간은 레코드수에 비례한다. 구동 테이블을 작게 만드는 것이 중요하다 (1) 구동 테이블의 중요성 (내부 테이블의 결합키 필드에 인덱스가 존재) 구동 테이블을 작게 내부 테이블의 반복을 줄일 수 있음 이상적으로 구동 테이블의 레코드 한개에 내부 테이블의 레코드 한개가 대응하고, 해당 레코드를 내부 테이블의 인덱스로 사용해 찾을 수 있는 경우 레코드 레코드 수는 R(A) * 2...

책뿌수기 - SQL 레벨업 7

7. 서브쿼리(곤란한 부분은 분할해야만 할까?) ch 21. 서브쿼리가 일으키는 폐해 1) 서브쿼리의 문제점 성능적 문제는 서브쿼리가 실체적인 데이터를 저장하고 있지 않다는 것에 있다. (1) 연산 비용 추가 서브쿼리 = SELECT 이므로 실행할때마다 SELECT 하는 것 (2) 데이터 I/O 비용 발생 연살결과가 커 저장소를 쓰게 되는 경우 급격한 속도 저하 발생 (3) 최적화를 받을 수 없음 서브쿼리의 결과에는 메타 정보가 없어 최적화가 불가능 2) 서브쿼리 의존증 (1) 서브쿼리를 사용한 방법 코드가 복잡해 읽기 어렵다 성능 결과가 일시적인 영역에 확보되므로 오버헤드 발생 최적화 불가 결합을 필요로 하기 때문에 비용이 높고 실행계획 변동 리스크가 존재 recipts 테이블 두번 스캔 필요 (2) 상관 서브쿼리는 답이 될 수 없다 어쨋든 테이블에 2번 접근해야 한다 (3) 윈도우 함수로 결합 해결 목표는 테이블 접근 1회로 줄이기 ROW_NUMBER를 사용해 구매 이력 번호를 붙이고, 이력이 1인 레코드 추출 3) 장기적인 관점에서의 리스크 관리 결합을 사용한 쿼리의 불안정 요소(상관 서브쿼리도 유사) 결합 알고리즘의 변동 리스크 환경 요인에 의한 지연 리스크(인덱스, 메모리, 매개변수 등) (1) 알고리즘 변동리스크 상황에 따라 변하는 결합 알고리즘 (2) 환경 요인에 의한 지연 리스크 결합을 사용한다는 것 = 장기적인 관점에서의 리스크 증가 4) 서브쿼리 의존증 - 응용편 (1) 다시 서브쿼리 의존증 (5) 서브쿼리는 정말 나쁠까? 생각하기는 쉬우나 RDB와는 맞지 않다 ch 22. 서브쿼리 사용이 더 나은 경우 결합쿼리는 최대한 결합 대상 레코드수를 줄이는 것이 중요한데, 옵티마이저가 잘 판단하지 못하는 경우 직접 연산 순서를 명시하는 용도로 힌트 사용 1) 결합과 집약 순서 (1) 두 가지 방법 ...

책뿌수기 - SQL 레벨업 5

인용하는 그림은 다양한 곳에서 가져왔음을 밝힙니다 5. 반복된(절차 지향형의 속박) ch 14. 반복문 의존증 RDB는 관계 전체를 조작의 대상으로 삼기 때문에 설계상에서 반복을 제외했다 ch 15. 반복계의 공포 record at a time 사고 방식 반복계의 장점은 생각하기 쉽고 단순하다는 것 1) 반복계의 단점 성능 (1) SQL 실행의 오버헤드 전처리 a. sql 구문을 네트워크로 전송 b. DB 연결 c. sql 구문 파스 d. sql 구문의 실행 계획 생성 또는 평가 후처리 e. 결과 집합을 네트워크로 전송 a, e는 동일한 본체에 있거나 분리되어 있어도 고만고만함 b는 요즘에 커넥션 풀이라는 기술로 오버헤드를 감소시킴 c와 d가 주된 오버헤드이다. 그중에서도 c가 성가시다 c는 db가 sql을 받을때 마다 실행하므로 반복계에서는 오버헤드의 비중이 커진다 (2) 병렬 분산이 힘들다 반본계는 하나씩만 처리하기 때문에 병렬처리가 힘들다 저장소의 분산 효율이 낮다(하나씩 처리하다보니 한번에 처리하는 데이터가 얼마안됨) (3) 데이터 베이스의 진화로 인한 혜택을 받을 수 없다 대규모의 데이터를 효율적으로 다루기 위해 진화하고 있으나, 반복계를 사요하면 그 혜택을 받을 수 없다 포장계 sql이 반복계에 비해 복잡하므로 튜닝을 잘해야 하는 단점도 있는 반면 제대로만 튜닝하면 현격한 성능차이가 발생한다 반복계는 단순해 튜닝포인트도 적다 2) 반복계를 빠르게 만드는 방법은 없다 (1) 반복계를 포장계로 다시 작성 애플리케이션의 수정을 의미 (2) 각각의 sql을 빠르게 수정 너무 단순해 튜닝한 건덕지가 없음 (3) 다중화 처리 리소스 여유가 있고, 처리를 나눌 수 있는 키가 있고, 순서가 중요하지 않다면 다중화 가능 3) 반복계의 장점 sql이 단순하다 (1) 실행 계획의 안정성 실행계획이 바뀌어 느려지는 경우가 없다 (2) 예상 처리 시간의 정밀...

책뿌수기 - SQL 레벨업 5 123

인용하는 그림은 다양한 곳에서 가져왔음을 밝힙니다 5. 반복된(절차 지향형의 속박) ch 14. 반복문 의존증 RDB는 관계 전체를 조작의 대상으로 삼기 때문에 설계상에서 반복을 제외했다 ch 15. 반복계의 공포 record at a time 사고 방식 반복계의 장점은 생각하기 쉽고 단순하다는 것 ###1) 반복계의 단점 성능 (1) SQL 실행의 오버헤드 전처리 a. sql 구문을 네트워크로 전송 b. DB 연결 c. sql 구문 파스 d. sql 구문의 실행 계획 생성 또는 평가 후처리 e. 결과 집합을 네트워크로 전송 a, e는 동일한 본체에 있거나 분리되어 있어도 고만고만함 b는 요즘에 커넥션 풀이라는 기술로 오버헤드를 감소시킴 c와 d가 주된 오버헤드이다. 그중에서도 c가 성가시다 c는 db가 sql을 받을때 마다 실행하므로 반복계에서는 오버헤드의 비중이 커진다 (2) 병렬 분산이 힘들다 반본계는 하나씩만 처리하기 때문에 병렬처리가 힘들다 저장소의 분산 효율이 낮다(하나씩 처리하다보니 한번에 처리하는 데이터가 얼마안됨) (3) 데이터 베이스의 진화로 인한 혜택을 받을 수 없다 대규모의 데이터를 효율적으로 다루기 위해 진화하고 있으나, 반복계를 사요하면 그 혜택을 받을 수 없다 포장계 sql이 반복계에 비해 복잡하므로 튜닝을 잘해야 하는 단점도 있는 반면 제대로만 튜닝하면 현격한 성능차이가 발생한다 반복계는 단순해 튜닝포인트도 적다 2) 반복계를 빠르게 만드는 방법은 없다 (1) 반복계를 포장계로 다시 작성 애플리케이션의 수정을 의미 ####(2) 각각의 sql을 빠르게 수정 너무 단순해 튜닝한 건덕지가 없음 (3) 다중화 처리 리소스 여유가 있고, 처리를 나눌 수 있는 키가 있고, 순서가 중요하지 않다면 다중화 가능 3) 반복계의 장점 sql이 단순하다 ####(1) 실행 계획의 안정성 실행계획이 바뀌어 느려지는 경우가 없다 )(2) ...

알고리즘 복습하기

복습도 할겸, 새로산 노트9 펜도 써볼겸 겸사겸사

우왕 예비군끝~!

어제 마지막 예비군 훈련을 받았다. 6년동안 받던 훈련도 끝났구나..ㅜ 그만큼 나이를 먹었다는 뜻이겠지. 이제 2년간의 휴식기를 갖고 민방위훈련을 받게되는데 그동안에 뭔가를 이루고싶다. 개인적인 목표이든 외적인 성과이든 뭔가 쉽지않은 것으로. 시간이 흐르면 절로 생기는 것들말고. 오래동안 해오던것에 변화가 생기면 과거를 되돌아보게되는데 2년후에 민방위훈련을 시작하게되면 아마도 2년동안 무엇을했나 생각하게될것 같다. 그때 '아 그래도 이것 하나는 이뤘네, 놀기만 한건아니네' 라고 생각하고싶다. 그 동안 고민도 많이하고 시간도 많이 날렸다 빠이팅해보자!!

인터럽트와 예외 - 1

개요 인터럽트는 프로세서가 실행하는 명령어의 순서를 바꾸는 사건으로 정의한다. 이런 사건은 CPU의 내·외부에서 하드웨어적인 회로가 발생하는 전기적인 신호에 해당하다. 흔히 동기적 인터럽트와 비동기적 인터럽트로 나눈다. 동기적인 인터럽트는 CPU의 제어 유닛이 명령어를 실행하는 과정에서 발생하는데, 제어 유닛은 명령어 실행을 마친 후에만 이를 발생시키기 때문에 동기적이라고 한다. 비동기적 인터럽트는 다른 하드웨어 장치가 CPU 클럭의 신호와 관계없이 아무 때나 발생한다. 인텔 마이크로프로세서 매뉴얼에서는 동기적인 인터럽트를 예외(Exception), 비동기적인 인터럽트를 인터럽트라고 명한다. 인터럽트는 간격 타이머와 입출력장치에 의해 발생한다. 입출력장치인 키보드의 키를 누르면 인터럽트가 발생한다. 반면, 예외는 프로그래밍 에러나 커널이 처리해야 하는 비정상적인 상황에 의해 발생한다. 프로그래밍 에러인 경우 커널은 현재 프로세스에게 신호를 보내 예외를 처리한다. 비정상적인 상황인 경우에는 페이지 폴트(Page Fault)나 커널 서비스 요청(int 또는 systenter) 같은 비정상적인 상황을 복구하는데 필요한 모든 단계를 수행한다. 인터럽트 신호와 역할 인터럽트 신호는 프로세서가 정상적인 제어 흐름 밖의 코드로 방향을 바꾸는 방법을 제공한다. 인터럽트 신호가 도착하면 CPU는 EIP와 CS 레지스터를 커널 모드 스택에 저장하고, 발생한 인터럽트 종류와 연계된 주소를 프로그램 카운터에 넣어 수행한다. 이 전환 과정은 프로세스 전환 과정의 컨텍스트 전환과 큰 차이가 있다. 인터럽트·예외 핸들러가 실행하는 코드는 프로세스가 아니다. 인터럽트가 발생한 시점에 CPU를 점유하고 있던 프로세스가 수행되던 과정에서 실행되는 커널 제어 경로라고 할 수 있다. 인터럽트 핸들러는 커널 제어 경로 이므로 프로세스보다 가볍다. 인터럽트는 다음의 조건을 만족해야 한다. 가능한 빨리 인터럽트에서 벗어나고 되도록 ...

프로그래머스 - 줄서는 방법

문제가 점점 어려워지는군욤 import java.util.ArrayList ; import java.util.Arrays ; public class LineCombination { public int [] setAlign ( int n , long k ) { int [] answer = new int [ n ]; ArrayList < Integer > list = new ArrayList < Integer >(); int [] fac = new int [ n + 1 ]; fac [ 0 ] = 1 ; for ( int i = 1 ; i < n ; i ++) { fac [ i ] = fac [ i - 1 ]* i ; } int idx = 0 ; for ( int i = 0 ; i < n ; i ++) { list . add ( i + 1 ); } for ( int i = 0 ; i < n ; i ++) { idx =( int ) (( k - 1 )/ fac [ n - 1 - i ]); answer [ i ]= list . get ( idx ); list . remove ( idx ); k =( k - 1 )% fac [ n - 1 - i ]+ 1 ; } return answer ; } // 아래는 테스트로 출력해 보기 위한 코드입니다. public static void main ( String [] args ) { LineCombi...

SQL 고난이도

1.emp에서 이름, 급여, 커미션 금액, 총액(급여+커미션금액)을 구하여 총액이 많은 순서대로 출력하라. select first_name, salary, salary*commission_pct, (salary + salary*commission_pct) total from hr_employees where commission_pct is not null 2. 80번 부서의 모든사람들에게 급여의 13%를 보너스로 지불하기로 했다. 이름, 급여, 보너스 금액, 부서번호를 출력하라 select first_name, salary, salary*0.13, department_id from hr_employees where department_id=80

뉴럴 네트워크 기초 - 실수치 회로, 역전파

https://tensorflow.blog/1%EC%9E%A5-%EC%8B%A4%EC%88%98%EC%B9%98-%ED%9A%8C%EB%A1%9C-%ED%95%B4%EC%BB%A4%EA%B0%80-%EC%95%8C%EB%A0%A4%EC%A3%BC%EB%8A%94-%EB%89%B4%EB%9F%B4-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/ 을 공부한 내용 https://github.com/jaejin0me/NeuralNetwork import sys import random from math import exp class rgate : def mul ( x , y ): return x * y def add ( x , y ): return x + y class unit : value = 0.0 grad = 0.0 def __init__ ( self , value = 0.0 , grad = 0.0 ): self .value = value self .grad = grad class u : value = 0.0 grad = 0.0 def __init__ ( self , value = 0.0 , grad = 0.0 ): self .value = value self .grad = grad class mg : u0 = None u1 = None ru = None def __init__ ( self , u0 = None , u1 = None ): self .u0 = None self .u1 = None self .ru = None def f ( self , u0 , u1 ): self .u0 = u0 self .u1 = u1 self .ru = unit(u0.value * u1.value, 0 ) return self .ru def b ( self ): self .u0.grad += self .ru.gra...