전체 702

[백준]1069 집으로 #기하

1. 풀이 처음엔 아래와 같은 경우의 수만 생각했지만, 이는 일직선상에서만 적용되는 경우였다. (소스코드1) 즉 2차원의 경우엔 아래와 같은 예외가 존재한다. 따라서 2차원의 좌표평면의 경우는 아래와 같은 경우의 수를 생각할 수 있다. 2. 소스코드 (1) 소스코드1 (경우의 수 오류) import math X,Y,D,T=map(int,input().split()) L=math.sqrt(X**2+Y**2) if L>=D: jump=L//D print("%.10f"%min(jump*T+L-(jump*D),(jump+1)*T)) else: print("%.10f"%min(L,T+D-L,2*T)) (2) 소스코드2 import math X,Y,D,T=map(int,input().split()) L=math.s..

알고리즘/수학 2020.08.06

[백준]1849 순열 #세그먼트트리#파이썬

1. 풀이 (1) 숫자를 넣는 방법 숫자를 1부터 차례대로 적절한 위치에 집어넣는다. 숫자를 1부터 집어넣기 때문에 집어넣을 위치 앞에 아직 차지 않은 부분은 무조건 현재넣을 숫자보다 크고, 이미 차있는 숫자는 현재숫자보다 작다. (2) 세그먼트 트리 따라서 숫자가 들어갈 위치를 세그먼트트리를 이용해서 찾는다. 세그먼트트리를 이용해서 구간합을 구해주는데, 이를 이용하여 현재 위치앞에 몇개의 숫자가 있는지를 빠르게 확인해준다. * 처음에 update함수 따로, 위치를 찾는 함수를 따로 구현해서 시간 초과가 떳다(소스코드1). 위치를 찾으면서 바로 수정을 해야 통과한다. 2. 소스코드 (1) 소스코드1 (update함수, 쿼리함수 따로구현, 시간초과) import sys import math def init..

알고리즘/graph 2020.08.05

자코비안 메트릭스

미분을 하는데 네가지 경우가 있다. 1. 스칼라함수를 스칼라변수로 미분하는경우 2. 스칼라함수를 벡터변수로 미분하는경우 3. 벡터함수를 스칼라변수로 미분하는경우 4. 벡터함수를 벡터변수로 미분하는경우 행이 함수, 열이 변수를 나타낸다. 즉 1행 1열은 1번째함수를 1번째 변수로 편미분한값 2행 1열은 2번째함수를 1번째 변수로 편미분한값, 1행 2열은 1번쨰 함수를 2번째 변수로 편미분한 값을 뜻한다. * 출처 강의 : 패스트캠퍼스 - 수학적으로 접근하는 딥러닝 논문 : https://arxiv.org/pdf/1802.01528.pdf

[백준]6549 히스토그램에서 가장 큰 직사각형 #세그먼트트리

1. 풀이 이 문제에선 "붙어있는 수열에서 최솟값을 찾는 행위" 를 엄청 많이 해야 한다. (= 이를 쿼리라고 한다) 이때 "붙어있는 수열에서 최솟값을 찾는 행위"를 빠르게 하기 위해 세그먼트트리를 사용한다. 이 문제는 너비는 모든 직사각형이 같지만, 높이만 다르기 때문에 연속된 높이들 중 가장 작은 높이가 만들수있는 직사각형의 높이가 된다. 따라서 높이의 최솟값을 세그먼트 트리에 저장한다. 이때 주의할점은 분할 정복을 할 때 최소 높이를 기준으로 좌 우로 계속해서 탐색을 해야 하기 때문에, 최소높이의 인덱스를 알아야 한다는 것이다. 따라서 세그먼트 트리에는 최소높이와 함께 최소 높이의 인덱스도 저장해야 한다. 2. 소스코드 import math import sys sys.setrecursionlimit..

알고리즘/graph 2020.08.01

객체가 속해있는 클래스의 내장함수 확인하는법 dir

dir(객체) 를 하면 객체가 속해있는 클래스의 내장함수들을 확인할 수 있다. * string 클래스 a="string" print(dir(a)) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce_..

클래스 static 변수

파이썬에선 클래스 내의 변수는 일단 static 변수로 생각하면된다. 따라서 각 객체에서 접근하면 메모리 위치가 같다. class myClass: staticValue=0 def __init__(self,x,y): self.x=x self.y=y e=myClass(10,20) f=myClass(20,30) print(id(e.staticValue)) print(id(f.staticValue)) 4548777056 4548777056 또한 변수를 수정했을때도 반영된다. ( class.staticvalue 형태로 접근한다 ) myClass.staticValue=100 print(e.staticValue) print(f.staticValue) 100 100 여기서 객체를 통해 staticValue를 수정하면,..

세그먼트트리

