πŸ’»μ½”λ”©ν…ŒμŠ€νŠΈ λ¬Έμ œν’€μ΄20

μ§€λ―Όμ„œΒ·2023λ…„ 3μ›” 16일
0

coding test

λͺ©λ‘ 보기
19/30

Chapter11. 자주 λ“±μž₯ν•˜λŠ” 자료 ꡬ쑰

[문제49] 보석 μ‡Όν•‘ - Level3

개발자 μΆœμ‹ μœΌλ‘œ 세계 졜고의 κ°‘λΆ€κ°€ 된 μ–΄ν”ΌμΉ˜λŠ” 슀트레슀λ₯Ό 받을 λ•Œλ©΄ 이λ₯Ό ν’€κΈ° μœ„ν•΄ μ˜€ν”„λΌμΈ 맀μž₯에 쇼핑을 ν•˜λŸ¬ κ°€κ³€ ν•©λ‹ˆλ‹€.

μ–΄ν”ΌμΉ˜λŠ” 쇼핑을 ν•  λ•Œλ©΄ 맀μž₯ μ§„μ—΄λŒ€μ˜ νŠΉμ • λ²”μœ„μ˜ 물건듀을 λͺ¨λ‘ 싹쓸이 κ΅¬λ§€ν•˜λŠ” μŠ΅κ΄€μ΄ μžˆμŠ΅λ‹ˆλ‹€.

μ–΄λŠ λ‚  슀트레슀λ₯Ό ν’€κΈ° μœ„ν•΄ 보석 맀μž₯에 쇼핑을 ν•˜λŸ¬ κ°„ μ–΄ν”ΌμΉ˜λŠ” μ΄μ „μ²˜λŸΌ μ§„μ—΄λŒ€μ˜ νŠΉμ • λ²”μœ„μ˜ 보석을 λͺ¨λ‘ κ΅¬λ§€ν•˜λ˜ νŠΉλ³„νžˆ μ•„λž˜ λͺ©μ μ„ λ‹¬μ„±ν•˜κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€.

  • 'μ§„μ—΄λœ λͺ¨λ“  μ’…λ₯˜μ˜ 보석을 적어도 1개 이상 ν¬ν•¨ν•˜λŠ” κ°€μž₯ 짧은 ꡬ간을 μ°Ύμ•„μ„œ ꡬ맀'

예λ₯Ό λ“€μ–΄ μ•„λž˜ μ§„μ—΄λŒ€λŠ” 4μ’…λ₯˜μ˜ 보석(RUBY, DIA, EMERALD, SAPPHIRE) 8κ°œκ°€ μ§„μ—΄λœ μ˜ˆμ‹œμž…λ‹ˆλ‹€.

μ§„μ—΄λŒ€ 번호12345678
보석 이름DIARUBYRUBYDIADIAEMERALDSAPPHIREDIA

μ§„μ—΄λŒ€μ˜ 3λ²ˆλΆ€ν„° 7λ²ˆκΉŒμ§€ 5개의 보석을 κ΅¬λ§€ν•˜λ©΄ λͺ¨λ“  μ’…λ₯˜μ˜ 보석을 적어도 ν•˜λ‚˜ 이상씩 ν¬ν•¨ν•˜κ²Œ λ©λ‹ˆλ‹€.

μ§„μ—΄λŒ€μ˜ 3, 4, 6, 7번의 λ³΄μ„λ§Œ κ΅¬λ§€ν•˜λŠ” 것은 쀑간에 νŠΉμ • ꡬ간(5번)이 λΉ μ§€κ²Œ λ˜λ―€λ‘œ μ–΄ν”ΌμΉ˜μ˜ μ‡Όν•‘ μŠ΅κ΄€μ— λ§žμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ§„μ—΄λŒ€ 번호 μˆœμ„œλŒ€λ‘œ λ³΄μ„λ“€μ˜ 이름이 μ €μž₯된 λ°°μ—΄ gemsκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. μ΄λ•Œ λͺ¨λ“  보석을 ν•˜λ‚˜ 이상 ν¬ν•¨ν•˜λŠ” κ°€μž₯ 짧은 ꡬ간을 μ°Ύμ•„μ„œ returnν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

