[Algorithm] D-2 이것이 코딩테스트다 chapter 11 그리디 문제 1-3번

Jifrozen·2021년 6월 29일
3

Algorithm

목록 보기
8/70

1. 모험가 길드

코드

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)

과정

1.

만들 수 있는 그룹의 최대값을 구해야한다 -> 공포도가 작은순으로 그룹을 만들어야한다.

2.

모든 모험가를 특정한 그룹에 넣을 필요가 없다.

가장 낮은 공포도부터 넣어주며 그 공포도와 그룹의 사람 숫자를 비교해 그룹의 수를 더해준다.

2. 곱하기 혹은 더하기

코드

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)

과정

1.

가장 왼쪽에 있는게 0 또는 1인경우

2.

왼쪽부터 차례로 계산하다가 0 또는 1을 만나는 경우

조건문을 통해 위 두가지의 경우 + 나머지는 * 해준다.

3. 문자열 뒤집기

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))

과정

() 뒤집기

1.

00^1100 -> 00(11)00 1번
0^1100^110 -> 0(11)00(11)0 2번
00^111000^111 -> 2번
여기서 규칙을 찾을 수 있다. 0->1이 나오는 지점의 합이 모두 같은 문자열로 만드는 최소의 횟수이다.

2.

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))

참고문서

이것이 코딩테스트다 - 나동빈

6개의 댓글

comment-user-thumbnail
2021년 6월 29일

우와 풀이가 너무 깔끔해요 알고리줌님! 많이 배우고 갑니다. 저는 예외와 같이 세세한 생각을 하지 못했는데, 대단하신 것 같아요. 오늘도 너무 고생하셨습니다, 내일 뵙겠습니다! (저는 김덕우입니다~)
그리고 제 블로그에 꼼꼼히 기록 남겨주셔서 항상 감사합니다. 저는 아직 오류를 찾아낼만한 실력이 못돼서 큰 도움이 되지 못하는 것 같아 죄송합니다. 더욱 열심히 하겠습니다, 좋은 밤 되세요!

1개의 답글
comment-user-thumbnail
2021년 6월 29일

안녕하세요 파파이썬입니다.
와 정말 코드가 깔끔하네요!! 정말 멋지십니다 그만큼 많이 고민하고 노력하신 결과겠지요! 본받고 더 열심히 하겠습니다. 오늘도 고생많으셨습니다 알고리줌님. 내일도 힘내요🤓

1개의 답글
comment-user-thumbnail
2021년 6월 29일

와 다른분들 말씀처럼 코드가 정말 깔끔하세요👍 문제 풀이 과정을 보면서 이해하고 갑니다 감사해요☺️ 저도 열심히 노력해서 깔끔한 코드로 문제를 해결하고 싶네요!! 열심히 하겠습니다 ㅎㅎ 내일도 화이팅해요~!

1개의 답글