2021. 2. 15. 16:45ㆍ[C#] 코딩테스트 문제풀이
프로그래머스 문제
문제 설명
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA
조이스틱을 각 방향으로 움직이면 아래와 같습니다.
▲ - 다음 알파벳
▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동
예를 들어 아래의 방법으로 JAZ를 만들 수 있습니다.
- 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다.
- 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다.
- 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다.
따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.
만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.
제한 사항
- name은 알파벳 대문자로만 이루어져 있습니다.
- name의 길이는 1 이상 20 이하입니다.
내 풀이
using System;
class Solution
{
public int solution(string name)
{
int answer = 0;
int n = name.Length;
int leftOrRight = name.Length - 1;
for (int i = 0; i < n; i++)
{
int next = i + 1;
char target = name[i];
if (target <= 'N') answer += target - 'A'; //첫 알파벳이 A~N
else answer += 'Z' - target + 1; //첫 알파벳이 O~Z
while (next < n && name[next] == 'A') next++;
leftOrRight = Math.Min(leftOrRight, i + n - next + Math.Min(i, n - next));
}
answer += leftOrRight;
return answer;
}
}
문제 풀이: 조이스틱 문제를 해결하며 파악한 핵심 조건은 3가지였다.
1번째 : Default 값 'A' 기준 A~ N 까지는 오른쪽 이동 , O~Z 까지는 왼쪽 이동이다.
2번째 : 현재 위치에서 가장 가까운 바꿔야할 자리를 찾는다.
부가설명: 왼 쪽으로 이동하는 것이 가까운지 오른쪽으로 이동하는 것이 가까운지 파악하는 것이 중요하다.
이 때 왼쪽으로 갔을때의 거리와 오른쪽으로 갔을때의 거리가 같다면 오른쪽으로 이동한다. (왜 인지 모름 문제 거지같음.)
3번째 : 중간에 'A' 를 다시 만나거나 연속된 A를 만난다면 다시 만난 첫번째 'A'를 기준으로 다시 2번을 시작한다.
3가지 조건을 지켜주면 문제가 해결된다.
느낀점 : 그리디 알고리즘 문제를 해결할 때에는 특정 조건마다 바뀌는 우선순위를 잘 파악하는 것이 중요하다고 느꼇다.
그리디 알고리즘 문제가 요즘 코딩테스트에 많이 나와서 풀어보려 하는데 문제가 대부분 지저분하다.
문제가 지저분해서 그런지 모르겠지만 프로그래머스 사이트 테스트케이스도 부실하고 잘못된 실행결과가 존재한다.
문제를 풀면서 내가 게임을 만들면 훨씬더 효율좋은 조이스틱을 만들 수 있겠다라는 생각이 들었다.
'[C#] 코딩테스트 문제풀이' 카테고리의 다른 글
[C#]프로그래머스-풍선 터트리기 (0) | 2021.04.15 |
---|---|
[C#] 섬연결하기 - 크루스칼 알고리즘 , 그리디 알고리즘 (0) | 2021.02.19 |
[C#]두 개 뽑아서 더하기(List,Array 정렬) (0) | 2021.02.05 |
[C#] 내적 (0) | 2021.02.05 |
[C#]3진법 뒤집기. (0) | 2021.02.05 |