'개발자' 태그의 글 목록 :: 잡다한 프로그래밍
반응형

1. DOM이란?

돔(DOM)이란 Document Object Model의 약자로 HTML 및 XML 문서를 웹 브라우저가 인식한 객체를 의미(일종의 인터페이스)

DOM은 다음과 같은 다음과 같은 workflow를 따른다. 즉 html를 읽어서 DOM 트리, CSS 트리를 만들고 DOM의 위치를 잡고 거기에 그리고 색을 채운다.


2. DOM의 단점?

단순히 HTML을 서버에서 받아 브라우저에 그릴 때는 문제가 생기지 않는다 하지만 SPA(Single page application) 같은 것들이 생겨나면서 자바스크립트를 이용해 DOM을 변경하려고 브라우저에 요청을 할 경우 다음과 같은 문제가 발생한다. 예를 들어 트위터나 페이스북에서는 스크롤을 내리면 많은 데이터가 로딩이 되고 이는 쉽게 말해 div가 많아진다는 의미인데 이때 javascript를 이용하여 DOM을 조작하면 성능에 이슈가 생긴다. 왜냐하면 위 그림과 같은 workflow가 다시 이루어지기 때문이다. 이때 만약 100번을 요청했다면 100번을 다시 painting 하는데 이러한 이슈가 발생한다.

ex) <ul> 내부에 li를 추가할때 개수가 매우 많아지면 브라우저 속도가 느려지는 이슈 발생


3. Virtual DOM 이란?

DOM의 이슈를 Virtual DOM으로 해결할 수 있다. 100번의 DOM 조작 요청이 오면, 가상 돔은 브라우저 대신 변경 내용을 가상 돔에 반영한다.(이때 화면에 그리지 않음) 변화가 반영되었다면 내용을 브라우저에게 전달하여 그리게 한다.(100번 그리던 것을 1번만 그린다) 따라서 다음과 같은 이슈를 Virtual DOM을 통해 개선할 수 있다.

반응형
반응형

 

https://programmers.co.kr/learn/challenges?tab=all_challenges

 

프로그래밍 강의 | 프로그래머스

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

1. 해결방법

문제에서 제시한 개수만큼 글자를 자르고 이전과 다음으로 저장하여 비교하는 방식을 사용하였다.


2. 코드

#include <iostream>
#include <string>
#include <vector>

using namespace std;
int answer = 9999;
void check(int num, string s){
    int mok;
    if(s.length() % num == 0) mok = s.length() / num;
    else mok = s.length() / num + 1;
    string result = "";
    int check = 1;
    string pre; string next;
    for(int i = 0; i < mok-1; i++){
        pre = s.substr(i*num, num);
        next = s.substr((i+1) * num , num);
        
        if(pre == next) check++;
        else{
            if(check != 1) result += to_string(check) + pre;
            else result += pre;
            check = 1;
        }
    }
    if(check == 1) result += next;
    else result += to_string(check) + pre;
    if(result.length() < answer) answer = result.length();
    
}

int solution(string s) {
                answer = 9999;

    for(int i = 1; i <= s.length()-1; i++){
        check(i, s);
    }
    if(s.length() == 1) answer = 1;
        return answer;
}
반응형
반응형

https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 해결방법

SW expert 해결했던 문제 중 가능한 시험 점수라는 포스팅에서 해결했던 방법을 사용하면 해결할 수 있을 거라 생각했다. 이는 정확한 해결방법이었다


2. 코드

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;

int total = 0;
int N = 0;
int K = 0;
int ary[20];
int temp[100000];
int sum = 0;

void check(){
    temp[0] = 1;
    sum = 0;
    
    for(int i = 0; i < N; i++){
     sum += ary[i];
        for(int j = sum; j>=0; j--){
            if(temp[j]){
                temp[j + ary[i]] += temp[j];
            }
        }
    }

}
int main()
{
    cin >> total;
    for(int i = 0; i < total; i++){
        memset(temp, 0, sizeof(temp));
        memset(ary, 0, sizeof(ary));      
        scanf("%d", &N);
        scanf("%d", &K);
        for(int j = 0; j < N; j++){
            scanf("%d", &ary[j]);
        }
        check();
        cout << "#" << i+1 << " " << temp[K] << endl;
    }
}

3. 주의사항

문제처럼 K의 범위를 1000으로 하면 런타임 에러가 발생하여 temp배열의 크기를 더 크게 설정해주었다

반응형
반응형

 

https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


1. 해결방법

정해진 횟수만큼 최대값은 -1 최소값은 +1 반복문을 돌리면서 최대값과 최소값의 차이가 1 이하이면 리턴하게 하는 방법이 가장 적절하다고 생각했다. 예외가 하나도 발생하지 않아서 생각보다 쉬운 문제였다.


