๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[codility] Lesson 4-4) PermCheck 5-1) countDiv 5-2) GenomicRangeQuer

by Tamii 2021. 7. 17.
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ 4-4) PermCheck

1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ +1 ์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆ˜์—ด์ธ์ง€ ์•„๋‹Œ์ง€ ํŒ๋ณ„ํ•˜์—ฌ๋ผ 

 

์ฒ˜์Œํ’€์ด

def solution(A):
    A.sort()

    if len(A)>1:
        for i in range(len(A)-1):
            if A[i]+1==A[i+1]:

                ans=1
            else:
                ans=0
                break
        return ans
    else:
        if A[0]==1:
            return 1
        else:
            return 0

A์˜ ๋ฐฐ์—ด์„ ๋’ค์˜ ๊ฐ’๊ณผ ๋น„๊ตํ•˜๊ณ 

๊ทธ ๊ฐ’๊ณผ 1์ฐจ์ด ๋‚ ๋•Œ๋งŒ ์ •๋‹ต ์•„๋‹ˆ๋ฉด 0

A๋ฐฐ์—ด ์ธ์ž๊ฐ€ ํ•˜๋‚˜๋ผ๋ฉด 1์ผ๋•Œ๋งŒ ์ •๋‹ต ์•„๋‹ˆ๋ฉด 0 ์ด๋ผ๋Š” ๋กœ์ง์œผ๋กœ ํ’€์—ˆ์ง€๋งŒ..

 

 

ํžˆ๋“  ํ…Œ์ผ€๋ฅผ ์œ ์‹ฌํžˆ ์ฝ์–ด๋ณด๋‹ˆ 

[2,3,4,5...] 1์ด ์•„๋‹Œ ์ˆ˜๋กœ ์‹œ์ž‘ํ•˜๋Š” ์—ฐ์†์ˆ˜์—ด

[1,1] ๋”๋ธ” ๋‘๊ฐœ๊ฐ€ ์•ˆ์žกํžˆ๋Š”๊ฑธ ํ™•์ธํ•˜๊ณ  

 

 

์ •๋‹ต ํ’€์ด

def solution(A):
    A.sort()
    if A[0]==1:
        if len(A)<2:
            return 1
        else:
            for i in range(len(A)-1):
                if A[i]+1==A[i+1]:
                    ans=1
                else:
                    ans=0
                    break
            return ans
    else:
        return 0

์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟจ๋‹ค.

๋ฌธ์ œ๋ฅผ ๊ผผ๊ผผํžˆ ์ฝ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ตํ›ˆ์„ ์–ป์—ˆ๋‹ค. 

 

 

 

 

๋‹ค๋ฅธ ํ’€์ด

def solution(A):
    if max(A) != len(A) or len(set(A)) != len(A):
        return 0
    return 1

A = [1,2,3,4,5,6] 

์ตœ๋Œ€๊ฐ’ = 6 

๊ธธ์ด = 6 

์ด๋ฏ€๋กœ ์ƒ์œ„ ์กฐ๊ฑด๋“ค์„ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ–ˆ๋‹ค.

 


๐Ÿ“Œ 5-1 ) CountDiv

A์™€ B ์‚ฌ์ด์— ์ž‡๋Š” ์ˆ˜๋“ค ์ค‘ K๋กœ ๋‚˜๋ˆ ์ง€๋Š” ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ!

์ž‰? ๋ชจ์•ผ ์‰ฝ๋„ค ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ. ์—ญ์‹œ๋‚˜ ์ฝ”๋”œ๋ฆฌํ‹ฐ๋Š” ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ทธ๋ƒฅ ์ฃผ์ง€ ์•Š์•˜๋‹ค.

 

1์ฐจ์‹œ๋„ (์‹œ๊ฐ„ ์ดˆ๊ณผ)

def solution(A, B, K):
    cnt=0
    for i in range(A,B+1):
        if(i%K==0):
            cnt+=1
    return cnt

์‚ฌ์‹ค ๋งˆ์Œ์œผ๋กœ ์ด๋ ‡๊ฒŒ ์ ˆ๋Œ€ ํ†ต๊ณผ ๋ชปํ•  ๊ฑฐ ์•Œ๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์ผ๋‹จ ํ•ด๋ณธ๊ฑฐ์˜€๋‹ค.ใ…Žใ…Ž

์›ํ•˜๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N) ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” O(N^2) ๊ณ ์น˜์ž!!!!

์—ฌ๊ธฐ์„œ O(B-A)๋Š” arr[a:b] ์™€๊ฐ™์ด 

0 < a,b < n ์ด๋ผ๋Š” ๊ฐ€์ •์—ํ•˜์— ํ‘œ๊ธฐํ•œ ๊ฒƒ์ด๊ณ  O(N)์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

2์ฐจ ์‹œ๋„(ํ‹€๋ฆฐ ๋‹ต)

def solution(A, B, K):
    if A<=K:
        A=K
    namA =A%K
    namB =B%K
    ans=B-A+1-namA-namB
    ans= ans//K
    return ans+1

