tf flash또는 USB에 Raspberry Pi OS설치

https://www.raspberrypi.com/software/

 

Raspberry Pi OS – Raspberry Pi

From industries large and small, to the kitchen table tinkerer, to the classroom coder, we make computing accessible and affordable for everybody.

www.raspberrypi.com

여기서 안내에 따라 진행

 

ssh enable

sudo raspi-config

Interfacing Options > SSH > Yes

여기 참조

 

반응형

'Programming' 카테고리의 다른 글

go언어(golang)  (0) 2025.05.25
window에서 vscode로 원격 linux에 대한 ssh 개발환경 설정하기  (1) 2024.07.20
yaml  (0) 2024.03.02
디자인패턴  (0) 2023.08.17
STL lower_bound, upper_bound  (0) 2020.04.12

여기, 여기 참조

 

브루트포스로 풀기에는 N이 약간만 너무 클때, 

분할정복처럼 절반씩 나누고 연산한다음 합치는 연산을 하는걸 meet in the middle이라고 한다.

분할정복처럼 반복적으로 나누고 합치고 하지는 않고 1회성으로만 하는거 같다.

 

합치는 연산은 문제마다 다르며, 투포인터가 사용될때도 있다.

샘플 문제는 여기를 참고하자.

 

아직 정확히 모르는점들

meet in the middle을 반복하면 계속해서 복잡도를 줄일 수 있는가? 만약 가능하다면 분할정복과의 차이점은?

합치는 연산에서 투포인터 말고 다른게 쓰는 예는 어떤게 있는가?

  • 요건 이분탐색이 있는데, 이분탐색도 직접구현 기준으로 보면 left, right 포인터를 쓰는거라 투포인터의 일종으로 볼 수는 있을듯?

 

반응형

투 포인터는 한 가지 알고리즘을 말하는 것이라기보다,

포인터 i, j 두 개를 사용해서, 브루트 포스로는 O(N^2)이 걸리는 문제를,

O(N)으로 만드는 그리디 알고리즘의 모음라고 보는 게 좋다.

 

따라서, 투 포인터는 예제를 통해서 익히는 게 좋고,

투 포인터를 통해서 그리디가 가능한 문제는 부분합,

배열의 두 값의 합이나 차가 특정 수가 되는지(A [i]+A [j]=S) 찾는 문제 등이 있다.

위 링크들은 백준 문제로 연결된다.

 

구현 난이도는, 아무래도 그리디다 보니 조건절이 브루트 포스보다는 더 들어가야 해서,

조금 더 어렵고 주의를 요한다고 볼 수 있다.

 

 

반응형

그림 1

위처럼,

어떤 그래프를 V1과 V2 그룹으로 나누었을때,

그룹내의 정점끼리는 간선이 없고 그룹간 간선만 존재할 때 이분 그래프라고 한다.

 

주어진 그래프가 이분 그래프인지 판정하기

그림2

undirected 이면서 모든 두 꼭지점의 연결 경로가 존재하는 연결 그래프(connected graph)인 경우,

아무노드나 잡고, BFS나 DFS로 위처럼 색칠을 해 나가다가 색깔의 conflict 가 있으면 이분 그래프가 아니고, 없으면 이분 그래프로 판정 가능하다.

 

undirected 이면서 연결 그래프는 아닌경우(위의 그림1도 연결그래프는 아님),

이경우도 단순하게 분리된 각각의 연결 그래프에 대해서 모두 위의 색칠로직을 적용해주면 됨(모든 분리된 그래프가 이분 그래프여야 전체도 이분그래프인걸로 판정)

아래 소스코드 참조. 이 문제의 답안이기도 하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <bits/stdc++.h>
using namespace std;
#define REP(i,n) for(int i=0;i<(int)(n);i++)
enum Color {BLACK, BLUE, RED};
int32_t main()
{
    int K; scanf("%d"&K);
    while (K--) {
        int V, E; scanf("%d%d"&V, &E);
        vector<vector<int>> adj_list(V + 1);
        while (E--) {
            int u, v; scanf("%d%d"&u, &v);
            adj_list[u].push_back(v);
            adj_list[v].push_back(u);
        }
        stack<int> qn; REP(i, V)qn.push(i + 1);
        vector<int> color(V + 1, BLACK);
        bool ans = true;
        while (ans == true && qn.empty() == false) {
            int n = qn.top(); qn.pop();
            if (color[n] == BLACK) color[n] = BLUE;
            for (auto adj : adj_list[n]) {
                if (color[adj] == BLACK) {
                    color[adj] = (color[n] == BLUE) ? RED : BLUE;
                    qn.push(adj);
                }
                else if (color[adj] == color[n]) {
                    ans = false;
                    break;
                }
            }
        }
        printf("%s\n", ans ? "YES" : "NO");
    }
    return 0;
}
 
