[문제풀이] 조이스틱

업데이트:

문제 링크 : 조이스틱

풀이 시간 : 30분

1. 문제 풀이

조이스틱을 최소로 움직이는 방법을 찾아야한다.

문제를 크게 2개로 나눠서 계산했다.

1) 각 문자에서 A에서 시작해서 위로 갈지(B,C,D…), 아래로 갈지(Z,Y,X …) 판단

2) 각 문자로 가기 위한 이동 방법 오른쪽으로만 갈지, 왼쪽으로 갔다가 오른쪽으로 갈지, 오른쪽으로 갔다가 왼쪽으로 갈지를 판단

2. 소스 코드

    int temp = name.charAt(0) - 'A';
		int answer = 0;
		//첫 번째 자리는 위아래만 이동
		if (temp < 13) { 
			answer += temp;
		} else {
			// 13 이상이면 뒤부터 하는 것이 더 빠르다
			answer += (26 - temp);
		}
		boolean flag = false;
		// 기본적으로 오른쪽으로 이동
		// 오른쪽으로만 이동 시 문자열 길이 -1 만큼 이동
		int min = name.length()-1;
		int start = 0;
		for (int i = 1; i < name.length(); i++) {
			// A는 갈 필요가 없기 때문에
			// 그 위치를 기준으로 나눈기 위함
			if (name.charAt(i) == 'A') {
				if (!flag) {
					flag = true;
					start = i-1;
				}
				continue;
			}
			// 연속적인 A가 끝났을 때
			if(flag) {
				// 오른쪽을 갔다가 왼쪽으로 가는 것이 빠른지, 왼쪽으로 갔다가 오른쪽으로 가는 것이 빠른지 아니면 그냥 오른쪽으로 가는게 빠른지 판단
				min = Math.min(min, Math.min(start*2+name.length()-i,(name.length()-i)*2+start));
			}
			flag = false;
			// 1) 판단 문자 기준으로 아래로 이동이 빠른지, 위로 이동이 빠른지
			int c = name.charAt(i) - 'A';
			if (c < 13) {
				answer += c;
			} else {
				answer += (26 - c);
			}
		}
		answer+=min;
		return answer;
	}

3. 후기

Level 2 문제여서 쉽게 생각했다.

처음에 단순히 각 위치에서 위로 갈지 아래로 갈지만 판단하면 되는 줄 알았다.

문자 위치로 이동하기 위한 방법이 3가지가 존재한다는 것을 뒤늦게 인지하였다.

4. 주의

예시로 ABABAAAAABA 같은 경우

1) 오른쪽으로만 이동시 좌우이동(9개)+상하이동(3개)

2) 오른쪽 이동 후 왼쪽 이동 시 좌우이동(8개)+상하이동(3개)

3) 왼쪽 이동 후 오른쪽 이동시 좌우이동(7개)+상하이동(3개)