#include <iostream>
using namespace std;

int main()
{
	ios::sync_with_stdio(0), cin.tie(0);
	int t, n; cin >> t;

	for (int i = 0; i < t; ++i)
	{
		cin >> n;
		if (n == 1) cout << 2 << "\n";
		else
		{
			int add = n % 3 == 0 ? 0 : 1;
			cout << n / 3 + add << "\n";
		}
	}

	return 0;
}

||사고 과정

일단 최소 이동 횟수가 나오려면 최대한 3으로 많이 가야하니까 목적지에서 3을 나누어야겠다고 생각했다.

3으로 나눈 나머지는 0, 1, 2 세가지 경우의 수가 나오는데 이 각 수에 2를 어떻게 넣느냐를 생각했다.

 

1이 남은 7같은 경우에는 3으로 2번 이동해서 6만큼 가고 여기서 3만큼 한번 뒤로가고 2만큼 두번 가면 7이 된다.

하지만 애시당초 3만큼 1번가고 2만큼 2번가면 최소 3번만에 갈 수가 있다.

즉, n / 3 + 1을 하면 최소 횟수가 나왔다.

이는 1이 남는 모든수에 해당하고 2도 비슷한 방식으로 +1을 해주면 최소 횟수가 나왔다.

 

그렇기에 나머지 값이 1,2가 나오면 단순 +1 을 해주면 되고 0이면 나눈 값을 반환하면 되겠다.

 

예외로 1은 무조건 0부터 시작하기에 2만큼 뒤로 갔다 3만큼 앞으로 가야하기에 1은 예외처리 했다.


||사용 기법

  • Greedy

'코딩 테스트 > 알고리즘 풀이' 카테고리의 다른 글

[백준 - 10951] A+B - 4  (0) 2022.08.10
[백준 - 2562] 문자열 반복  (0) 2022.08.10
[백준 - 24445] 너비 우선 탐색 2  (0) 2022.08.06
[백준 - 106953] A → B  (0) 2022.08.03
[백준 - 2565] 전깃줄  (0) 2022.08.03

+ Recent posts