πŸ”‘ μ•Œκ³ λ¦¬μ¦˜

[codility] Lv2- OddOccurrencesInArray,Lv3-TapeEquilibrium ,TapeEquilibrium

Tamii 2021. 6. 21. 01:41
λ°˜μ‘ν˜•

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ λ¬Έμ œμ—λ§Œ μ˜μ‘΄ν•˜λ˜ν„°λΌ, coldility λΌλŠ” μƒˆλ‘œμš΄ μ½”λ“œν’€μ΄ ν”Œλž«νΌμ„ μ•Œκ²Œ λ˜μ—ˆκ³ ,

문제λ₯Ό μ—΄μ‹¬νžˆ ν’€μ–΄λ³΄κΈ°λ‘œ κ²°μ‹¬ν–ˆλ‹€.

문제λ₯Ό ν’€μ΄ν•˜λ©΄μ„œ 처음으둜 λ†€λž€ 것은 μ½”λ“œμ˜ νš¨μœ¨μ„±μ„ 신경써야 ν•˜λŠ” 것

κ·Έλ™μ•ˆμ€ κ·Έλ ‡κ²Œ νš¨μœ¨μ„±μ— λŒ€ν•΄μ„œ 깊게 생각해보지 λͺ»ν–ˆμ§€λ§Œ, 

νš¨μœ¨μ„±μ΄ μ’‹μ§€μ•Šκ±°λ‚˜ μ§€λ‚˜μΉœ 반볡문이 κ³„μ†λ˜λŠ” μ½”λ“œλŠ”.... scoreμ—μ„œ 깎이게 λœλ‹€...

 

문제λ₯Ό ν’€λ©° 배운 점

1. μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ•Όν•œλ‹€. 

2. μž…λ ₯κ°’μ˜ λ²”μœ„ 크기λ₯Ό μ•Œμ•„μ•Ό ν•œλ‹€.

3. μ‹œμž‘λ³΅μž‘λ„μ— λŒ€ν•œ 고민을 ν•˜μž (https://rrecoder.tistory.com/63)

 


πŸ“Œ   2- OddOccurrencesInArray

λ°°μ—΄μ—μ„œ μžμ‹ κ³Ό μ€‘λ³΅ν•œ κ°’μ˜ κ°œμˆ˜κ°€ ν™€μˆ˜μΈ 값을 return ν•˜λŠ” 문제

첫 풀이

def solution(A):

    cntDic={}

    for i in A:
        if i not in cntDic:
            cnt=0
            for j in A:
                if j==i:
                    cnt+=1
            cntDic[i]=cnt
    for num,cnt in cntDic.items():
        if cnt%2==1:
            return num

1) cnt λ”•μ…”λ„ˆλ¦¬ 생성

2) λ”•μ…”λ„ˆλ¦¬μ— μžˆμ§€ μ•ŠμœΌλ©΄ ν•΄λ‹Ή 값을 for문을 돌며 μ°Ύμ•„μ„œ λ”ν•΄μ€Œ

3) κ·Έ λ”•μ…”λ„ˆλ¦¬λ₯Ό λ‹€μ‹œ 돌며 κ°œμˆ˜κ°€ ν™€μˆ˜μΈ 값을 λ”ν•΄μ€Œ

 

κ²°κ³ΌλŠ” μ²˜μ°Έν–ˆλ‹€. 

일단 bigNumberλ₯Ό μ „ν˜€ μ‹ κ²½μ“°μ§€ μ•Šμ•˜λ˜ 터이기에 μ„±λŠ₯ν…ŒμŠ€νŠΈμ—μ„œ μ „λΆ€ 빡점!

일단 Detected time complexity:O(N**2)  ㄹ즉 μ‹œκ°„λ³΅μž‘λ„ ν•œκ³„κ°€ O(N**2)인데

 

forλ¬Έ μ•ˆμ—μ„œ if 문을 톡해 배열을 νƒμƒ‰ν•˜λŠ” 것 N^2 

근데 λ‚˜λŠ” for λ¬Έ μ•ˆμ—μ„œ if λ¬Έ μ•ˆμ—μ„œ for λ¬Έ ? 

 

λ‹€λ₯Έ 풀이

def solution(A):
    if len(A) ==1:
        return A[0]
    A = sorted(A)

    for i in range(0,len(A),2):
        if i+1 == len(A):
            return A[i]
        if A[i]!=A[i+1]:
            return A[i]

μ‹œκ°„λ³΅μž‘λ„ : O(N) or O(N*logN)

sorted의 μ‹œκ°„λ³΅μž‘λ„ : O(N*logN)

μ •λ ¬λœ 배열을 따라 λ‘κ°œμ”© for 문을 돌며 λ’€μ˜ κ°’κ³Ό λ‹€λ₯΄λ©΄ !

 

μ°Έκ³  :https://wayhome25.github.io/algorithm/2017/04/30/OddOccurrencesInArray/


πŸ“Œ  STEP 3-1 ) FrogJump 

λ‚΄ 풀이 (100%)

def solution(X, Y, D):
    Y-=X

    if Y%D ==0:
        return Y//D
    else:
        return Y//D+1

κ°œκ΅¬λ¦¬κ°€ λͺ©ν‘œ μ§€μ κΉŒμ§€ κ°€λŠ” μ΅œμ†Œ 횟수λ₯Ό κ΅¬ν•˜λŠ” 문제인데 , 

