-
[프로그래머스/Level 2] 조이스틱 (C++)알고리즘 문제풀이/프로그래머스 2020. 11. 17. 17:57
programmers.co.kr/learn/courses/30/lessons/42860
굉장히 어려웠던 그리디 유형 문제
한방향으로만 진행되는게 최소값이 아닐 수 있다. 따라서 왼쪽, 오른쪽으로 진행을 각각 해보고, 두개의 값중 최소값을 구하는 과정을 반복해야한다.
반례 : BBBAAAB -> 9
#include <string> using namespace std; int solution(string name) { int answer = 0; string tmp = ""; // 초기 문자열 모두 A로 초기화 for(int i = 0; i < name.size(); i++) { tmp.push_back('A'); } int nowIdx = 0; while(1) { // 위, 아래 이동 중 최소값 구하기 answer += min(name[nowIdx] - 'A', 'Z' - name[nowIdx] + 1); // A부터 시작하므로 +1 tmp[nowIdx] = name[nowIdx]; if(tmp == name) break; // 종료 조건 // 왼쪽 이동 int leftIdx = nowIdx, leftCnt = 0; while(tmp[leftIdx] == name[leftIdx]) { leftIdx--; leftCnt++; if(leftIdx < 0) leftIdx = name.size() - 1; } // 오른쪽 이동 int rightIdx = nowIdx, rightCnt = 0; while(tmp[rightIdx] == name[rightIdx]) { rightIdx++; rightCnt++; } // 왼쪽 오른쪽 이동 중 최소값 구하기 if(leftCnt < rightCnt) { // ???? answer += leftCnt; nowIdx = leftIdx; } else { answer += rightCnt; nowIdx = rightIdx; } } return answer; }
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Level 2] 삼각 달팽이 (C++) (0) 2020.12.29 [프로그래머스/Level 3] 단어 변환 (C++) (0) 2020.11.24 [프로그래머스/Level 2] 짝지어 제거하기 (C++) (0) 2020.11.10 [프로그래머스/Level 2] JadenCase 문자열 만들기 (C++) (0) 2020.11.10 [프로그래머스/Level 2] 행렬의 곱셈 (C++) (0) 2020.11.09