- 문제 풀이
"탐욕법"을 사용하는 문제였다.
- 코드
처음에 제출한 코드는 다음과 같다.
#include <string>
#include <vector>
#include <math.h>
using namespace std;
int solution(string name) {
// 필요한 변수 선언
int answer = 0;
int idx = 0;
// 위 아래 횟수 계산
for(int i=0; i<name.length(); i++) {
if(name[i]-'A'<=13)
answer += name[i]-'A';
else
answer += 'Z'-name[i]+1;
}
// 왼 오 횟수 계산
for(int i=1; i<name.length(); i++) {
if(name[i]!='A'){
if( fabs(i-idx) <= fabs(name.length()-fabs(i-idx)) ) {
answer += fabs(i-idx);
idx = i;
}
else {
answer += fabs(name.length()-fabs(i-idx));
idx = i;
}
}
}
// 계산 값 반환
return answer;
}

하지만 위와 같은 결과가 나왔다.
이를 해결하기 위해 한 줄만에 왼, 오 움직임 횟수를 계산할 수 있도록 만들었다.
1. while문으로 다음 문자가 'A'일 땐 건너 뛰도록 하고,
2. min() 함수를 이용해 최소의 움직임을 구할 수 있도록 했다.
#include <string>
#include <vector>
using namespace std;
int solution(string name) {
// 필요한 변수 선언
int answer = 0;
int len = name.length();
int move = len - 1;
int next;
// 위 아래 횟수 계산
for(int i=0; i<name.length(); i++) {
if(name[i]-'A'<=13)
answer += name[i]-'A';
else
answer += 'Z'-name[i]+1;
}
// 왼 오 횟수 계산
for(int i = 0; i < len; i++) {
//A면 그냥 넘기기
next = i + 1;
while(next < len && name[next] == 'A')
next++;
//최소 움직임 계산
move = min(move, i + (len - next) + min(i, len - next));
}
answer += move;
// 계산 값 반환
return answer;
}
(https://mjmjmj98.tistory.com/67 코드 참고)
'프로그래머스' 카테고리의 다른 글
| 다리를 지나는 트럭 - 프로그래머스, c++ (0) | 2023.02.11 |
|---|---|
| 주식가격 - 프로그래머스, c++ (0) | 2023.02.10 |
| 구명보트 - 프로그래머스, c++ (0) | 2023.02.08 |
| 큰 수 만들기 - 프로그래머스, c++ (0) | 2023.02.07 |
| 체육복 - 프로그래머스, c++ (0) | 2023.02.06 |