C++:: boj 3663 < 고득점 >

jahlee·2023년 11월 21일
0

백준_골드

목록 보기
3/24
post-thumbnail

개념 접근은 제대로 했는데 단방향의 케이스에서 실수를 해 애먹은 문제이다.

핵심은 포인트 두개를 잡고 왼오로 갈때 오왼으로 갈때의 케이스들중 최소값을 찾으면 된다.

#include <string>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
// 고득점
int main() {
	int t;
	string s;
	cin >> t;
	while (t--) {
		cin >> s;
		int answer = 0, move = INT32_MAX, size = s.size();
		for (int i = 0; i < size; i++) {// 각 자리별로 단어 몇개 돌려야 하는지 계산
			answer += min(s[i] - 'A', 'Z' - s[i] + 1);
			if (s[i] != 'A') s[i] = 'B';
		}

		for (int i = 0, j; i < size; i++) {// 포인트 둘을 잡고 왔다 갔다 최소 계산
			j = find(s.begin() + i + 1, s.end(), 'B') - s.begin();
			int right = i * 2 + size - j;
			int left = i + (size - j) * 2;
            // cout << i << " " << j << ": " << right << " " << left << "\n";// 흐름이 잘 안보일때 추가해서 보면 이해하기 쉽다.
			move = min(move, min(left, right));
		}
		cout << answer + move << "\n";
	}
}

0개의 댓글

Powered by GraphCDN, the GraphQL CDN