수열이 있을 때 중에서 연속된 특정구간을 주고, 특정구간의 1. 최댓값([백준]2357 최솟값과 최댓값) 2. 최솟값([백준]10868 최솟값) 3. 합([백준]2042 구간합, [백준]1275 커피숍2) 4. 곱([백준]11505 구간곱 구하기) 을 여러번 구하는 문제는 세그먼트트리를 쓰면 된다. 세그먼트 트리를 사용하기 위해선 보통 아래와 같은 3가지 함수가 필요하다. 1. 주어진 수열을 이용하여 처음으로 세그먼트 트리를 만드는 함수 2. 세그먼트트리의 노드하나를 수정하는 함수 3. 세그먼트트리를 이용하여 구간합(or 구간곱 or 최댓값,최솟값)을 구하는 함수. 각 함수코드는 다음과 같다. 1. 세그먼트트리 초기화 함수. def init(node,start,end): if start==end: tre..

알고리즘/graph 2020.07.26

[백준]팰린드롬 분할 #팰린드롬

1. 풀이 (1) dp[i][j] = i에서 j까지의 문자가 팰린드롬이 가능하면 1, 그렇지 않으면 0. (2) count[i] = i번째 문자까지의 분할의 개수의 최솟값 여기서 count[i]를 구하는법이 이문제의 핵심이다. i를 구하는 법은 다음과 같다. --------------------------------------------------------------------------- count[i] = j가 1부터 i까지 도는데 이때 i) j부터 i까지가 팰린드롬이면 => count[j-1]+1 ii) j부터 i까지 팰린드롬이 아니면 => count[j-1]+i-j+1 -----------------------------------------------------------------------..

알고리즘/dp 2020.07.17

오버로딩과 오버라이딩

1. 오버로딩 : 이름은 같고, 매개변수의 타입과 개수만 다른 함수가 여러개 있을 때, 입력값의 형식이 맞는 함수를 적절히 찾아서 사용하는기술 * 파이썬에선 오버로딩이 불가능 하다! 같은 이름의 함수가 여러개 있으면, 가장 밑에 있는 함수가 실행됨 (덮어써지기 때문에) 2. 오버라이딩 : 부모클래스와 상속된 자식 클래스의 매소드이름이 같을 때 자식 클래스의 함수를 사용하는 것 (함수를 재정의하는 기술) # 상속 class FourCal: def __init__(self, first, second): self.first = first self.second = second def setdata(self, first, second): self.first = first self.second = second de..

[백준]2004 조합0의 개수 #팩토리얼#나누기

1. 풀이 nCm의 뒤에 0의 개수는 10이 곱해준 수와 같다. 따라서 nCm=n!/(m! * (n-m)!) 에서 10이 몇번곱해졌는지를 확인한다. (1) 10이 몇번곱해졌는지 알기위해선 소인수분해를 이용해 2와 5가 몇번곱해졌는지를 확인한다. (2) n!에서 num가 몇번곱해졌는지는 다음의 방법으로 알 수가 있다. ex) 150! 에서 5가 몇번곱해졌는가? 5^1이 곱해진 횟수를 구한다 => 150//5=30 5^2이 곱해진 횟수를 구한다 => 150//25=6 5^3이 곱해진 횟수를 구한다 => 150//125=1 총 횟수 => 36 이를 소스코드로 나타내면 다음과 같다 def cntNum(a,num): ans=0 multiNum=num while(multiNum

알고리즘/수학 2020.07.16

[백준]3109 빵집 #그리디#dfs

1. 풀이 (1) 0열(빵집)에서 가장 윗 행부터 차례대로 출발하여 (오른쪽위,오른쪽,오른쪽아래) 순서대로 파이프를 놓는다. (2) 끝열(원웅이집) 까지 놓을 수 있으면 최종답 +1후 종료, 놓을자리가 없으면 그자리에서 종료 (3) 이때 방문했던 곳은 다시 방문할 수 없으므로 표시해준다. (끝열(원웅이집)까지 못가더라도 윗행에서 못가면 아래에서도 못가기 때문에 visited로 표시해준다) * 파이프를 최대한으로 설치하기 위해선 무조건 (우상,우,우하) 순으로 진행되고, 윗행에서 부터 아래행으로 내려오면서 탐색하면 반드시 최적해가 나오는 그리디 문제이다. 또한 파이프를 최대로 만들기 위해선 엇갈리는 경우도 배제해야 한다. ( 커플만들기 문제와 비슷 https://sosoeasy.tistory.com/40)..

알고리즘/수학 2020.07.15

[SQL] DDL (create drop alter)

CREATE 1. 테이블 생성 creat table (테이블이름) ( (컬럼이름) (타입)(글자수) (옵션) ); create table dept( deptno varchar2(4) primary key, deptname varchar2(20); ); create table emp ( empno number(10), ename varchar2(20), sal number(10,2) default 0, --소수점 2째자리, 기본값은 0 constraint emppk primary key(empno), --empno를 기본키로 constraint deptfk foreign key (deptno) --deptno를 외래키로 references dept(deptno), on delete cascade --dep..

DB/SQL 2020.07.11