κ°€μž₯ 짧은 κ΅¬κ°„μ˜ μ‹œμž‘ μ§„μ—΄λŒ€ λ²ˆν˜Έμ™€ 끝 μ§„μ—΄λŒ€ 번호λ₯Ό μ°¨λ‘€λŒ€λ‘œ 배열에 λ‹΄μ•„μ„œ return ν•˜λ„λ‘ ν•˜λ©°, λ§Œμ•½ κ°€μž₯ 짧은 ꡬ간이 μ—¬λŸ¬ 개라면 μ‹œμž‘ μ§„μ—΄λŒ€ λ²ˆν˜Έκ°€ κ°€μž₯ μž‘μ€ ꡬ간을 returnν•©λ‹ˆλ‹€.

[μ œν•œμ‚¬ν•­]

  • gems λ°°μ—΄μ˜ ν¬κΈ°λŠ” 1 이상 100,000 μ΄ν•˜μž…λ‹ˆλ‹€.
    • gems λ°°μ—΄μ˜ 각 μ›μ†ŒλŠ” μ§„μ—΄λŒ€μ— λ‚˜μ—΄λœ 보석을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • gems λ°°μ—΄μ—λŠ” 1번 μ§„μ—΄λŒ€λΆ€ν„° μ§„μ—΄λŒ€ 번호 μˆœμ„œλŒ€λ‘œ 보석 이름이 μ°¨λ‘€λŒ€λ‘œ μ €μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
    • gems λ°°μ—΄μ˜ 각 μ›μ†ŒλŠ” 길이가 1 이상 10 μ΄ν•˜μΈ μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ‘œλ§Œ κ΅¬μ„±λœ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.

[μ½”λ“œμž‘μ„±]

1. λ³΄μ„μ˜ μ’…λ₯˜μ™€ ν˜„μž¬ 가지고 μžˆλŠ” 보석을 μ •μ˜

def solution(gems):
	kind = len(set(gems))
    size = len(gems)
    answer = [0, size - 1]
    
    dic = {gems[0]:1}
    start = end = 0

2. μ‹œμž‘ 포인터뢀터 끝 ν¬μΈν„°κΉŒμ§€ μ „λΆ€ κ΅¬λ§€ν•œλ‹€κ³  ν–ˆμ„ λ•Œ λͺ¨λ“  μ’…λ₯˜μ˜ 보석을 μ‚΄ 수 μžˆλŠ”μ§€ 확인

while end < size:
	if len(dic) < kind:
    	end += 1
        if end == size: break
        dic[gems[end]] = dic.get(gems[end], 0) + 1
    else:
    	if (end - start + 1) < (answer[1] - answer[0] + 1): answer = [start, end]
        if dic[gems[start]] == 1: del dic[gems[start]]
        else: dic[gems[start]] -= 1
        start += 1

3. ꡬ간을 λ³΄μ •ν•˜κ³  정닡을 λ°˜ν™˜

answer[0] += 1
answer[1] += 1

return answer

[μ „μ²΄μ½”λ“œ]

def solution(gems):
	kind = len(set(gems))
    size = len(gems)
    answer = [0, size - 1]
    
    dic = {gems[0]:1}
    start = end = 0
    
    while end < size:
        if len(dic) < kind:
            end += 1
            if end == size: break
            dic[gems[end]] = dic.get(gems[end], 0) + 1
        else:
            if (end - start + 1) < (answer[1] - answer[0] + 1): answer = [start, end]
            if dic[gems[start]] == 1: del dic[gems[start]]
            else: dic[gems[start]] -= 1
            start += 1
            
    answer[0] += 1
    answer[1] += 1

    return answer
profile
πŸ’» + πŸŽ₯

0개의 λŒ“κΈ€