cursor index를 다루는게 까다로웠다.
#include <iostream>
#include <deque>
#include <cstring>
using namespace std;
int r_cur, c_cur;
int cnt[305][26];
deque<char> dq[305];
int len;
int h, w;
void init(int H, int W, char mStr[])
{
len = 0;
h = H;
w = W;
memset(cnt, 0, sizeof cnt);
for (int i = 0; i < 304; i++) { dq[i].clear(); }
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
if (mStr[len]) {
dq[i].push_back(mStr[len]);
cnt[i][mStr[len] - 'a']++; //해당 줄의 알파벳 수 ++
len++;
}
else break;
}
}
r_cur = 0; c_cur = 0; //cursor 0,0 으로 초기화
}
void insert(char ch)
{
dq[r_cur].insert(dq[r_cur].begin() + c_cur, ch); //해당 cursor에 ch insert
cnt[r_cur][ch - 'a']++;
len++; //전체길이 ++
int row = r_cur;
c_cur++; // col++
if (c_cur == w) { // ++한 col이 w를 넘어가면
c_cur = 0; //다음 (r_cur + 1, 0) 으로
++r_cur;
}
while ((int)dq[row].size() > w) {
int tmp = dq[row].back();
cnt[row][tmp - 'a']--;
dq[row].pop_back(); // 해당 행은 길이를 초과했기 때문에 pop_back
row++;
dq[row].push_front(tmp); // 다음 행의 앞에 넣어주기
cnt[row][tmp - 'a']++;
}
}
char moveCursor(int mRow, int mCol)
{
--mRow, --mCol; // index 맞춰주기
if (mRow * w + mCol + 1 > len) {
r_cur = len / w;
c_cur = len % w;
// (len/w, len%w) 으로 cursor 보내주기
return '$';
}
r_cur = mRow; c_cur = mCol;
return dq[mRow][mCol];
}
int countCharacter(char ch)
{
int ans = 0;
// cursor 있는 행에서 ch 세어주기
for (int i = c_cur; i < dq[r_cur].size(); i++) {
if (dq[r_cur][i] == ch) {
ans++;
}
}
int row = r_cur + 1;
// 행 넘어가면서 ch 세어주기
for (int i = row; i < h; i++) {
ans += cnt[i][ch - 'a'];
}
return ans;
}