๊ทธ๋‹ค๋ฆ„์œผ๋กœ ์ƒ๊ฐํ•ด๋ณธ๊ฑด ์ˆ˜ํ•™์ ์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉฐ ๋งŒ๋“  ๊ณต์‹

1) A๊ฐ€ K๋ณด๋‹ค ์ž‘์œผ๋ฉด ์˜๋ฏธ ์—†์œผ๋ฏ€๋กœ A๋ฅผ K๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ 

2) ๊ฐ๊ฐ์˜ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•œ๋‹ค์Œ

3) ๊ทธ ์‚ฌ์ด์— ์žˆ๋Š” ๊ฐœ์ˆ˜์ค‘์—์„œ ๋‚˜๋จธ์ง€๋งŒํผ์„ ๋นผ๊ณ  ๋‚˜๋ˆ„๋ฉด ๋‹ต!

 

์ž˜๋ชป์ƒ๊ฐํ–ˆ๋‹ค~~ ๋‚˜๋จธ์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ๋ชซ์ด ๋ช‡๊ฐœ์”ฉ ๋“ค์–ด์žˆ๋Š”์ง€ ๊ฐœ์‚ฐํ•ด์„œ ๋นผ๋ฉด ๋˜๋Š” ๊ฑฐ์˜€๋‹ค..

 

๋‹ค๋ฅธํ’€์ด

def solution(A, B, K):

    mocA = A//K
    namA =A%K
    mocB = B//K
    cnt = mocB-mocA

    if namA==0:
        cnt+=1
        
    return cnt

 ์ˆ˜ํ•™์ ์ธ ๊ณ„์‚ฐ์ด ํ•„์š”ํ–‡๋˜ ๋ฌธ์ œ!

 


๐Ÿ“Œ 5-2) GenomicRangeQuery

๋ฐฐ์—ด ๋‘๊ฐ€์ง€๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ์œ ์ „์ ์ตœ์†Œ๊ฐ’(?)์„ ํ’€์–ด๋ณด๊ธฐ

 

์ฒ˜์Œ ํ’€์ด

def solution(S, P, Q):
    dObj = {'A':1,'C':2,'G':3,'T':4}
    ansArr =[]

    for i,j in zip(P,Q):
        if i==j:
            ansArr.append(dObj[S[i]])
        else:
            tempArr=[]
            for k in S[i:j]:
                tempArr.append(dObj[k])
            ansArr.append(min(tempArr))
    return(ansArr)

1) P,Q ๋ฅผ๋™์‹œ์— ๋Œ๋ฉด์„œ ๋‘๊ฐ€์ง€๊ฐ’์„ ๋นผ์„œ

2) S ์—์„œ์Šฌ๋ผ์ด์‹ฑ์„ํ•œ๋‹ค.

3) ๊ทธ ์Šฌ๋ผ์ด์‹ฑ ์•ˆ์—์„œ ๋Œ๋ฉด์„œ dObj์™€ ๋น„๊ตํ•ด ์ตœ์†Œ๊ฐ’์„ ์ฐพ๋Š”๋‹ค

4)  ์ตœ์†Œ๊ฐ’ ๋ฐฐ์—ด return 

 

 

์ด ๋กœ์ง์˜ ์ž˜๋ชป๋œ ์ ์€ ๋‘๊ฐ€์ง€์ด๋‹ค.

1.slice๋ฅผ i ~j+1 ๊นŒ์ง€ ํ•ด์•ผํ•œ๋‹ค

2. ์‹œ๊ฐ„ ๋ณต์žก๋„ ์‹คํŒจ 

์ œํ•œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(nm)์ด์—ˆ๋Š”๋ฐ ์ด์ค‘ for๋ฌธ์„ ๋งŒ๋“ค์–ด O(n^2)์ด ๋˜์—ˆ๋‹ค.

 

 

๊ฐœ์„  ํ’€์ด

def solution(S, P, Q):
    dObj = {'A':1,'C':2,'G':3,'T':4}
    ans =[]

    for i,j in zip(P,Q):
        minNum=5
        if i==j:
            ans.append(dObj[S[i]])
        else:
            if 'A' in S[i:j+1]:
                num = 1
            elif 'C' in S[i:j+1]:
                num = 2
            elif 'G' in S[i:j+1]:
                num = 3
            elif 'T' in S[i:j+1]:
                num = 4
            
            if minNum > num:
                minNum = num
            ans.append(minNum)

    return(ans)

for๋ฌธ์„ ํ•˜๋‚˜ ์ œ๊ฑฐํ•˜๊ณ  ์Šฌ๋ผ์ด์‹ฑ์„ ๊ณ ์ณ์ฃผ์—ˆ๋”๋‹ˆ ๋‹ต ๋“ฑ์žฅ!!!

์‹œ๊ฐ„์˜ ํšจ์œจ์„ฑ์„ ์ƒ๊ฐํ•ด์•ผ ๊ฒ ๋‹ค๋Š” ๊ตํ›ˆ์„ ์–ป์—ˆ๋‹ค.

๋Œ“๊ธ€