Today I Learned

[til] 220318 - css animations, ์ด์ฝ”ํ…Œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

yuull 2022. 3. 19. 01:58

๐Ÿ’ป ์˜ค๋Š˜ ํ•œ ์ผ ๐Ÿ’ป

โ˜‘๏ธ ์ฝ”์ฝ”์•„ํ†ก ํด๋ก ์ฝ”๋”ฉ - more animations ~ no mobile media query (ํด๋ก  ๋)

โ˜‘๏ธ BOJ - #7576 ํ† ๋งˆํ† 

โ˜‘๏ธ ์ด์ฝ”ํ…Œ - ์ •๋ ฌ ๊ฐ•์˜ + ์˜ˆ์ œ

 

์ฝ”์ฝ”์•„ํ†ก ํด๋ก ์ฝ”๋”ฉ - animations:

๋”๋ณด๊ธฐ
@keyframes heartBeat {
    0%{
        color: white;
    }
    50%{
        color: tomato;
        transform: scale(1.3);
    }
    100%{
        color: white;
    }
}
.open-post__heart-count:hover i {
    will-change: transform;
    animation: heartBeat 1s linear infinite;
}

* will-change: transform โžก๏ธ ์ „์—๋Š” transform animation์ด ํ”๋“ค๋ฆฌ๋ฉด์„œ ๋ถˆ์•ˆ์ •ํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ๋Š”๋ฐ, ์ด ์ฝ”๋“œ๋กœ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ animation์ด ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์•Œ๋ ค์ค˜์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด accelerates the animation. ์•„๋ฌดํŠผ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ์ฝ”๋“œ. โžก๏ธ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ํ”๋“ค๋ฆฌ๊ฑฐ๋‚˜ ๊ทธ๋Ÿด ๋•Œ ์ž‘์„ฑํ•ด์ฃผ๊ธฐ.

โœ”๏ธ ๋ฌธ๋ฒ•

.reply:focus-within .reply__column:first-child {
    display: none;
}

* reply ํด๋ž˜์Šค์— focus-within ๋  ๋•Œ reply__column:first-child ์— ์ ์šฉ.

 

โœ”๏ธ fade ๋˜๊ฒŒ ํ•˜๋Š” ๋ฒ• (+ transition)

.reply .reply__column:first-child,
.reply .fa-smile-wink,
.reply button {
    transition: opacity .3s ease-in-out;  /* transition ์ด ์žˆ์–ด์•ผ ํ•œ ์ˆœ๊ฐ„์— ์•ˆ ์‚ฌ๋ผ์ง */
}

.reply:focus-within .reply__column:first-child,
.reply:focus-within .fa-smile-wink,
.reply:focus-within button {
    opacity: 0;
}

* ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ๊ฑด opacity๋“  ๋ญ๋“  ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์ ์šฉํ•  ์†์„ฑ์„ transition๊ณผ ํ•จ๊ป˜ ์ ์šฉํ•˜๋ ค๋ฉด ์›๋ž˜ element์˜ css ํŒŒํŠธ์—๋‹ค๊ฐ€ transition์„ ์„ค์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ์ .

transition: [transition ์ ์šฉํ•  ์†์„ฑ] [์ดˆ] [ํšจ๊ณผ]  ์ด๋Ÿฐ์‹. [transition ์ ์šฉํ•  ์†์„ฑ] ์ด ๋งŒ์•ฝ ์ „์ฒด ์†์„ฑ์„ ๋„ฃ์„ ๊ฑฐ๋ฉด ๊ทธ๋ƒฅ 'all' ํ•ด์ฃผ๋ฉด ๋จ.

 

โœ”๏ธ mobile media query ๋ชจ๋ฐ”์ผ ํ™”๋ฉด ์‚ฌ์ด์ฆˆ๋งŒ ์ œ๊ณตํ•˜๋„๋ก ํ•˜๋Š” ๋ฒ•

<div id="no-mobile">
        <span>Your screen is too big!!</span>
    </div>

์œ„ ์ฝ”๋“œ๋ฅผ ๋ชจ๋“  html ์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

no-mobile ์ „์šฉ css ๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ  (components file ์— ์ถ”๊ฐ€)

#no-mobile {
    position: absolute; /* goes on top of everything */
    z-index: 99; /* ์ˆซ์ž ๋†’๊ฒŒ ์„ค์ •ํ•ด์„œ ์–ด๋–ค ํ™”๋ฉด๋ณด๋‹ค ๋” ์œ„์— ์žˆ๋„๋ก */
    height: 100vh;
    background-color: orange;
    width: 100vw;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 32px;
    top:0;
}