생각을 쑰금 ν•΄λ³΄λ‹ˆ μ‰½κ²Œ ν’€ 수 μžˆμ—ˆλ‹€..

 


πŸ“Œ  STEP 3-2 ) PermMissingElem

λ‚΄ 풀이(50%)

def solution(A):
    if len(A)==1:
        return A[0]
    A=sorted(A)
    
    for idx in range(1,len(A)+1):

        if A[idx]-1 != A[idx-1]:
            return A[idx]-1

1) Aλ₯Ό μ •λ ¬ν•œ ν›„

2) Aλ₯Ό 돌며 ν˜„μž¬ κ°’+1 κ³Ό λ‹€μŒκ°’μ΄ κ°™μ§€ μ•ŠμœΌλ©΄

3) ν˜„μž¬κ°’+1μ΄μ—†λŠ”κ²ƒμ΄λ‹ˆ return 

ν•˜λŠ” λ°©λ²•μœΌλ‘œ ν’€μ΄ν–ˆλŠ”λ°  μ˜€λ‹΅μ΄ λ˜μ—ˆλ‹€.

λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ‚˜μ˜€λŠ”κ±Έ λ³΄λ‹ˆ μ—„μ²­λ‚˜κ²Œ λ§Žμ€ λ²”μœ„μ˜ 수λ₯Ό κ°€μ§€κ³  μž‡λŠ” 배열을 μ •λ ¬ν•˜κΈ° λ•Œλ¬Έμ— λΆˆκ°€λŠ₯ν•œ 것 κ°™λ‹€.

고둜 정렬은 ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€!

 

 

λ‹€λ₯Έ 풀이

def solution(A):
	idxArr= [0]* (len(A)+1)
    
    for i in A:
    	idxArr[i-1]=1
    
    return idxArr.index(0)+1

1) A의 인덱슀 배열을 생성

2) Aλ₯Ό 돌며 A의 값을 인덱슀둜 μ‚¬μš©

 

idxArr = [1,1,1,0,1] 이 값이 λ˜λ©΄μ„œ μ±„μ›Œμ§€μ§€ μ•Šμ€ λΆ€λΆ„μ˜ idx+1 값이 닡이 λœλ‹€.

 

 

λ‹€λ₯Έν’€μ΄

def solution(A):
	return sum(range(len(A)+2)) - sum(A)

[1,2,3,5]   15-11 = 4 κ°€ λ‚˜μ˜€λŠ”λ°

[0,1,2,3,4,5] - [1,2,3,5] 라고 λ³Ό 수 μžˆλ‹€.

 

 


πŸ“Œ  STEP 3-3 ) TapeEquilibrium

λ‚΄ 풀이1 ( 53% )

def solution(A):
    sumArr=[]
    length=len(A)
    for i in range(1,len(A)):
        sumArr.append(abs(sum(A[:i])-sum(A[i:length])))

    return min(sumArr)

1) λ°˜λ³΅λ¬Έμ„ 돌며 ν•΄λ‹Ή 숫자의 λ²”μœ„κΉŒμ§€ slicingν•œ λ°°μ—΄μ˜ ν•©κ³Ό μ°¨λ₯Ό κ΅¬ν•œλ‹€

2) κ·Έ 값을 sumArr에 λ„£κ³  μ΅œμ’…κ°’ κ΅¬ν•˜κΈ°

 

μ•„λ§ˆ min값을 κ΅¬ν•˜λŠ” λΆ€λΆ„μ—μ„œ λ§Žμ€ μ‹œκ°„μ„ μ†Œμš”ν•œκ²ƒμœΌλ‘œ μ˜ˆμƒν•œλ‹€.

μ‹œκ°„λ³΅μž‘λ„ ν•œκ³„λŠ” = O(N * N)

μ—­μ‹œ λͺ¨λ“ λ‚  λͺ¨λ“  μˆœκ°„ λŠλ Έλ‹€..

 

λ‹€λ₯Έ 풀이

def solution(A):
    firstSum=0
    lastSum=sum(A)
    minSum=None
    for i in range(1,len(A)):
        firstSum +=A[i-1]
        lastSum-=A[i-1]
        diff = abs(firstSum-lastSum)
        if minSum==None:
            minSum = diff
        else:
            minSum = min(minSum,diff)
    return minSum

λ‚˜μ™€ λ‹€λ₯Έ 점 (즉 μ–΄λ””μ—μ„œ μ‹œκ°„μ„ κ°μ†Œμ‹œμΌ°λ‚˜.)

1) Sum은 ν•œλ²ˆλ§Œ ν•œλ‹€ 

κ·Έ ν›„ λ°˜λ³΅λ¬Έμ„ 돌며 μœ„μΉ˜μ— λ”°λ₯Έ 값을 λ”ν•˜κ³  λΉΌμ€€λ‹€

2) min은 ν•„μš”μ— μ˜ν•΄ ν•˜μ§€λ§Œ λ§Žμ€ 값듀을 ν•œλ²ˆμ— 넣은 ν›„ ν•˜μ§€ μ•Šκ³  κ·Έλ•Œκ·Έλ•Œ μž‘μ€ λ²”μœ„λ‘œ ν•œλ‹€.