📍 이것이 코딩테스트다(나동빈) - part3.알고리즘 유형별 기출문제 를 풀고 기록했습니다.
- 공포도가 X인 모험가는 반드시 X명 이상의 모험가와 그룹이 되어 마을을 떠난다.
- 몇 명의 모험가는 마을에 그대로 남아있어도 된다.
- 첫째 줄에 모험가의 수 N이 입력됨(1<=N<=100,000)
- 둘째 줄에 각 모험가의 공포도가 N이하의 자연수로 주어지며, 공백으로 구분되어 입력됨.
출력조건) 여행을 떠날 수 있는 그룹 수의 최댓값은?
search(n, list)
: n을 그룹에 포함시킬 때, 최대 그룹수 구하는 함수 생성
def search(n, list):
# n 이 그룹에 포함될 때, 최대 그룹수를 구하는 함수
count = 0
# 초기 list는 공포도가 n이하인 모험가만
list = [i for i in list if i<=n]
while len(list)>= n:
count += 1
list = list[n:]
if not list:
break
n = list[0]
return count
n = int(input())
array = list(map(int, input().split()))
# array 정렬
array.sort(reverse=True)
result = 0
# 모든 모험가에 대해 해당 모험가가 그룹에 포함되었을 때, 최대 그룹수를 구해서 갱신함.
for i in array:
result = max(search(i, array), result)
print(result)
n = int(input())
data = list(map(int, input().split()))
data.sort()
count = 0
group = []
for i in data:
group.append(i)
if i <= len(group):
count += 1
group = []
print(count)
n = int(input())
data = list(map(int, input().split()))
data.sort()
result = 0 # 총 그룹의 수
count = 0 # 현재 그룹에 포함된 모험가의 수
for i in data: # 공포도를 낮은 것부터 하나씩 확인하기
count += 1 #현재 그룹에 해당 모험가를 포함시키기
if count >= i:
result += 1 # 총 그룹수 증가시키기
count = 0 # 현재 그룹에 포함된 모험가의 수 초기화
print(result)
- 각 자리가 숫자(0부터 9)로만 이루어진 문자열 s가 주어졌을 때
(1<=s의 길이<=20)- 왼쪽부터 오른쪽으로 하나씩 모든 숫자를 확인하며 숫자 사이에 '*' 또는 '+' 연산자를 넣어 결과적으로 만들어질 수 있는 가장 큰 수 구하기
s = list(input()) # 문자열을 리스트화
s = list(map(int, s)) # 숫자로 변환
result = 0
for i in s:
result = max(result+i, result*i)
print(result)
data = input()
# 첫 번째 문자를 숫자로 변경하여 대입
result = int(data[0])
for i in range(1, len(data)):
# 두 수 중에서 하나라도 '0'혹은 '1'인 경우, 곱하기보다 더하기 수행
num = int(data[i])
if num <= 1 or result <= 1:
result += num
else:
result *= num
print(result)
- 0과 1로만 이뤄진 문자열 s가 입력됨 (s의 길이는 100만 보다 작음)
- s 에서 연속된 하나 이상의 숫자를 뒤집을수 있다. (0에서 1로, 1에서 0으로)
- 숫자를 뒤집어서 모두 같은 숫자로 만들고자 할 때, 최소로 뒤집는 횟수는?
10011001
은 s = input()
count = [0,0] # 0묶음 수, 1묶음 수 (연속된 수는 한 개로 셈)
now = int(s[0])
count[now] += 1
for i in range(1, len(s)):
num = int(s[i])
if now != num:
# (i-1번째수now)와 (i번째수num)가 다르면 (i번째 수에 해당하는 묶음수)에 1 추가
count[num] += 1
now = num
print(min(count))
data = input()
count0 = 0 # 전부 0으로 바꾸는 경우
count1 = 0 # 전부 1로 바꾸는 경우
# 첫 번째 원소에 대해서 처리
if data[0] == '1':
count0 += 1
else:
count1 += 1
# 두 번째 원소부터 모든 원소를 확인하며
for i in range(len(data)-1):
if data[i] != data[i+1]:
# 다음수에서 1로 바뀌는 경우
if data[i+1] == '1':
count0 += 1
# 다음수에서 0으로 바뀌는 경우
else:
count1 += 1
print(min(count0, count1))