2. 코드

#include <iostream>
#include <algorithm>
int total;
int ary[100];
int result;

using namespace std;

void check() {
	int n = 0;
	while (n < total) {
		int max = *max_element(ary, ary + 100);
		int min = *min_element(ary, ary + 100);
		if (max - min <= 1) {
			break;
		}
		else {
			int maxindex = distance(ary, max_element(ary, ary + 100));
			int minindex = distance(ary, min_element(ary, ary + 100));
			ary[maxindex] = ary[maxindex] - 1;
			ary[minindex] = ary[minindex] + 1;
		}

		n++;
	}
}

int main()
{
	for (int i = 0; i < 10; i++) {
		cin >> total;
		for (int j = 0; j < 100; j++) {
			cin >> ary[j];
		}
		check();
		result = *max_element(ary, ary + 100) - *min_element(ary, ary + 100);
		cout << "#" << i + 1 << " " << result << endl;
	}
}
반응형
반응형

https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 해결방법

처음에는 for문을 이용해서 횟수만큼 가장 0번째값과 가장 큰 값을 교환, 이후 1번째 값과 가장 큰 값을 교환 .... 하는 방식으로 해결하려 했으나 배열의 수보다 회전의 수가 많아지거나 같은 자리가 교환 되어버리는 문제가 생겼다 따라서 dfs를 사용하여 모든 경우의 수를 비교하는 방법으로 해결하였다.


2. 코드

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
using namespace std;

int total;
int num = 0;
string tmp;
int result;
void dfs(int x, int dept) {
	if (dept == num) {
		if (result < stoi(tmp)) {
			result = stoi(tmp);
		}
		return;
	}
	else {
		for (int i = x; i < tmp.size(); i++) {
			for (int j = i; j < tmp.size(); j++) {
				if (i == j) continue;
				if (tmp[i] <= tmp[j]) {
					swap(tmp[i], tmp[j]);
					dfs(i, dept + 1);
					swap(tmp[i], tmp[j]);
				}
			}
		}
	}
}
int main()
{
	cin >> total;
	for (int i = 0; i < total; i++) {
		result = 0;
		cin>> tmp;
		scanf("%d", &num);
		result = stoi(tmp);
		dfs(0, 0);
		printf("#%d %d\n", i + 1, result);
	}
}

3. 주의사항

같은 자리가 서로 바뀌는 것을 방지하기 위해 if (i == j) continue; 부분이 꼭 필요하다.

반응형
반응형
링크

https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 해결방법


1. 첫번째 생각으로 bfs를 이용하여 각 위치를 들리며 최소 시간을 구하는 방법을 사용하였다

하지만 bfs방법은 시간이 너무 오래걸려 문제의 시간을 초과해버려서 다른방법을 생각해보아야했다.

 

2. bfs를 사용하는 방법이지만 queue를 사용하였고 또한 cin, cout 대신 scanf와 printf를 사용하였다 cin과 cout보다 scanf와 printf가 속도가 더 빠르다고 하여 사용하여 시간을 단축하였다.


2. 코드

1. bfs방법(실패)

#include <iostream>
using namespace std;
int total = 0;
int num = 0;
int ary[100][100] = {};
int temp = 9999;
bool bo[100][100] = { false };
int sum = 0;
int nx[4] = { 0, 0, -1, 1 };
int ny[4] = { -1, 1, 0, 0 };

void dfs(int x, int y, int val) {
	bo[x][y] = true;

	if (x == num - 1 && y == num - 1) {
		if (temp > val) {
			temp = val;
			bo[x][y] = false;
			return;
		}
	}
	else {
		for (int i = 0; i < 4; i++) {
			int dx = x + nx[i];
			int dy = y + ny[i];

			if (dx < 0 || dx >= num || dy < 0 || dy >= num || bo[dx][dy] == true) continue;
			dfs(dx, dy, val + ary[dx][dy]);
			bo[dx][dy] = false;
		}
	}

}

int main()
{
	scanf("%1d", &total);
	for (int i = 0; i < total; i++) {

		scanf("%1d", &num);
		for (int j = 0; j < num; j++) {
			for (int k = 0; k < num; k++) {
				scanf("%1d", &ary[j][k]);
			}
		}


		temp = 9999;
		fill(&bo[0][0], &bo[0][0] + sizeof(bo), false);

		dfs(0, 0, ary[0][0]);

		cout << "#" << i + 1 << " " << temp << endl;

	}
}

2. queue를 이용한 bfs방법

#include <stdio.h>
#include <queue>
#include <memory.h>