@media screen and (max-width:645px) {
    #no-mobile {
        display: none;
    }
}

์—ฌ๊ธฐ์„œ ํฌ์ธํŠธ๋Š” position: absolute ๋ž‘ z-index:99 (์„ค๋ช…์€ ์ฃผ์„์—)
#no-mobile div๋ฅผ ์ƒ์„ฑํ•ด ํ™”๋ฉด์ด ๋„ˆ๋ฌด ํฌ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ปค๋‹ค๋ž€ div๋ฅผ ๋งŒ๋“ฆ. (๊ฐ€์žฅ ์œ„์— ์˜ค๋„๋ก)

์‚ฌ์šฉ์ž๊ฐ€ ํ™”๋ฉด์„ 645px ๋„˜์–ด์„œ ๋„“ํžˆ๋ฉด display: none; ์ด ์ ์šฉ๋˜๊ณ , ๊ทธ ์ดํ•˜์ผ ๋•Œ๋Š” display:flex; ์ ์šฉ.

 

 

 

๐Ÿ“ ์ •๋ ฌ 4๊ฐ€์ง€ ์ •๋ฆฌ:

๋”๋ณด๊ธฐ

โœ”๏ธ ์„ ํƒ ์ •๋ ฌ (1/4) : <๋ฏธ์ฒ˜๋ฆฌ ๋ฐ์ดํ„ฐ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ์•ž์˜ ๋ฐ์ดํ„ฐ์™€ ์ž๋ฆฌ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ณผ์ •> ์„ ๋ฐ˜๋ณต

- ํƒ์ƒ‰ ๋ฒ”์œ„๋Š” ๋งค๋ฒˆ ์ค„์–ด๋“ฆ.

- ๋งค๋ฒˆ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•จ. -> ์ด์ค‘ for ๋ฌธ

array = [7, 5, 8, 6]

for i in range(len(array)):
	min_index = i
    for j in range(i+1, len(array)):
    	if array[min_index] > array[j]:
        	min_index = j

์ด์ œ j ์— ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์˜ ์›์†Œ ์ธ๋ฑ์Šค๊ฐ€ ์ €์žฅ๋จ.

๊ทธ ํ›„ ์•„๋ž˜์ฒ˜๋Ÿผ ์Šค์™‘์„ ํ†ตํ•ด <๋ฏธ์ฒ˜๋ฆฌ ๋ฐ์ดํ„ฐ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ> ์™€ <๊ฐ€์žฅ ์•ž์˜ ์›์†Œ> ์˜ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”์คŒ.

array[i], array[min_index] = array[min_index], array[i]
# ํŒŒ์ด์ฌ์€ ํ•œ ์ค„๋กœ swap ๊ฐ€๋Šฅ

์‹œ๊ฐ„๋ณต์žก๋„: O(N^2)

 

โœ”๏ธ ์‚ฝ์ž… ์ •๋ ฌ (2/4) : ๋ฏธ์ฒ˜๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ๊ณจ๋ผ ์ ์ ˆํ•œ ์œ„์น˜์— ์‚ฝ์ž…

(์™ผ์ชฝ ๋ฐ์ดํ„ฐ๋“ค๊ณผ ๋น„๊ตํ•ด์„œ ์ ์ ˆํ•œ ์œ„์น˜๋กœ ์ด๋™์‹œํ‚จ๋‹ค)

array = [7, 5, 8, 6]

for i in range(1, len(array)):
    for j in range(i, 0, -1):  # ์ธ๋ฑ์Šค ๊ฑฐ๊พธ๋กœ ( ์™ผ์ชฝ ๋ฐ์ดํ„ฐ๋“ค๊ณผ ๋น„๊ต )
    	if array[j] < array[j-1]:
        	array[j], array[j-1] = array[j-1], array[j]  # ์ž๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ ๋งŒ๋‚˜๋ฉด ๋ฉˆ์ถ”๊ณ  ๊ทธ ์œ„์น˜๋กœ
        else:
        	break

