본문 바로가기
C++ 코딩 문제 풀이/프로그래머스

[Programmers] 마법의 엘리베이터

by 섬댕이 2023. 12. 8.

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/148653

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


 

문제 해결 과정

착안

10의 거듭제곱에 해당하는 만큼씩 층을 올라가거나 내려갈 수 있으므로 0층에 도착하기 위해 모든 자릿수의 숫자를 0으로 만들도록 이동하며, 이때 이동 횟수를 줄이기 위해 각 자릿수 별로 층을 오르는 것과 내려가는 것 중에서 어느 것이 유리한지를 판단하면 문제를 해결할 수 있다.

 

단, 자릿수 별로 이동할 때 층을 올라가서 해당 자릿수를 0으로 만드는 경우는 현재 자릿수보다 큰 자리 숫자가 1만큼 증가하는 점에 유의해야 한다. 예를 들어 현재 층의 1의 자릿수를 $n$이라고 하면, 1의 자릿수를 0으로 만들기 위해

  • $n < 5$ 인 경우: 1층씩 내려가는 것이 유리
  • $n > 5$ 인 경우: 1층씩 올라가는 것이 유리하며, 10의 자릿수가 1 증가
  • $n = 5$ 인 경우: 1층씩 내려가는 것과 올라가는 것 모두 5 회 이동으로 동일하지만, 10의 자릿수가 5 이상인 경우에는 층을 올라가서 10의 자릿수를 증가시키는 것이 다음 단계에서 유리하며 이외에는 층을 내려가 10의 자릿수를 그대로 유지하는 것이 다음 단계에서 유리하다

 

구현

위와 같은 방법을 구현함에 있어 동일한 작업이 자릿수마다 반복되므로, 현재 층수의 1의 자리 숫자만 구하여 저장한 다음 현재 층수는 10으로 나눈 값으로 갱신하고 층을 오르는 경우에만 갱신된 층수에 1을 더해주는 방식으로 반복문을 구현하였다.

 

[스포 주의] 아래 '더보기'를 누르면 코드가 나오니 주의하세요~

더보기
int solution(int storey)
{
	int answer = 0;
	while (storey > 0)
	{
		int digit = storey % 10;
		storey /= 10;

		if (digit < 5)
			answer += digit;
		else if (digit > 5)
		{
			answer += 10 - digit;
			storey++;
		}
		else
		{
			answer += 5;
			if (storey % 10 >= 5)
				storey++;
		}
	}
	
	return answer;
}

 

실행 결과

'C++ 코딩 문제 풀이 > 프로그래머스' 카테고리의 다른 글

[Programmers] N-Queen  (0) 2023.12.12
[Programmers] 섬 연결하기  (0) 2023.12.11
[Programmers] 귤 고르기  (0) 2023.12.06
[Programmers] 카펫  (2) 2023.12.05
[Programmers] 프로세스  (1) 2023.12.02

댓글