swea 13469 메모장 프로그램 c++

황연준·2024년 2월 16일
0

알고리즘

목록 보기
4/8

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;
}
profile
서강대💻

0개의 댓글