[백준 5904] Moo 게임
카테고리: BOJ
태그: Cpp GOLD V 분할정복 재귀 Coding Test
난이도
골드 V
📜문제
🔎접근
- ❌ 규칙적으로 길이가 늘어나기 때문에 전체적으로 문자열을 구한다음 그 위치에 맞는 문자를 찾는다. (메모리초과)
- ⭕ 마찬가지로 규칙적으로 늘어나기 때문에 반대로 줄여가면서 위치를 찾을 수 있다.
🌞풀이
❌틀린 풀이1
맨처음에는 전체 길이를 다 구해서 찾으려고 했다.
그런데 입력이 10억까지 들어갈 수 있기 때문에 당연히 메모리 초과가 났다.
#include <iostream>
using namespace std;
string mid_moo = "moo";
int Cal_times(int N)
{
int time = 0;
int len = 3;
int middle_moo = 3;
while (len < N)
{
len = len * 2 + (middle_moo + 1);
middle_moo++;
time++;
}
return time;
}
void Moo(string sentence, int time, int N)
{
string test = "";
mid_moo += "o";
if (time)
{
sentence = sentence + mid_moo + sentence;
Moo(sentence, time - 1, N);
}
else if (time == 0)
{
cout << sentence[N-1];
};
}
int main()
{
int N = 0;
cin >> N;
int time = Cal_times(N);
string s = "moo";
Moo(s, time, N);
return 0;
}
❌틀린 풀이2
전체를 다 구해서 푸는 방식이 잘못됐다고 인지하고 일단 N이 필요한 길이까지 늘린다음 찾아야 하는 위치가 있는 부분을 경우로 구분해 나눠가면서 길이를 줄여나갔다.
그런데 이 방식은 런타임 에러가 났다.
#include <iostream>
using namespace std;
int moo = 0;
int middle = 3;
int total = 3;
char moo_func(int len)
{
if (len < moo) // first
{
total = moo;
middle--;
moo = (total - middle) / 2;
moo_func(len);
}
else if (len > moo + middle) // third
{
len -= moo + middle;
total = moo;
middle--;
moo = (total - middle) / 2;
moo_func(len);
}
else // second
{
len -= moo;
total = middle;
if (len == 1) return 'm';
else return 'o';
}
if (len <= 3)
{
if (len == 1) return 'm';
else return 'o';
}
}
void cal_len(int N)
{
while (1)
{
total = moo * 2 + middle;
if (N < total) break;
moo = total;
middle++;
}
}
int main()
{
int N = 0;
cin >> N;
cal_len(N);
cout << moo_func(N) << "\n";
return 0;
}
⭕ 맞은 풀이
이 방식은 결국 검색을 해서 풀었다. 풀이 참고 사이트
결국은 중간부분이 나온다면 바로 출력을 하고 아니라면 재귀적으로 다시 함수호출을 해서 구하는 방식이다.
#include <iostream>
using namespace std;
string Moo = "moo";
void Cal_MOO(int N, int cnt, int len)
{
int new_len = len * 2 + (cnt + 3);
if (N <= 3)
{
cout << Moo[N - 1] << "\n";
exit(0);
}
if (N > new_len)
{
Cal_MOO(N, cnt + 1, new_len);
}
else
{
if (N > len && N <= len + cnt + 3) // second
{
if (N - len != 1) cout << "o\n";
else cout << "m\n";
exit(0);
}
else Cal_MOO(N - (len + cnt + 3), 1, 3);
}
}
int main()
{
int N = 0;
cin >> N;
Cal_MOO(N, 1, 3);
return 0;
}
댓글남기기