프로그래머스 | 키패드 누르기

이진웅·2022년 3월 14일
0

알고리즘

목록 보기
9/14
post-thumbnail
function solution(numbers, hand) {
	var answer = ''; // 1.
	const keypad = [ // 2.
		[1, 2, 3],
		[4, 5, 6],
		[7, 8, 9],
		['*', 0, '#'],
	];
	let leftFinger = '*'; // 3.
	let rightFinger = '#';

	const findIndex = (number) => { // 4. 
		const result = [];

		for (let j = 0; j < keypad.length; j++) {
			for (let k = 0; k < keypad.length; k++) {
				if (keypad[j][k] === number) {
					result.push([j], [k]);
				}
			}
		}

		return result;
	};

	const calLength = (array1, array2) => { // 5. 
		let result = 0;

		for (let i = 0; i < array1.length; i++) {
			for (let j = 0; j < array2.length; j++) {
				if (i === j) {
					result += Math.abs(array1[i] - array2[j]);
				}
			}
		}

		return result;
	};

	for (let i = 0; i < numbers.length; i++) { // 6. 
		if (numbers[i] === 1 || numbers[i] === 4 || numbers[i] === 7) {
			leftFinger = numbers[i];
			answer += 'L';
		} else if (numbers[i] === 3 || numbers[i] === 6 || numbers[i] === 9) {
			rightFinger = numbers[i];
			answer += 'R';
		} else {
			if (calLength(findIndex(numbers[i]), findIndex(leftFinger)) < calLength(findIndex(numbers[i]), findIndex(rightFinger))) {
				leftFinger = numbers[i];
				answer += 'L';
			} else if (calLength(findIndex(numbers[i]), findIndex(leftFinger)) > calLength(findIndex(numbers[i]), findIndex(rightFinger))) {
				rightFinger = numbers[i];
				answer += 'R';
			} else {
				if (hand === 'right') {
					rightFinger = numbers[i];
					answer += 'R';
				} else {
					leftFinger = numbers[i];
					answer += 'L';
				}
			}
		}
	}

	return answer;
}

카카오 인턴 문제라 그런지 푸는데 3시간정도 걸렸던 것 같다... 😢

처음에는 한 번에 풀려고 했는데 너무 많은 반복문이 필요했던 것 같아 함수로 분리해서 문제를 풀었다.

  1. 마지막 답변을 입력할 곳 +를 이용해 하나씩 붙인다.
  2. 휴대폰 키패드를 이중 배열로 구현
  3. 오른손, 왼손의 initial value
  4. 매개변수 numbers의 숫자들을 2.에서 선언한 배열의 인덱스를 구해주는 함수
  5. 4.에서 구현한 인덱스들의 차이의 합을 절대 값으로 구하는 함수
  6. 본격적인 로직
    • 1, 4, 7을 눌렸을 때, leftFinger의 값을 갱신시키고, "L"을 답변에 추가시켜준다.
    • 3, 6, 9를 눌렸을 때도 위와 마찬가지로 rightFinger의 값을 갱신시키고, "R"을 답변에 추가 시켰다.
    • 나머지 2, 5, 6, 0 일 때는 현재의 leftFinger에서 numbers[i]의 거리, rightFinger에서 numbers[i]의 거리 중 짧은 것을 선택하게끔 해주었고, 거리가 같을 경우는 hand에 따라 분기시켜주었다.

2번까지는 처음에 떠올린 접근방법이었는데, 이후를 구현하는데 어려움이 많았던 것 같다. 무식한 방법이라도 풀어냈다는데 의의를 두어야겠다

0개의 댓글