์‹œ๊ฐ„๋ณต์žก๋„: O(N^2)
ํ˜„์žฌ ๋ฆฌ์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฑฐ์˜ ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ๋ผ๋ฉด ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋™์ž‘. ์ตœ์„ ์˜ ๊ฒฝ์šฐ O(N) (์ด๋ฏธ ๋‹ค ์ •๋ ฌ๋œ ๊ฒฝ์šฐ)

 

โœ”๏ธ ํ€ต ์ •๋ ฌ (3/4) : ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ (Pivot) ๋ฅผ ์„ค์ •, <(์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ) ๊ธฐ์ค€๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ>์™€ <(์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ) ๊ธฐ์ค€๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ>์˜ ์œ„์น˜ ๋ฐ”๊ฟ” ๋ถ„ํ•  ์ž‘์—… ํ›„ ๋‹ค์‹œ ๊ฐ๊ฐ์˜ ๋ถ„ํ• ๋œ ๋ถ€๋ถ„์—์„œ ๋‹ค์‹œ ๋ถ„ํ•  ์ž‘์—… ๋ฐ˜๋ณต. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ. ๋น ๋ฅธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜.

- ํ•˜๋‹ค๋ณด๋ฉด ์œ„์น˜๊ฐ€ ์—‡๊ฐˆ๋ฆฌ๋Š” ๊ฒฝ์šฐ (ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ๊ฒŒ ์˜ค๋ฅธ์ชฝ์— ์žˆ๊ณ  ์ž‘์€๊ฒŒ ์™ผ์ชฝ์— ์žˆ์„ ๋•Œ) ๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ ์ด ๋•Œ๋Š” <ํ”ผ๋ฒ—> ๊ณผ <์ž‘์€ ๋ฐ์ดํ„ฐ>์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พผ๋‹ค.

- ํ˜ธ์–ด๋ถ„ํ• ๋ฐฉ์‹์„ ์‚ฌ์šฉ, ํ”ผ๋ฒ—์„ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋กœ ์„ค์ •.

- ์žฌ๊ท€์ :๋‹ค์‹œ ์™ผ์ชฝ ๋ฐ์ดํ„ฐ ๋ฌถ์Œ์— ๋Œ€ํ•ด ํ€ต ์ •๋ ฌ, ์˜ค๋ฅธ์ชฝ์—๋„ ๋‹ค์‹œ ํ€ต ์ •๋ ฌ.

array = [7, 5, 8, 6]

def quick_sort(array, start, end): #(๋ฐฐ์—ด, ์ฒซ๋ฒˆ์งธ ์›์†Œ ์ธ๋ฑ์Šค, ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค)
	if start >= end: # ์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ ์ข…๋ฃŒ
    	return
    pivot = start    # ํ”ผ๋ฒ—์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ
    left = start + 1 
    right = end      
    while (left <= right):   # ๋ถ„ํ•  ์ž‘์—… (์ž๋ฆฌ ๊ต์ฒด์˜ ๋ฐ˜๋ณต) (์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€)
    	while (left <= end and array[left] <= array[pivot]):     # ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ
        	left += 1
        while (right > start and array[right] >= array[pivot]):  # ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ
        	right -= 1
        if (left > right):   #์—‡๊ฐˆ๋ ธ๋‹ค๋ฉด <ํ”ผ๋ฒ—>๊ณผ <์ž‘์€ ๋ฐ์ดํ„ฐ> ์ž๋ฆฌ ๊ต์ฒด
        	array[right], array[pivot] = array[pivot], array[right]
        else:                #์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด <์ž‘์€ ๋ฐ์ดํ„ฐ>์™€ <ํฐ ๋ฐ์ดํ„ฐ> ์ž๋ฆฌ ๊ต์ฒด
        	array[left], array[right] = array[right], array[left]
    # ๋ถ„ํ•  ์ž‘์—… ์™„๋ฃŒ ํ›„ ๊ฐ ๋ถ„ํ• ์— ๋Œ€ํ•ด ๋‹ค์‹œ ๋ถ„ํ•  ์ž‘์—… ์ˆ˜ํ–‰ (์žฌ๊ท€์ ์œผ๋กœ)
    quick_sort(array, start, right-1)
    quick_sort(array, right+1, end)
        
quick_sort(array, 0, len(array)-1)

์•„๋ž˜๋Š” ๋” ์งง์€ ๋ฐฉ๋ฒ•: (๋‹จ ๋” ๋น„ํšจ์œจ์ )