cs

 

directed인경우,

이 경우도 판정 가능한거 같은데, 자세히 알아보진 않았다.

 

 

 

 

반응형

문제에서 double을 다뤄야 하면, 주의해야할 점들이 있어서 나열해 본다.

 

이 문제를 보자.

먼저, double을 int로 변환해야하는 경우 단순한 형변환으로는 부족할 수 있다.

예를 들어 다음코드를 돌려보면 1004가 아닌 1003이 찍힌다.

1
2
3
4
5
6
7
int32_t main()
{
    double a = 10.04 * 100;
    int b = a;
    printf("%d\n", b);
    return 0;
}
cs

이경우 다음처럼 뒤에 0.5를 곱해주고 변환해야 제대로 변환된다.

1
2
3
4
5
6
7
int32_t main()
{
    double a = 10.04 * 100 + 0.5;
    int b = a;
    printf("%d\n", b);
    return 0;
}
cs

 

아래처럼 rint를 쓰면 가까운 int로 변환해서 해당문제가 없어진다고 한다.

double a = 10.04 * 100;
int b = (int) rint(a);
printf("%d\n", b);

 

 

반응형

'Programming > Problem Solving' 카테고리의 다른 글

프로그래머스 - 유사 칸토어 비트열  (0) 2025.03.09
cph  (0) 2024.07.21
백준 4103 ATM  (1) 2020.05.05
백준 15481 그래프와 MST  (0) 2020.05.02
BST 트리 구현  (0) 2020.04.09

로그중에 u'\ucc98\ub9ac' 이런식의 시퀀스가 보이면, 그냥 긁어서 다음과 같이하면 보인다

>>print(u'\ucc98\ub9ac')

처리

 

hex와 euc-kr/utf-8 변환에는 다음 사이트가 좋다.

https://r12a.github.io/app-encodings/

 

Encoding converter

show all the characters in: Select... big5 euc-jp iso-2022-jp shift_jis euc-kr gb18030 (index only) gbk koi8-r koi8-u windows-1250 windows-1251 windows-1252 windows-1253 windows-1254 windows-1255 windows-1256 windows-1257 windows-1258 macintosh ibm866 wind

r12a.github.io

 

로그중에 "\353\224\224\354\226\264\353\270\214\353\240\210\353\223\234" 이런형식의 시퀀스가 보이면 다음처럼 해보면 된다.
>>> a = "\353\224\224\354\226\264\353\270\214\353\240\210\353\223\234"
>>> print(a.encode('latin1').decode('utf-8'))
디어브레드
 
 
반응형

'Programming > Python' 카테고리의 다른 글

venv  (0) 2023.12.17
mypy / pytype  (1) 2023.10.07
Python GUI Programming(Tkinter)  (2) 2021.01.02
파이선환경 그리고 requirements.txt  (1) 2020.09.20
Google Colab(Colaboratory Lab) 팁  (0) 2019.03.07

3D 엔진을 내손으로 직접 만들어보는 프로젝트!

 

3D 드로잉은 좀 더 풀어서 설명하면, 3차원 공간을 2차원 평면에 표현하는 과정이고,

2D 드로잉은 2차원 공간을 2차원 평면에 표현하는 과정이다.

따라서 3D 드로잉이 2D보다 조금 어려운게 아니라 많이! 더 어렵다.

 

어려운점1 : 투사!

3D 드로잉은 3차원 공간을 2차원 평면에 표현하기 위해 아래처럼 투사라는 과정이 추가로 들어간다.

투사를 표현한 그림. canvas라는 평면에 투사되어 우리눈에 보인다.

투사는 개념은 이해하기 쉽지만 막상 코딩을 하려고 하면 어질어질 해진다.

 

