시계, 반시계 문제 Javascript

cptkuk91·2022년 8월 1일
1

Algorithm

목록 보기
44/161
post-custom-banner

문제 설명

12, 2, 4, 6, 8, 10 적혀 있는 시계가 있습니다. 12부터 N까지 이동 시 1의 에너지가 소모됩니다. 또 각 시와 시 사이를 오가기 위해서는 중간에 위치한 시를 반드시 거쳐서 이동해야 합니다. 다음은 N = 6인 경우의 예시입니다.

12에서 4로 이동하기 위해서는 2를 통해 4로 가야합니다. 따라서 12에서 4까지 이동할 때는 2의 에너지가 소요됩니다.
만약 시계가 시계방향으로 흘러간다면 5의 에너지가 필요합니다.
만약 시계가 12, 4, 8, 2, 6, 10과 같은 순서로 시계, 반시계 섞여 흐른다면 얼만큼의 에너지가 필요할까요?

문제를 풀기 위해서..

우선 시계 방향으로 이동할 때 에너지 소요가 덜 한지, 반시계로 흐를 때 에너지 소요가 덜 한지 파악해야 합니다.

재귀 함수를 통해, 시계, 반시계 방향을 확인할 수 있습니다.

const minDistance = (a, b, N) => {
	if(a > b){
    	return Math.min(a - b, N - a + b - 1 + 1);
    } else {
    	return Math.min(b - a, N - b + a - 1 + 1);
    }
}

재귀 함수를 만들어 둔 상태에서 에너지 소요가 1이 아니라면 시계방향인지, 반시계 방향인지 확인해야 합니다.

시계, 반시계 확인문 만들기 (결과값에 담아주기)

if(sequence[0] !== 12){
	result += minDistance(sequence[i], sequence[i + 1], N);
}

위 재귀함수와, 시계, 반시계 확인문을 통하면 에너지 소요값을 구할 수 있습니다.

function solution (N, sequence){
	let reulst = 0; // 에너지 소요값을 담을 result
    const minDistance = (a, b, N) => {
    	if(a > b){
        	// 정방향
        	return Math.min(a - b, N - a + b - 1 + 1);
        } else {
        	// 역방향
        	return Math.min(b - a, N - b + a - 1 + 1);
        }
    }
    if(sequence[0] !== 12){
    	result += minDistance(sequence[i], sequence[i + 1], N);
    }
    for(let i = 0; i < sequence.length - 1; i++){
    	result += minDistance(sequence[i], sequence[i + 1], N);
    }
    return result;
}

정방향, 역방향에 -1 +1 과연 필요할까?

정방향, 역방향에 관한 공식을 알고 있다면 필요없다.

두 숫자를 넣었을 때, 두 숫자중 어떤게 큰지 모른다.

절대값을 구하기 위한 용도이다.

따라서 정확히는 N - a가 b - 1 그리고 + 1이 별로도 따라오는 것이다.

하지만 역방향, 정방향에 대한 식을 알고 있다면 절대값을 구하기 위해서 -1, +1 적어줄 필요가 없다.

profile
메일은 매일 확인하고 있습니다. 궁금하신 부분이나 틀린 부분에 대한 지적사항이 있으시다면 언제든 편하게 연락 부탁드려요 :)
post-custom-banner

0개의 댓글