https://www.acmicpc.net/problem/22354
22354번: 돌 가져가기
처음 위치 기준 왼쪽에서 $5,\ 6,\ 2,\ 3,\ 4,\ 7,\ 8,\ 1$번째 돌을 순서대로 가져가면 $3$번째 돌과 $5$번째 돌을 가져갈 때 점수를 얻어 $13$점이 된다.
www.acmicpc.net
사실,, 해결 못했다,,,
몇시간을 풀어보고 결국 마지막에 구글링을 했는데,, 다른 사람들도 내가 푼 방식대로 한거 같은데 왜 안되는거야..!!!
일단 내가 푼 코드는 아래와 같다.
N = int(input())
array = list(input())
scores = list(map(int, input().split()))
result = 0
def funcMax(i, j):
if i > j:
return i
else:
return j
setting = []
max_score = scores[0]
# Compression
for i in range(N - 1):
if (array[i] == array[i + 1]):
max_score = funcMax(max_score, scores[i + 1])
if (i==(N-2)):
setting.append(max_score)
break
else:
setting.append(max_score)
max_score = scores[i+1]
if (i==(N-2)):
setting.append(max_score)
break
N = len(setting)
# 양옆 삭제
setting.pop(0)
setting.pop(-1)
setting.sort(reverse=True)
# 소수점 올림해주는 꼼수
div_num = (len(setting)+1)/2
div = int(div_num)
for i in range(div):
result = result + setting[i]
print(result)
풀이 설명
일단 압축먼저 시켜야함. → 두번째 B를 가져간다해도 점수를 못받고 세번째 B를 가져간다고 해도 점수를 못받음 (WBWBWBB 요롷게 됐을 거니까) → 어차피 점수를 받으려면 각 옆자리 돌들의 색이 달라야하니까 압축시켜야함
근데 뭘로 압축? 당연히 점수가 큰 돌로 압축을 시켜야겠지 !!
압축을 시키면 WBWBWB가 되고, 당연히 맨 앞뒤 돌은 뽑아도 점수를 못받으니까 양 끝을 삭제
그럼 BWBW가 되고 결과적으로 뭔 수를 뽑든간데 남은 4개 돌들 4/2 = 2개를 뽑을 수 있음..!!
(양 끝을 삭제시켰을 때, BWBWB와 같이 5개의 돌이 나온다면 5/2 = 2.5 인데, 소수점을 무조건 올림하여 3개의 돌을 뽑기)
당연히 높은 수들로 뽑아야하니 BWBWBW를 내림차순으로 정렬! → 가장 높은 수 2개를 더하면 정답이 출력됨 !
'Algorithm > Python' 카테고리의 다른 글
[Algorithm] 백준 19532번 : 수학은 비대면강의입니다 (0) | 2022.06.12 |
---|---|
[Algorithm] 백준 22352번 : 항체 인식 (0) | 2022.06.06 |
[Algorithm] 백준 17362번 : 수학은 체육과목 입니다 2 (0) | 2022.05.30 |
[Algorithm] 백준 22351번 : 수학은 체육과목 입니다 3 (0) | 2022.05.30 |
[Algorithm] Python : index 함수의 시간초과 해결법, Dictionary 이용 ! (0) | 2022.04.01 |