목차
- 이중 점수 돌 게임
- 통 속의 공
- 강력한 패스워드
- k자리 제거하기
- 선을 넘나드는 사각형
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)에서 제공받았습니다.
모든 자료는 저작권법에 의하여 보호받는 저작물로서 이에 대한 무단 복제 및 배포를 원칙적으로 금합니다.
Comment