Skip to content

Latest commit

ย 

History

History
427 lines (384 loc) ยท 9.24 KB

File metadata and controls

427 lines (384 loc) ยท 9.24 KB

์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณ„ ์ฝ”๋“œ

Longest Increasing Subsequence

def CeilIndex(A, l, r, key): # ๋‚ด๋ฆผ์ฐจ์ˆœ์ผ๋•Œ ์‚ฌ์šฉํ•˜๋Š” binary search.
  
    while (r - l > 1): 
      
        m = l + (r - l)//2
        if (A[m] >= key): 
            r = m 
        else: 
            l = m 
    return r 

def LIS(l):
    mm=[0]*len(l)
    pos=[0]*len(l)
    end=0
    maxend=0
    lenmm=0
    for j in range(len(l)):
        if end>0:
            lenmm=max(lenmm,end)
            r=CeilIndex(mm,-1,lenmm-1,l[j])
            if mm[r]>=l[j]:
                mm[r]=l[j]        
                pos[j]=r
                end=r+1
            else:
                mm[r+1]=l[j]
                pos[j]=r+1
                end=r+2
            maxend=max(maxend,end)
        else:
            mm[end]=l[j]
            pos[j]=end
            end+=1
    maxend=max(maxend,end)

    s=[]
    t=maxend-1
    for i in range(len(pos)-1,-1,-1):
        if t==pos[i]:
            s.append(l[i])
            t-=1

    return maxend, reversed(s)

์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ

Prim

l=None

def findroot(a):
    global l
    _root=a
    while l[_root]!=_root:
        _root=l[_root]
    l[a]=_root#์ œ์ถœ๊ฒฐ๊ณผ๋กœ ๋ณด๋ฉด ์žˆ๋Š”๊ฒŒ ๋” ๋น ๋ฆ„. (Path Compression)
    return _root

def setroot(a,b):#union
    global l#,l_size
    root_a=findroot(a)
    root_b=findroot(b)
    if root_a != root_b:
        l[root_b]=root_a

"""
v = [] # ๊ฐ„์„ ๋“ค.
v.append( [๋…ธ๋“œ๋ฒˆํ˜ธ,๋…ธ๋“œ๋ฒˆํ˜ธ,๊ฐ€์ค‘์น˜] )
m # ๋…ธ๋“œ์˜ ์ˆ˜.
"""
def mst(v,m):
    global l#,l_size
    l = [i for i in range( m )] # disjoint set
    i=0
    totalLen = 0
    v.sort(key=lambda x:x[2] ) # ๊ฐ€์ค‘์น˜๋กœ ์ •๋ ฌ.

    c = 0 # ์„ ํƒํ•œ ๊ฐ„์„ ์˜ ์ˆ˜.
    while c < m - 1:
        a = v[i][0]
        b = v[i][1]
        if findroot(a) != findroot(b): #์ง‘ํ•ฉ์„ ํ•ฉ์น˜๋Š” ๊ฐ„์„ ์„ ์„ ํƒ.
            setroot(a,b)
            totalLen += v[i][2]
            
            c += 1
        i+=1 
    return totalLen

์ตœ๋‹จ๊ฑฐ๋ฆฌ

Dijkstra by heap

import heapq
e = 10 # ๋…ธ๋“œ์˜ ์ˆ˜.
source = 0 # ์‹œ์ž‘์ง€์ 
v=[set() for _ in range(e)]#๊ฐ„์„  : ํฌ์†Œ ๊ทธ๋ž˜ํ”„์ผ๋–„ set()์„ ์“ฐ๋ฉด ๋น ๋ฆ„.
dis=[[inf]*e for _ in range(e)]#์‹œ์ž‘ ์ง€์ ์—์„œ ๊ฐ ์ง€์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ

inf=9999999

h=[]#heap

heapq.heappush(h,(0,source))

while len(h)>0:
    dmin=inf
    k=-1#์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ํ™•์ • ๋˜์ž ์•Š์€ ์ง‘ํ•ฉ C ์ค‘์—์„œ ์‹œ์ž‘ ๋…ธ๋“œ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ
    
    dmin,k=heapq.heappop(h)

    dis[source][k]=dmin
    t=dmin+1
    for node in (  v[k] ):
        if t<dis[source][node]:
            dis[source][node]=t
            heapq.heappush(h, (t,node) )

Floyd Warshall

"""
for๋ฌธ์˜ ๋ณ€์ˆ˜์— ์œ ์˜.

k๊ฐ€ i๋ถ€ํ„ฐ j๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์œ„์˜ ๋…ธ๋“œ๋ผ๋ฉด
i->k k->j์˜ ๋ถ€๋ถ„์˜ ์ตœ์ ์ด ๋˜์–ด์•ผํ•จ.

k๋ฅผ ์ง€๋‚˜๊ฐ€๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ ์Œ.

๊ฐ€์ค‘์น˜๊ฐ€ ์Œ์ด๋ฉด ์•ˆ๋จ.
"""
#Floyd Warshall
for k in range(1,20+1):
    for i in range(1,20+1):
        for j in range(1,20+1):
            if dis[i][j]>dis[i][k]+dis[k][j]:
                dis[i][j]=dis[i][k]+dis[k][j]
                dis[j][i]=dis[i][k]+dis[k][j]