어려운점2 : 4x4 행렬연산 이해하기!

거기에다 물체의 회전, 이동등의 움직임을 효율적으로 계산하기 위해서 보통 행렬이 쓰이는데, 이게 또 난이도를 올리는 원인이된다. 게다가 3차원이면 3x3행렬이 쓰일거 같은데, "이동변환" 때문에 4x4행렬이 쓰이는점도 이해하기 쉽지 않다.

 

어려운점3 : 수많은 수학적인 용어들과 싸우기!

게다가 좌표계와 변환에 대한 내용이다 보니, 수학적으로 한없이 현학적으로 들어갈 수 있어, 관련자료를 공부하는 과정에서 쉽게 지치고 포기하게 되는 포인트가 된다.

오일러회전, 쿼터니언, 선형변환, 아핀변환, 물체좌표, 월드좌표, 카메라좌표, 스크린좌표, 직교좌표계, 호모지니어스(동차) 좌표계, 로컬좌표계, 글로벌좌표계, 포인트, 벡터 등등 이름만 들어도 어질어질 해진다 ㅠ

 

언어와 라이브러리 고르기

언어는 내 취향대로 C++을 골랐고,

아직 C++에서 native로 drawing을 지원하지 않기 때문에 SFML 라이브러리를 사용하기로 했다.

OS 및 개발환경에 따른 SFML초기환경 세팅은 여기를 참고하자. (필자는 Windows 10 / Visual Studio 2019 환경)

 

SFML로 기본적인 2D 드로잉 해보기

아래 코드를 입력해서 기본 drawing canvas를 띄워보자

#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf;

int main(void)
{
	RenderWindow window(VideoMode(800, 600), "2D");

	while (window.isOpen())
	{
		Event e;
		while (window.pollEvent(e))
		{
			if (e.type == Event::Closed) window.close();
		}
		window.clear(Color::Blue);
		window.display();
	}
	return 0;
}

가장 간단한 기본 형태인데 왜 while문이 2개나 있는지 궁금하실 수 있는데, 아주 간단하게 언급하고 넘어가자면, while문 형태의 무한루프가 없으면 return 0;으로 프로그램이 바로 종료되어 버리기 때문이다, 그리고 움직임을 표현하려면 반복적으로 그려주는게 필요해서 기본적으로 while 무한루프형태가 필요하고, 창을 닫는등의 이벤트를 받기위해 간단한형태의 이벤트 루프가 필요하기 때문에  안쪽의 while루프 하나가 더 들어간다고 보면 된다. (이런 이벤트 루프가 없으면 창을 닫아도 c프로그램에서 알 방법이 없기 때문에 while문들을 다 벗어나서 return 0;으로 프로그램을 종료할 방법이 없다.)

실행결과

아래 코드를 입력해서, 랜덤색깔을 가진 점들을 랜덤위치에 표시해보자.

#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf;

int main(void)
{
	RenderWindow window(VideoMode(800, 600), "2D");

	auto draw_dots = [&]()
	{
		for (int i = 0; i < 1000000; i++)
		{
			Vertex point(sf::Vector2f(rand()%800, rand()%600), Color(rand()%255, rand()%255, rand()%255));
			window.draw(&point, 1, Points);
		}
	};

	while (window.isOpen())
	{
		Event e;
		while (window.pollEvent(e))
		{
			if (e.type == Event::Closed) window.close();
		}
		window.clear(Color::Blue);
		draw_dots();
		window.display();
	}
	return 0;
}

랜덤 점찍기 실행결과

 

아래 코드를 입력해서, 랜덤색깔을 가진 선들을 랜덤위치에 표시해보자.

#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf;

int main(void)
{
	RenderWindow window(VideoMode(800, 600), "2D");

	auto draw_lines = [&]()
	{
		for (int i = 0; i < 1000; i++)
		{
			Color c1 = Color(rand() % 255, rand() % 255, rand() % 255);
			Color c2 = Color(rand() % 255, rand() % 255, rand() % 255);
			sf::Vertex line[2] = { 
				{Vector2f(rand() % 800, rand() % 600), c1},
				{Vector2f(rand() % 800, rand() % 600), c2}, };
			window.draw(line, 2, Lines);

		}
	};

	while (window.isOpen())
	{
		Event e;
		while (window.pollEvent(e))
		{
			if (e.type == Event::Closed) window.close();
		}
		window.clear(Color::Blue);
		draw_lines();
		window.display();
	}
	return 0;
}

