2월 1주차 코딩 테스트


목차

  1. 이중 점수 돌 게임
  2. 통 속의 공
  3. 강력한 패스워드
  4. k자리 제거하기
  5. 선을 넘나드는 사각형

1. 이중 점수 돌 게임

풀이

이 문제는 두 돌의 가치의 합이 가장 큰 순으로 정렬하고 차례대로 뽑으면 된다.

그 이유는 자신의 돌의 가치가 낮더라도 상대의 돌의 가치가 높다는 뜻이되어 상대가 높은돌의 가치를 뽑지 못하게 한다.

따라서 최적의 답안이라 볼 수 있다.

전체 코드는 아래와 같다.

def solution(value):
    player1_score = 0
    player2_score = 0
    
    value.sort(key=lambda x: -(x[0] + x[1]))

    for i in range(len(value)):
        if i % 2 == 0:
            player1_score += value[i][0]
        else:
            player2_score += value[i][1]

    if player1_score > player2_score:
        return 1
    elif player1_score < player2_score:
        return -1
    else:
        return 0 

테스트 케이스

입력값 〉 [[5, 3], [6, 9], [4, 5], [6, 3], [2, 8], [5, 4]]
기댓값 〉 1

2. 통 속의 공

풀이

""" 
 * 이분탐색 문제입니다.
 * buckets가 정렬되지 않은 상태일 수 있는 점에 유의하세요!
"""

def solution(buckets, m):
    left = 0
    right = max(buckets)
    
    buckets.sort()
    
    answer = 0 
    while left <= right:
        mid = (left + right) // 2
        
        n = 1
        last = 0
        for i in range(1, len(buckets)):
            if buckets[i] - buckets[last] >= mid:
                last = i
                n += 1
            
            if n >= m:
                break
        
        if n >= m:
            answer = max(answer, mid)
            left = mid + 1
        else:
            right = mid - 1
    
    return answer

테스트 케이스

# 테스트 1
입력값 〉 [1, 2, 3, 4, 7], 3
기댓값 〉 3

# 테스트 2
입력값 〉 [1, 2, 4, 9, 99999], 2
기댓값 〉 99998

3. 강력한 패스워드

풀이

from string import ascii_lowercase, ascii_uppercase


SPECIAL = '!@#$%^&*()'

def solution(s):
    if len(s) < 6 or len(s) > 20:
        return False
    
    lower = 0
    upper = 0
    digit = 0
    special = 0
    for c in s:
        if c in ascii_lowercase:
            lower += 1
        elif c in ascii_uppercase:
            upper += 1
        elif '0' <= c <= '9':
            digit += 1
        elif c in SPECIAL:
            special += 1
        
        if lower and upper and digit and special:
            break
    else:
        return False
    
    repeat = 0
    ascend = 0
    descend = 0
    
    for c1, c2 in zip(s.lower(), s[1:].lower()):
        if c1 == c2:
            repeat += 1
            ascend = 0
            descend = 0
        elif ord(c2) - ord(c1) == 1:
            ascend += 1
            descend = 0
            repeat = 0
        elif ord(c2) - ord(c1) == -1:
            descend += 1
            ascend = 0
            repeat = 0
        else:
            ascend = 0
            descend = 0
            repeat = 0

        if ascend == 2 or repeat == 2 or descend == 2:
            return False
    
    return True

# s = "zErOBase)12#Few545"
# print(solution(s))

테스트 케이스

# 테스트 1
입력값 〉 "zeRobAsE!2#4"
기댓값 〉 true

# 테스트 2
입력값 〉 "Pas$W0rd!234"
기댓값 〉 false

4. k자리 제거하기

풀이

def solution(s, k):
    if k >= len(s):
        return "0"

    if k == 0:
        return s.lstrip('0')
    
    if s[1] == '0':
        return solution(s[1:].lstrip('0'), k-1)
    else:
        ind = 0
        for i in range(1, len(s)):
            if s[i-1] < s[i]:
                ind = i
            elif s[i-1] != s[i]:
                break
        return solution(s[:ind] + s[ind+1:], k-1)

테스트 케이스

# 테스트 1
입력값 〉 "105990", 1
기댓값 〉 "5990"

# 테스트 2
입력값 〉 "1122911", 1
기댓값 〉 "112211"

5. 선을 넘나드는 사각형

풀이

from math import gcd

def solution(N, M):
    return N + M - gcd(N, M)

테스트 케이스

# 테스트 1
입력값 〉 4, 9
기댓값 〉 12

# 테스트 2
입력값 〉 5, 15
기댓값 〉 15

출처

해당 문제와 코드는 제로베이스(ZeroBase)에서 제공받았습니다.

모든 자료는 저작권법에 의하여 보호받는 저작물로서 이에 대한 무단 복제 및 배포를 원칙적으로 금합니다.