문제

문제에 오류가 있는 것으로 판단됌

https://programmers.co.kr/learn/courses/30/lessons/42860


코드

아래 코드는 통과되지 못했음

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
private static final int A_ASCII = 65;

public int solution(String name) {
char[] toChar = name.toCharArray();

int answer = getUpDownCount(toChar);

int[] serialIndex = getLongestSerialIndex(toChar);

int leftRightCursur = getLeftRightCount(serialIndex[0], serialIndex[1], toChar.length);

answer += leftRightCursur;

return answer;
}

private int getUpDownCount(char[] names) {
int count = 0;
for (char c : names) {
int upDownCurour = c - A_ASCII;
if (upDownCurour > 12) {
upDownCurour = 26 - upDownCurour;
}

count += upDownCurour;
}

return count;
}

private int[] getLongestSerialIndex(char[] array) {
List<Serial> list = getSerialList(array);

Serial serial = getMaxCountSerial(list);

int[] result = new int[2];
result[0] = serial.index;
result[1] = serial.index + serial.count;

return result;
}

private List<Serial> getSerialList(char[] array) {
int count = 0;
List<Serial> list = new ArrayList<Serial>();

for (int i = 0; i < array.length; i++) {
if (array[i] != 'A') {
count = 0;
continue;
}

if (count == 0) {
list.add(new Serial(i, 1));
} else {
list.get(list.size()-1).count = (count+1);
}

count++;
}

return list;
}

private Serial getMaxCountSerial(List<Serial> list) {
int max = 0;
Serial serial = new Serial();

for (Serial s : list) {
if (max <= s.count) {
max = s.count;
serial = s;
}
}

return serial;
}

private int getLeftRightCount(int serialIndex, int serialCount, int nameLength) {
int leftRightCursur = 0;

if (serialIndex == 0 && serialCount == 0) {
leftRightCursur = nameLength - 1;
} else {
int left = serialIndex == 0 ? 0 : serialIndex - 1;
int right = nameLength - serialCount;

leftRightCursur = left > right ? (right * 2) + left : (left * 2) + right;
leftRightCursur = leftRightCursur > nameLength - 1 ? nameLength - 1 : leftRightCursur;
}

return leftRightCursur;
}

class Serial {

private int index;
private int count;

public Serial() {}

public Serial(int index, int count) {
this.index = index;
this.count = count;
}
}

흐름

위 코드는 통과되지 못했음

  1. 문자들을 A로 뺀 후 거꾸로 도는게 빠른지 정방향으로 도는게 빠른지 확인해서 upDownCurour 변수에 저장
  2. 문자열에서 A가 제일 길게 연속되는 부분을 찾기 위해 inner class를 하나 만들어서 A가 연속될 때 마다 A가 시작된 index와 연속된 길이를 저장
  3. A가 제일 길게 저장된 시작 index와 끝 index를 return
  4. 문자열 내에 A가 없으면 정방향으로 돌리고
  5. A가 있으면 return된 index들을 가지고 왼쪽과 오른쪽에서 몇 칸씩 이동해야 하는 지 구함
  6. left와 right를 더하고 가장 짧게 가야하므로 둘 중에 짧은 방향을 한번 더 더함
  7. 더 한 값이 문자열의 길이보다 길면 정방향으로 가는게 더 짧으므로 비교해서 확인
  8. 그렇게 구한 값을 더해서 return

위 코드는 통과되지 못했음


테스트 케이스

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
assertEquals(4, test.solution("AAABAA"));
assertEquals(56, test.solution("JEROEN"));
assertEquals(23, test.solution("JAN"));
assertEquals(48, test.solution("CANAAAAANAN"));
assertEquals(8, test.solution("BBBAAB"));
assertEquals(56, test.solution("AAAAACANAAAAANANAAAAAA"));
assertEquals(3, test.solution("BBAAAAA"));
assertEquals(41, test.solution("JJAJAAAAAAAAAJ"));
assertEquals(21, test.solution("AJAJAA"));
assertEquals(7, test.solution("BBAABAA"));
assertEquals(6, test.solution("BBABA"));
assertEquals(10, test.solution("BBAABBB"));
assertEquals(7, test.solution("BBAABAAAA"));
assertEquals(10, test.solution("BBAABAAAAB"));
assertEquals(6, test.solution("ABAAAAAAABA"));
assertEquals(2, test.solution("AAB"));
assertEquals(11, test.solution("AABAAAAAAABBB"));
assertEquals(5, test.solution("ZZZ"));
assertEquals(10, test.solution("BBBBAAAAAB"));
assertEquals(12, test.solution("BBBBAAAABA"));
assertEquals(10, test.solution("ABABAAAAAAABA"));
assertEquals(18, test.solution("BBBBBBBABB"));
assertEquals(5, test.solution("AZAAAZ"));
assertEquals(3, test.solution("AC"));
assertEquals(3, test.solution("BBAAAAA"));
assertEquals(17, test.solution("ABAAABBBBBBB"));

통과된 코드

  • https://by-dev.tistory.com/9
    • 위 주소의 코드는 “AAABAA”인 경우 2를 return
    • 단순히 B까지 이동하는 것만해도 3이 걸리는데 통과 되었다는게 이해가 가지 않음