본문 바로가기

Algorithm/BOJ

[백준 18238] ZOAC 2

백준 18238번 : ZOAC 2

www.acmicpc.net/problem/9440

 

9440번: 숫자 더하기

강민이가 초등학교 3학년일 때, 담임선생님이 이런 문제를 냈었다. 숫자 1, 2, 7, 8, 9 를 사용해서 만든 두 숫자를 더했을 때, 나올 수 있는 가장 작은 수는 무엇일까요? 강민이는 이 문제의 답이 2

www.acmicpc.net

 


/* 문제 설명 */

 

 

위의 그림과 같이, 원판에 문자들이 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