백준 18238번 : ZOAC 2
/* 문제 설명 */
위의 그림과 같이, 원판에 문자들이 A-Z 순서대로 적혀있다.
원판을 왼쪽 또는 오른쪽으로 한 칸 돌리는 데에 1의 시간이 소요된다.
처음에는 화살표가 'A'를 가리키고 있을 때, 주어진 문자열을 원판을 적절하게 움직여 최대한 빠르게 출력하시오.
/* 해결 방안 */
원판을 오른쪽이나 왼쪽으로 돌릴 수 있기 때문에, A에서 B로 갈 수도 있고 A에서 Z로 갈 수도 있다.
원은 총 26칸으로 되어 있으므로, 시계 방향으로 봤을 때 X였다면, 반시계 방향으로는 26-X이 된다.
아래 그림을 참고하면 이해하기 쉽다.
따라서, 시계방향으로 간 것(A)과 반시계 방향으로 간 것(26-A)를 비교하면 된다.
/* 구현 과정 */
1. 현재 화살표가 가리키고 있는 곳(now) 과 현재 보고 있는 문자(str[i])의 차이(a)를 구한다.
2. a와 26-a를 비교하며, 둘 중 더 짧은 걸 선택한다.
/* 소스 코드 */
#include <bits/stdc++.h>
using namespace std;
#define INF 1e9
#define mod 10007
typedef long long ll;
typedef pair<int, int>pi;
typedef pair<int, pi>pii;
string str;
int ans;
char now = 'A';
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> str;
for (int i = 0; i < str.size(); i++)
{
int a = abs(now - str[i]);
ans += min(a, 26 - a);
now = str[i];
}
cout << ans;
}
/* 얻어갈 점 */
알파벳은 총 26개가 있다..^^
A는 65고, a=95다.
'Algorithm > BOJ' 카테고리의 다른 글
[백준 15489] 파스칼 삼각형 (0) | 2021.06.10 |
---|---|
[백준 1756] 피자 굽기 (0) | 2021.04.10 |
[백준 9440] 숫자 더하기 (2) | 2021.03.28 |
[백준 14939] 불 끄기 (1) | 2021.03.25 |
[백준 17609] 회문 (0) | 2021.03.21 |