프로그래머스 | 조이스틱 | 그리디 알고리즘
Algorithm 2019. 8. 26. 12:14조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA
조이스틱을 각 방향으로 움직이면 아래와 같습니다.
▲ - 다음 알파벳 ▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로) ◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서) ▶ - 커서를 오른쪽으로 이동
예를 들어 아래의 방법으로 JAZ를 만들 수 있습니다.
- 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다. - 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다. - 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다. 따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.
만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.
제한 사항
- name은 알파벳 대문자로만 이루어져 있습니다.
- name의 길이는 1 이상 20 이하입니다.
입출력 예
namereturn
JEROEN | 56 |
JAN | 23 |
※ 공지 - 2019년 2월 28일 테스트케이스가 추가되었습니다.
1
2
3
4
5
6
7
8
|
using System;
public class Solution {
public int solution(string name) {
int answer = 0;
return answer;
}
}
|
시간도 부족하고 머리고 안돌아간다... 큰일이다..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
using System;
namespace _19
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("조이스틱");
var sol = new Solution();
//case 1
// var name = "JEROEN";
//result: 56
//case 2
var name = "JAN";
//result: 23
sol.solution(name);
}
}
public class Solution {
public enum eDir{
None,
Up, Down, Left, Right
}
public int solution(string name) {
int answer = 0;
var arrChar = name.ToCharArray();
var t = this.GetDirUpDown(arrChar[i]);
if(arrChar[i] == 'A')
continue;
}
//Console.WriteLine("-----------------------------");
// if(t.Item1 == eDir.Up){
// for(int i = 1; i<=t.Item2; i++){
// var nextAscii = this.GetAsciiByChar('A') + i;
// Console.WriteLine("{0} {1} {2}", i, nextAscii, this.GetCharByAscii(nextAscii));
// }
// }else if( t.Item1 == eDir.Down){
// for(int i = 0; i< t.Item2; i++){
// var nextAscii = this.GetAsciiByChar('Z') - i;
// Console.WriteLine("{0} {1} {2}", i, nextAscii, this.GetCharByAscii(nextAscii));
// }
// }
return answer;
}
// public Tuple<eDir, int> GetDirLeftRight(){
// }
public Tuple<eDir, int> GetDirUpDown(char target){
var asciiZ = (int)'Z';
var asciiA = (int)'A';
var asciiTarget = this.GetAsciiByChar(target);
Console.WriteLine("down: {0}, up: {1}", (asciiZ - asciiTarget) + 1, asciiTarget - asciiA);
if(asciiZ - asciiTarget > (asciiTarget - asciiA)){
}else{
}
}
public int GetAsciiByChar(char c){
return (int)c;
}
public char GetCharByAscii(int ascii){
return (char) ascii;
}
}
}
|
테스트 11은 왜 실패인가?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
using System;
namespace _20
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("조이스틱");
var sol = new Solution();
//var result = sol.solution("JEROEN"); case1
var result = sol.solution("JAN"); // case2
//var result = sol.solution("JAZ"); // case3
Console.WriteLine("result: {0}", result);
}
}
public class Solution {
public int solution(string name) {
int answer = 0;
foreach(var c in name){
answer += this.GetUpDownCount(c);
}
var lrCount = GetLeftRightCount(name);
Console.WriteLine("lrCount: {0}", lrCount);
answer += lrCount;
return answer;
}
public int GetUpDownCount(char c){
char A = 'A';
char Z = 'Z';
int right = c - A;
int left = Z - c + 1;
//Console.WriteLine("{0} {1}", left, right);
return Math.Min(left, right);
}
public int GetLeftRightCount(string name){
int first = -1;
int last = -1;
if(i > 0 && name[i] != 'A'){
if(first == -1){
first = i;
}
last = i;
}
var cnt = name[i] == 'A' ? 0 : 1;
target[i] = cnt;
}
}
}
}
|
'Algorithm' 카테고리의 다른 글
프로그래머스 | 타겟넘버 | DFS, BFS (0) | 2019.08.26 |
---|---|
TODO | 프로그래머스 | 점프와 순간이동 (0) | 2019.08.26 |
프로그래머스 | JadenCase 문자열 만들기 (0) | 2019.08.26 |
프로그래머스 | 소수찾기 (0) | 2019.08.26 |
프로그래머스 | 평균구하기 (0) | 2019.08.26 |