// Floyd Warshall algorithm
/*
์œ„ ์ฝ”๋“œ๋ž‘ ์ฐจ์ด: ๋ฐฉํ–ฅ์ด ์žˆ์Œ
i->j์˜ ๊ฑฐ๋ฆฌ์™€ i->k->j์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋น„๊ตํ•ด์„œ i->j์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•จ

์ด๋ฏธ ์žˆ๋Š” ๊ฒฝ๋กœ์— k๊ฐ€ ๋ผ์–ด ๋“ค๊ฑฐ๋‚˜ k๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ์ด์–ด์ค€๋‹ค.
i->j => i->k->j // k๋ฅผ ๊ฒฝ์œ ํ•˜๊ธฐ
i->k, k->j => i->k->j // i๋ž‘ j๊ฐ€ k๋ฅผ ๊ฒฝ์œ ํ•ด์„œ ์ด์–ด์ง

k ๋ฃจํ”„ ์•ˆ์— i๋ž‘ j์˜ ๋ฃจํ”„๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค.
*/
for(let k=0;k<100;k++){
    for(let i=0;i<100;i++){
        for(let j=0;j<100;j++){
            g[i][j]=Math.min(g[i][j], g[i][k]+g[k][j])
        }
    }
}

์ˆ˜ํ•™

n๊ณผ n์˜ ์•ฝ์ˆ˜๋“ค์„ ์˜ค๋ฆ„์ฐจ ์ˆœ์œผ๋กœ ์ถœ๋ ฅ