랜덤 선찍기 실행결과

 

반응형

vim -d a.cpp b.cpp 하면 기본적으로 diff모드로 두 파일을 열어준다.

 

]c 또는 [c로 다음, 이전 변경사항으로 커서를 이동한다.

 

zr로 묶인 부분을 풀어준다.

반응형

'Programming > Linux' 카테고리의 다른 글

하둡(Hadoop)  (0) 2023.07.29
Docker 설치, 초기설정, 명령어가이드  (0) 2023.07.17
X Window System(X11) - 여러 호스트에서 ssh로 붙어서 사용하기  (1) 2021.01.08
Ansible  (1) 2020.10.22
tmux and byobu  (0) 2020.09.21

ssh를 통해서 tkinter 프로그램을 돌리느라 x11을 사용하게 되었는데, 

여러군데서 ssh를 접속하는 경우 DISPLAY문제로 원하는 호스트 쪽에서 제대로 app이 뜨지 않는 문제(hang)가 발견돼서 며칠고생했다.


해결한 방법은 결국 x11 커맨드라기 보다는,

w 명령어를 통해 다음과 같이 접속한 ssh세션을 나열하고, pkill -9 -t pts/0 이런 명령어를 통해 원치 않는 호스트쪽 세션을 정리하는 거였다.


여기참조함

반응형

'Programming > Linux' 카테고리의 다른 글

Docker 설치, 초기설정, 명령어가이드  (0) 2023.07.17
vimdiff  (0) 2021.04.07
Ansible  (1) 2020.10.22
tmux and byobu  (0) 2020.09.21
vim  (0) 2020.09.20

개인적으로 python으로 GUI프로그램을 하나 작성할일이 생겨서, 여기에 그 과정을 기록해본다.

 

여기를 참고해서 파이선에 기본적으로 딸려 나온다는 Tkinter를 사용해보기로 결정했다.

처음 tutorial은 여기를 참고했는데, 기본적으로 딸려 나오는 모듈이라그런지 사용도 무척 쉬웠다.

만약 리눅스에 ssh로 접속하고 있다면 x-server를 사용해야하는데,

나의 경우 라즈베리파이에 깔린 라즈비안에 윈도우에서 MobaXTerm으로 접속하는데, 메뉴에서 Start X-Server만 해주면 바로 동작했다.

(집과 회사등 여러군데에서 ssh로 접속하는 경우는 실행할때 충돌나면서 안되는 경우가 있었는데, 이때는 여기참조해서 터미널(?) 하나를 죽여주면 잘 동작함을 확인)

 

한글로 레이블을 만들면 텍스트가 깨져보이는데, 이게 생각보다 고치기 쉽지 않네 ㅠ 검색도 잘 안되고.. 일단 그냥 영어버전으로 만들기로 하고(...) 넘어감

String으로 된 radiobutton 컨트롤의 경우 위링크에서 추가적으로 여기를 참조해야 초기값 세팅이 가능했다.

위젯간 align을 위해서 grid()를 사용하거나 pack()을 사용하거나 place()를 사용하는거 같은데, 나는 단순하게 하기 위해서 grid()를 사용했다(위의 tutorial에서 소개한 방법이기도 하고).. 섞어 쓰기 보다는 하나만 선택해서 써야하는 것 같은 인상을 받았다.

그런데 grid()의 경우 columnspan을 사용하거나, Frame()으로 그룹핑해주지 않으면 가상의 테이블 때문에 내가 원하는대로 배치가 되지 않는 현상이 있었다. 위짓간 align을 위해서는 sticky라는 키워드를 사용해야했는데, 좀 거지 같은 설계인것 같다.

 

 

 

 

반응형

'Programming > Python' 카테고리의 다른 글

mypy / pytype  (1) 2023.10.07
python 한글 스트링 인코딩 핸들링  (0) 2021.11.30
파이선환경 그리고 requirements.txt  (1) 2020.09.20
Google Colab(Colaboratory Lab) 팁  (0) 2019.03.07
python array (indexing and slicing)  (0) 2019.02.28

+ Recent posts