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 해줍니다.