def divisors(n):#n๊ณผ n์˜ ์•ฝ์ˆ˜๋“ค์„ ์˜ค๋ฆ„์ฐจ ์ˆœ์œผ๋กœ ์ถœ๋ ฅ
    r1=[]
    r2=[]
    sqrtn=int(n**(1/2))
    a = 1
    while a * a < n:
        if not n % a:
            r1.append(a)
            r2.append(n // a)
        a += 1
        
    if sqrtn * sqrtn == n:
        r1.append(sqrtn)
    r2.reverse()
    return r1+r2

print(divisors(244324**2))

n์„ r์ง„๋ฒ•์œผ๋กœ ์ถœ๋ ฅ

def radix(n,r):#n์„ r์ง„๋ฒ•์œผ๋กœ ์ถœ๋ ฅ
    ret=""
    if n==0:
        return "0"
    while n>0:
        n,m=divmod(n,r)
        ret="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[m]+ret
    return ret

์ •์ˆ˜์˜ ์ œ๊ณฑ๊ทผ.

#x์™€ y๋Š” ๋‘˜๋‹ค ์ •์ˆ˜.
def sqrt(x):#Babylonian method
    if x == 0 or x == 1:
        return x
    
    y = x//2
    while y > x//y:
        y = (x // y + y) // 2
    return y

์†Œ์ˆ˜

1 ์€ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹˜.

1๋ถ€ํ„ฐ N๊นŒ์ง€ ์†Œ์ˆ˜๋ฅผ ์ถœ๋ ฅ.

def primenum(N):
    cut=int(N**(1/2))
    primenums=[2]
    for i in range(3,N+1,2):
        p=True
        for c in primenums:
            if i%c==0:
                p=False
                break
            elif c>cut:
                break
        if p:
            primenums.append(i)
        if i>cut:
            break
    #primenums.append(1)
    return primenums

์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด

const long long N = 3000001;
vector<long long> primes;
bitset<N> primeFlag;
int primesieve(long long n){
    primeFlag.flip();
    long long i = 2;
    if(primeFlag[i]){//์†Œ์ˆ˜์ผ๋•Œ
        long long x = 2 * i;//p[i]๋Š” true๋กœ ์œ ์ง€.
        primes.push_back(2);
        while (x < n){
            primeFlag[x] = false;
            x += i;
        }

    }
    for(i = 3;i < n;i+=2){       
        if(primeFlag[i]){//์†Œ์ˆ˜์ผ๋•Œ
            long long x = 2 * i;//p[i]๋Š” true๋กœ ์œ ์ง€.
            primes.push_back(i);
            while (x < n){
                primeFlag[x] = false;
                x += i;
            }
        }
    }
    return 0;
}

์†Œ์ˆ˜์ธ์ง€ ํŒ๋ณ„.

def isprime(n):
    if n==2:
        return True
    if n%2==0:
        return False
    if n==1:
        return False    
    sqrtN=int( pow(n,1/2) )
    for x in range(3,sqrtN+1,2):
        if n%x==0:
            return False
    return True

๊ธฐํƒ€

Search

์ด๋ถ„ํƒ์ƒ‰ : ์˜ค๋ฆ„์ฐจ์ˆœ, Lower bound

#binary search (lower bound : ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์˜ ์œ„์น˜)
a=0
b=len(y)-1
while a<b:
    m=(a+b)//2
    if y[m]<q:
        a=m+1
    else:
        b=m
        
print(y[a])#ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’

Flood-fill

"""
W์ธ ๊ณณ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์ถœ๋ ฅ.
"""
def sol(img,i,j):# (i,j) : ์‹œ์ž‘ ์œ„์น˜.
    
    rBound=len(img)
    cBound=len(img[0])
    
    v=[[0]*cBound for _ in range(rBound)]#visted, count war eagles
    q=[]#queue
    cnt=0

    q.append([i,j])
    while len(q)>0:
        ii,jj=q.pop(0)
        if ii<0 or jj<0 or rBound<=ii or cBound<=jj:#out of bound
            continue
        if img[ii][jj]=='W' and v[ii][jj]==0:
            v[ii][jj]=1
            cnt+=1
            for qq in [ii-1,ii,ii+1]:
                for ww in [jj-1,jj,jj+1]:
                    q.append([qq,ww])

    return cnt

Disjoint set

n=10
l=[i for i in range(n)]

def findroot(a):#root๋ฅผ ์ฐพ๋Š”๋‹ค.
    global l
    _root=a
    while l[_root]!=_root:
        _root=l[_root]
    l[a]=_root#์ œ์ถœ๊ฒฐ๊ณผ๋กœ ๋ณด๋ฉด ์žˆ๋Š”๊ฒŒ ๋” ๋น ๋ฆ„. (Path Compression)
    return _root

def setroot(a,b):#union
    global l
    root_a=findroot(a)
    root_b=findroot(b)
    if root_a != root_b:
        l[root_b] = root_a
        #setsize[root_a] += setsize[root_b]
    
def cntsets():# ์ง‘ํ•ฉ์˜ ์ˆ˜. (์ถœ๋ ฅ์€ n๊ฐœ์—์„œ 1๊ฐœ)
    global l
    ll=map(findroot,l)
    return len(set(ll))    
vector <int> l(5001);
vector <int> setsize(5001);
int n=0;//์‚ฌ๋žŒ์ˆ˜

auto findroot=[&](int i){//root๋ฅผ ์ฐพ์Œ.
    int _i=i;
    while (l[_i]!=_i){
        _i=l[_i];
    }
    l[i]=_i;
    return _i;
};

auto setroot=[&](int a,int b){//๋‘˜์˜ root๋ฅผ ์ผ์น˜์‹œํ‚ด. b์˜ ๋ฃจํŠธ๋กœ ์ผ์น˜์‹œํ‚ด. (union)
    a=findroot(a);
    b=findroot(b);
    if(a!=b){
        setsize[b]=setsize[a]+setsize[b];//๊ฐ ์ง‘ํ•ฉ์˜ elements์˜ ์ˆ˜๋ฅผ unionํ• ๋•Œ๋งˆ๋‹ค ๊ณ„์‚ฐ.
        l[a]=b;
    }
};

auto cntElements=[&](int e){//e๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์˜ elements์˜ ๊ฐฏ์ˆ˜.
    int root=findroot(e);
    return setsize[root];
};

์ด์ง„ ํŠธ๋ฆฌ ์ƒ์„ฑ

class f:
    def __init__(self, n,LIS):
        self.n=n
        self.l=None
        self.r=None
    
btree=f(l[0],1)
maxn=-9999999
for j in range(1,len(l)):
    node=btree
    new_node=f(l[j],1)
    while True:
        if new_node.n<node.n:
            if node.l:
                node=node.l
            else:
                node.l=new_node
                break
        elif new_node.n>node.n:
            if node.r:                     
                node=node.r                
            else:
                node.r=new_node                
                break
  

์ขŒํ‘œํ‰๋ฉด์ƒ์˜ ์ ์„ ์™„์ „ ๊ทธ๋ž˜ํ”„๋กœ ๋ณด๊ณ  ๊ฐ„์„ ์„ ์ƒ์„ฑ.

#์ขŒํ‘œ -> ์™„์ „๊ทธ๋ž˜ํ”„
"""
๊ฐ์ ์˜ ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅ๋ฐ›์Œ.

๊ฐ ์ขŒํ‘œ๋ฅผ ๋…ธ๋“œ๋กœ ์ทจ๊ธ‰.
๋ชจ๋“  ๋…ธ๋“œ์™€ ๋…ธ๋“œ ์‚ฌ์ด์— ๊ฐ„์„ ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •. ๊ฐ ๊ฐ„์„ ์ด ์ž‡๋Š” ๋…ธ๋“œ์™€ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅ.
"""
import math
def distance(x1,y1,x2,y2):
    return math.sqrt( (x1-x2)**2+(y1-y2)**2 )
    
def pointsToGraph(points,n):    
    distances=[]#๊ฐ points ๊ฑฐ๋ฆฌ.

    for i in range(n-1):
        for j in range(i+1,n):
            d=distance( points[i][0],points[i][1],points[j][0],points[j][1] )
            distances.append([i,j,d])    
    
    return distances

๋‘ ์ ์˜ ๊ฑฐ๋ฆฌ

import math
def distance(x1,y1,x2,y2):
    return math.sqrt( (x1-x2)**2+(y1-y2)**2 )