n = int(input())
data = list(map(int, input().split()))
result = 0
count = 0
data.sort()
for i in data:
count += 1
if count >= i:
result += 1
count = 0
print(result)
만들 수 있는 그룹의 최대값을 구해야한다 -> 공포도가 작은순으로 그룹을 만들어야한다.
모든 모험가를 특정한 그룹에 넣을 필요가 없다.
가장 낮은 공포도부터 넣어주며 그 공포도와 그룹의 사람 숫자를 비교해 그룹의 수를 더해준다.
data = list(map(int, input()))
a = data[0]
for i in range(1, len(data)):
if a <= 1 or data[i]<=1:
a = a + data[i]
else:
a = a * data[i]
print(a)
가장 왼쪽에 있는게 0 또는 1인경우
왼쪽부터 차례로 계산하다가 0 또는 1을 만나는 경우
조건문을 통해 위 두가지의 경우 + 나머지는 * 해준다.
https://www.acmicpc.net/problem/1439
from math import ceil
data = list(map(int, input()))
m = data[0]
result = 0
for i in data:
if i != m:
m = i
result += 1
print(ceil(result / 2))
() 뒤집기
00^1100 -> 00(11)00 1번
0^1100^110 -> 0(11)00(11)0 2번
00^111000^111 -> 2번
여기서 규칙을 찾을 수 있다. 0->1이 나오는 지점의 합이 모두 같은 문자열로 만드는 최소의 횟수이다.
1) 만약 data0 과 list 안에 1이 나올때마다 result+=1를 해준다고 생각하자.
00^1^1^100의 경우 위와같이 했을때 0과 다른 1이 3번 나와 result=3이 된다.
2) m=data0에서 1을 만났을때 m을 1로 교체한다.
0^1^0^1^0^1^0 -> 0->1 m=1 1->0 바뀌는 지점이 6번 나옴 정답은 3번
00^111^00^11 -> 3번 정답은 2번
위와같은 문제점이 생긴다. 하지만 2번과 같은 문제점은 규칙적으로 일어난다. 짝수이면 2로 나눈값이 정답(6->3) 홀수이면 2로 나눠 반올림한 값(3->2)이 정답이다.
따라서 결과값을 만져준다.
print(ceil(result / 2))
이것이 코딩테스트다 - 나동빈
우와 풀이가 너무 깔끔해요 알고리줌님! 많이 배우고 갑니다. 저는 예외와 같이 세세한 생각을 하지 못했는데, 대단하신 것 같아요. 오늘도 너무 고생하셨습니다, 내일 뵙겠습니다! (저는 김덕우입니다~)
그리고 제 블로그에 꼼꼼히 기록 남겨주셔서 항상 감사합니다. 저는 아직 오류를 찾아낼만한 실력이 못돼서 큰 도움이 되지 못하는 것 같아 죄송합니다. 더욱 열심히 하겠습니다, 좋은 밤 되세요!