using namespace std;
int total , num;
int ary[100][100];
int temp[100][100];
bool bo[100][100];
struct Node {
	int x;
	int y;
    Node(int _x, int _y) {
        x = _x;
        y = _y;
    }
};
void bfs() {
	queue<Node> q;
	q.push(Node(0, 0));
	bo[0][0] = true;
int dx[] = { 1,-1,0,0 };
    int dy[] = { 0,0,1,-1 };
	while (!q.empty()) {
		int x = q.front().x;
		int y = q.front().y;
		q.pop();
		for (int i = 0; i < 4; i++) {
			 int ax = x + dx[i];
            int ay = y + dy[i];
			if (ax < 0 || ay < 0 || ax >= num || ay >= num ) continue;
                if (!bo[ax][ay] || temp[ax][ay] > temp[x][y] + ary[ax][ay]) {
               temp[ax][ay] = temp[x][y] + ary[ax][ay];
                    q.push(Node(ax, ay));
                    bo[ax][ay] = true;   
             }
		}
	}

}
void init() {
	memset(temp, 0, sizeof(temp));
	memset(bo, false, sizeof(bo));
}
int main()
{
    scanf("%d", &total);
    for (int i = 1; i <= total; i++) {
		init();
    scanf("%d", &num);
        char buf[101];
        for (int j = 0; j < num; j++) {
            scanf("%s", &buf);
			for (int k = 0; k < num; k++) {
			ary[j][k] = buf[k] - '0';
            }
		}
		bfs();
        printf("#%d %d\n", i, temp[num - 1][num - 1]);
	}
}
반응형
반응형

1. Node.JS란?

Node.js®는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다. (홈페이지)

JAVASCRIPT를 브라우저가 아닌 다양한 용도로 사용하기 위해 만들어졌다고 한다. 파일 시스템, 서버 등 사용이 가능하며 내 개인적으로는 서버사이드 언어로 생각해도 무방할 것 같다.


2. Node.JS의 특징

1) V8엔진을 기반으로 한다

 

2) 비동기 프로그래밍 방식

Node.JS는 비동기 방식으로 Single-Thread기반으로 동작하기 때문에 생기는 문제들이 있다 (callback 지옥) 또한 처리 작업이 오래 걸리면 전체 서버에 영향을 줄 수 있다는 단점이 있다 또한 이후 async를 사용해 동기식으로 해결하는 방법도 공부해볼 예정이다.

 

3) 프론트엔드와 백엔드를 자바스크립트 언어로 관리가 가능하다

 

등....

 


3. Node.JS 설치

우분투 16.04버전을 기반으로 진행하였으며 설치방법은 다음과 같다.

sudo apt-get update
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs


//설치 완료후 입력하면
node -v
//node버전 출력

 

 

반응형
반응형

링크
https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


1. 해결방법

모든 지점을 상 하 좌 우로 들리면서 7번째로 도착하면 set에 저장하면 자동으로 중복을 제거해 줄 수 있을 거라고 생각했다. 따라서 모든 지점을 상 하 좌 우로 들리는 방법을 코드로 구현하려 하였으나 결국 검색하여 찾아보니 dfs와 bfs방법을 사용한다고 한다. 이 문제의 해결방법으로는 dfs를 사용했고 dfs와 bfs는 따로 나중에 알고리즘에 추가하도록 할 예정이다.


2. 코드

#include <string>
#include <math.h>
#include <iostream>
#include <set>
using namespace std;

int num = 0;
int arr[4][4];
set<int> setary;
void dfs(int x, int y, int val, int dept) {
	int nx[4] = { 0, 0, -1, 1 };
	int ny[4] = { -1, 1, 0, 0 };
	for (int i = 0; i < 4; i++) {
		if (dept == 7) {
			setary.insert(val);
			return;
		}
		int dx = x + nx[i];
		int dy = y + ny[i];

		if (dx < 0 || dx >= 4 || dy < 0 || dy >= 4) continue;
		else {
			dfs(dx, dy, val * 10 + arr[dy][dx], dept + 1);
		}
	}
}
int main()
{
	cin >> num;
	for (int i = 1; i <= num; i++) {
        setary.clear();
		for (int j = 0; j < 4; j++) {
			for (int k = 0; k < 4; k++) {
				cin >> arr[j][k];
			}
		}
		for (int j = 0; j < 4; j++) {
			for (int k = 0; k < 4; k++) {
				dfs(j, k ,arr[j][k], 1);
			}
		}
		cout << "#"<< i << " " << setary.size() << endl;
	}
}

main함수에서 dfs(j, k, arr[j][k], 1)이 부분을 처음에 0, 0 arr[j][k], 1로 하였다 이때 값이 항상 같은 오류가 생겼고 이를 j k로 수정하며 해결하였다.

반응형

+ Recent posts