1로 만들기

20 July 2019

문제 : https://www.acmicpc.net/problem/1463

이번은 N을 1로 바꾸기 위해 주어진 연산을 몇 번 사용하는지 계산하는 문제를 풀어보도록 하겠습니다.

#include<stdio.h>

int getRet();

int arr_idx = 0;

struct Node
{
	int data;
	Node* prev;

	Node* myAlloc(int data, Node* prev) {
		this->data = data;
		this->prev = prev;
		return this;
	}

}a[5000000];


Node* add(int data, Node* prev) {
	return a[arr_idx++].myAlloc(data, prev);
}

Node* head;
Node* nextHead;

int main(void) {

	int N;

	scanf("%d", &N);

	head = add(N, NULL);
	nextHead = NULL;

	printf("%d\n", getRet());

	return 0;
}

int getRet()
{
	int count = 0;

	while (true)
	{
		Node* node = head;
		while (node != NULL)
		{
			if (node->data == 1)
			{
				return count;
			}

			if ((node->data % 3) == 0)
			{
				nextHead = add(node->data / 3, nextHead);
			}
			if ((node->data % 2) == 0)
			{
				nextHead = add(node->data / 2, nextHead);
			}

			nextHead = add(node->data - 1, nextHead);
			node = node->prev;
		}
		head = nextHead;
		nextHead = NULL;
		count++;
	}
}
문제에서 주어진 수로 3으로 나누거나 2로 나누거나 1을 빼주는 작업을 반복하여서 가장 빨리 끝나는 횟수를 찾으면 됩니다.
각각의 작업을 주어진 수에 대해 모두 해주고 나오는 값을 list로 저장해주도록 합니다.
그리고 또다시 그 list에 대해서 작업을 반복해주어 1이 나오면 해당 count를 return 해줍니다.