def quick_sort(array):
	if len(array) <= 1:   # ์›์†Œ๊ฐ€ ํ•˜๋‚˜ ์ดํ•˜๋ฉด ์ข…๋ฃŒ
    	return array
    pivot = array[0]
    tail = array[1:]    # ํ”ผ๋ฒ—์„ ์ œ์™ธํ•œ ๋ฆฌ์ŠคํŠธ
    
    left_side = [x for x in tail if x <= pivot] # ๋ถ„ํ• ๋œ ์™ผ์ชฝ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ
    right_side = [x for x in tail if x > pivot] # ๋ถ„ํ• ๋œ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ
    
    return (quick_sort(left_side) + [pivot] + quick_sort(right_side))  # ๊ฐ๊ฐ ์ •๋ ฌ ํ›„ ๋‹ค์‹œ ํ•ฉ์นจ

์‹œ๊ฐ„๋ณต์žก๋„: O(NlogN)
์ตœ์•…์˜ ๊ฒฝ์šฐ O(N^2) (ํ”ผ๋ฒ—์ด ์ค‘๊ฐ„ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๊ทน๋‹จ์˜ ๊ฐ’์ผ ๋•Œ) 

 

โœ”๏ธ ๊ณ„์ˆ˜ ์ •๋ ฌ (4/4) : ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋˜์–ด ์ •์ˆ˜ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ

๊ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ช‡๊ฐœ ์žˆ๋Š”์ง€ ์ธ๋ฑ์Šค๋งˆ๋‹ค ๊ฐ’์„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ €์žฅ.

array = [7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5, 2] # 0, 1, 2๋Š” ๋‘ ๋ฒˆ์”ฉ, ๋‚˜๋จธ์ง€๋Š” ํ•œ ๋ฒˆ์”ฉ ์žˆ์Œ.
count = [0] * (max(array)+1)  # 0๋ถ€ํ„ฐ ๊ฐ€์žฅ ํฐ ๊ฐ’๊นŒ์ง€ ์ „์ฒด๋ฅผ ํฌํ•จํ•˜๋„๋ก ์ƒˆ๋กœ์šด ๋ฐฐ์—ด ์ƒ์„ฑ

for i in range(len(array)):
	count[array[i]] += 1  # ๋ฐฐ์—ด์˜ ์›์†Œ ๊ฐ’ = count ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค ๊ฐ’. ํ•ด๋‹น ์ธ๋ฑ์Šค์— ์›์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅ.
for i in range(len(count)):
	for j in range(count[i]):  # ์›์†Œ์˜ ๊ฐœ์ˆ˜(ํšŸ์ˆ˜), ์ฆ‰ count[i]์˜ ๊ฐ’๋งŒํผ ํ•ด๋‹น ์›์†Œ ์ถœ๋ ฅ
    	print(i, end=' ')

- ๋งŒ์•ฝ K, ์ฆ‰ ๋ฐฐ์—ด์˜ ์ตœ๋Œ€๊ฐ’์ด ๋ฐ์ดํ„ฐ ์ „์ฒด ๊ฐœ์ˆ˜์— ๋น„ํ•ด ๋„ˆ๋ฌด ํด ๋•Œ๋Š” ๋น„ํšจ์œจ์ .
- ๋™์ผ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๋•Œ๋Š” ํšจ์œจ์ .

์ถœ์ฒ˜: ์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ

์‹œ๊ฐ„๋ณต์žก๋„: ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ O(N+K)   (K: ๋ฐ์ดํ„ฐ ์ค‘ ์ตœ๋Œ“๊ฐ’, ์ฆ‰ count ๋ฐฐ์—ด์˜ ํฌ๊ธฐ)

 

โ€ป ํŒŒ์ด์ฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ .sort()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(NlogN) 

๋”ฐ๋ผ์„œ ๋ฌธ์ œ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์„ ์ œํ•œํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋ฅผ ์‚ฌ์šฉ

- ์œ ํŠญ ๊ฐ•์˜ ๋“ค์œผ๋ฉด์„œ ๋™์‹œ์— ์ •๋ฆฌํ•˜๋Š” ์‹์œผ๋กœ ํ•ด๋ดค๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋„ˆ์–ด~๋ฌด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค.

๊ทธ๋ƒฅ ๊ฐ•์˜ ํ‹€์–ด๋†“๊ณ  ์ฑ… ๋ณด๋ฉด์„œ ์ดํ•ดํ•œ ๋‹ด์— ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณด๋Š” ๊ฒŒ ๋‚˜์„ ๋“ฏ.