<파이썬 특징>

- 인간다운 언어이다.

- 문법이 쉬워 빠르게 배울 수 있다.

- 무료이지만 강력하다.

- free download

- C언어와 잘 어울린다. -> C언어 라이브러리 사용 가능

- 빅데이터, AI, 자료 분석에서 사용된다.

- 파이썬은 간결하다.

- 개발 속도가 빠르다.

- 개행으로 구문이 구분 된다. -> 반드시 개행을 하여 구문을 구별해야 한다.

 

파이썬으로 할 수 있는 일

- 시스템 유틸리티 제작

- GUI 프로그래밍

- C/C++와의 결합

- 웹 프로그래밍

- 수치 연산 프로그래밍

- 데이터베이스 프로그래밍

- 데이터 분석, 사물 인터넷

 

파이썬으로 할 수 없는 일

- 시스템과 밀접한 프로그래밍 영역

- 모바일 프로그래밍

 

파이썬 설치하기

- 파이썬 언어 패키지를 다운로드

- 파이썬이 어느 곳에서든지 실행될 수 있도록(Add Python 3.5 PATH) 옵션 선택

 

추천에디터

파이 참 - 오류 추적 용이

아나콘다 - 안에 주피터가 있다. 

tip) 주피터 다운로드 경로에는 한글이 있어선 안된다. 

 

주피터 기초 사용방법

 

하나의 칸을 셀(cell)이라고 한다.

 

편집모드(비활성화)

편집 모드에서 a를 누르거나 b를 누르면 편집모드 셀 앞, 뒤에서 셀을 추가할 수 있다.

 

커맨드 모드(활성화)

셀을 삭제하려면, 편집모드에서d를 2번 누르면 된다.

 

커멘드 모드에서는 코딩 작업을 할 수 있다.

커멘드 모드 -> 편집 모드 : esc 클릭

 

Shift + enter -> 실행

 

주피터 특징

.jpynb라는 확장자 파일

-> Ipython Notebook이라는 제품명이었을 때의 흔적

처음 작성 시 Untitled.ipynb라는 파일명

Auto Save 기능

-> 120초마다 자동 저장

체크포인트

-> 코드의 입력이나 실행유뮤와 같은 Notebook의 어느 시점에서의

논리적인 중단점이며, 그때의 처리 상태를 완전하게 보존하고

후에 그 시점에서 처리를 재개할 수 있도록 한 포인트

Markdown과 수식의 이용

-> Markdown은 문서 기술에 대한 서식을 정한 경량 마크업 언어의 한 가지

 

수식 기술하기

-> Markdown 타입으로 설정 후 입력

tip)

네이버에 위키독스를 검색하면 점프 투 파이썬 책 내용을 볼 수 있다.

https://wikidocs.net/book/1

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

현재 파이썬 정리는 점프 투 파이썬 내용을 참조하였다.

 

<참조 코드>

기본적인 문법을 사용한 코드이다.

week_1_homework-checkpoint.ipynb
0.16MB

 

옆에 있는 값과 비교해서 더 작은 값을 앞으로 보내는 알고리즘을 버블 정렬이라 한다.

옆에 있는 값과 비교하여 더 작은 값을 반복적으로 앞으로 보내는 정렬 방법이다.

#include<stdio.h>

int main()
{
	int i, j, temp;
	int array[10] = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};
	
	for(i = 0; i < 10; i++){
		for(j = 0; j<9 - i; j++) {
			if(array[j] > array[j+1])
			{
				temp = array[j];
				array[j] = array[j+1];
				array[j+1] = temp;
			}
		}
	}
	
	for(i=0; i<10; i++)
	{
		printf("%d, ", array[i]);
	}
	
	return 0;
}

선택 정렬은 배열의 가장 작은 인덱스부터 작은 값을 정렬시키고,

버블 정렬은 배열의 가장 큰 인덱스부터 큰 값 부터 정렬시킨다.

O(n*2) -> 선택 정렬과 같이 성능이 좋지 않다.

'알고리즘' 카테고리의 다른 글

자바 배열 정렬  (0) 2021.10.29
[java -heap]PriorityQueue 최소값 반환  (0) 2021.10.28
더 맵게[python3]  (0) 2021.10.27
python - heapq 힙  (0) 2021.10.27
[알고리즘] 선택 정렬(Selection Sort)  (0) 2020.06.28

선택 정렬은 가장 작은 것을 선택해서 제일 앞으로 보내는 알고리즘이다.

 

#include<stdio.h>

int main()
{
	int i, j, temp, min, index;
	int array[10] = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};	
	min = 9999;
		
	for(i=0; i<10; i++) {
		min = 9999; // min 값을 지속적으로 가장 큰 값으로 초기화 하는 이유는 그렇지 않으면 
        			// min 값에 가장 작은 값이 계속 저장되어 array[j]>min 경우만 발생한다.
		
		for(j =i; j<10; j++){
			if(array[j]<min)
			{			
				min = array[j];
				index = j;
			}
		}
		temp = array[i];
		array[i] = min;
		array[index] = temp;
		
	}
	
	for(i=0; i<10; i++)
	{
		printf("%d, ",array[i]);
	}
	
	return 0;
}

 

선택 정렬은 등차 수열로 진행된다.

배열에 {1, 2, 3, 4, 5 ,6 ,7 ,8 9, 10} 값이 무질서하게 정렬 되었을 때 

선택 정렬을 사용한다면

반복문은 10 + 9 + 8 ... + 1 이런 식으로 반복 된다.

이런 원리를 나타내는 경우 이런 식으로 변경할 수 있다. 

=> (10 * (10+1))/2

=> N * (N + 1) / 2

tip) 빅오 표기법 특정한 알고리즘의 수행시간을 간략하게 나타내는 표기법이다.

선택 정렬의 시간 복잡도 => O(n^2)

 

 

 

'알고리즘' 카테고리의 다른 글

자바 배열 정렬  (0) 2021.10.29
[java -heap]PriorityQueue 최소값 반환  (0) 2021.10.28
더 맵게[python3]  (0) 2021.10.27
python - heapq 힙  (0) 2021.10.27
[알고리즘] 버블 정렬(Bubble Sort)  (0) 2020.06.28

https://www.youtube.com/watch?v=MpuOYsmDKeg

 

https://www.youtube.com/watch?v=ukkLCl9yBvE

<참고자료>

 

1. 추천 언어

  c++/Python


2. 코딩 문제 사이트

  백준(https://www.acmicpc.net/) - 삼성 기출문제 공부시 이용

 

Baekjoon Online Judge

Baekjoon Online Judge 프로그래밍 문제를 풀고 온라인으로 채점받을 수 있는 곳입니다.

www.acmicpc.net

프로그래머스(https://programmers.co.kr/)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드포스(http://codeforces.com/) - 코딩 대회 사이트

 

Codeforces

 

codeforces.com

 

SW Expert Academy(https://swexpertacademy.com/main/main.do

 

SW Expert Academy

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

swexpertacademy.com

코드업 기초 100제(https://codeup.kr/problemset.php?search=%EA%B8%B0%EC%B4%88100%EC%A0%9C)

 

Problem Set

 

codeup.kr

 

 

3. 공부 순서

  코드업 기초 100제 with 동빈나 강의  -> 백준(그리디, 탐색, 기초동적 프로그래밍) -> 기출 문제 

 

4. 강의

동빈나 알고리즘 강좌

https://www.youtube.com/playlist?list=PLRx0vPvlEmdDHxCvAQS1_6XV4deOwfVrz

 

실전 알고리즘 강좌 (Algorithm Programming Tutorial) - YouTube

 

www.youtube.com

 

 

참조

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788968480843

 

프로그래밍 면접 이렇게 준비한다 - 교보문고

우리가 전하고 싶은 가장 중요한 메시지는 1판 때와 다르지 않다. 이 책에 들이는 시간만큼 더 많은 것을 얻어갈 수 있을 것이다. 이 책을 처음부터 끝까지 꼼꼼하게 읽는 것만으로도 뭔가 배우��

www.kyobobook.co.kr

ACM-ICPC, 구글 코드잼, 코드포스, 정보올림피아드

 

컴퓨터 게임에 관심이 많았던 저는 그냥 막연한 생각으로 경남대학교 컴퓨터공학과를 지원하게 되었습니다. 컴퓨터공학과에 들어와서 아직 잘 몰랐던 저는 학교 수업을 듣고 시험공부를 하는 정도의 공부를 하였습니다. 1학년에 공부를 하는 친구들이 많지 않아서 1학년에는 A+과목을 많이 받은 경험이 있습니다. 2학년이 되고 필리핀 어학연수를 갔습니다. 필리핀 어학연수를 가게 된 이유는 영어 공부를 타국에서 하면 잘 될 것이라는 기대가 있어서입니다. 필리핀 어학연수는 주로 1:1 수업이 대부분 이었습니다. 비록 미숙한 영어였지만, 영어로 소통하는 시간 동안 영어를 어떻게 말해야 하는지 감을 가질 수 있게 되었습니다. 

어느 날, 필리핀 어학 연수중 한국어 교실이 열리게 되었습니다. 저는 한국어 교사로 봉사 활동을 하였습니다. 한국어를 배우려는 학생들은 대부분 k-pop을 좋아하는 중학생 아니면 고등학생 여자아이들이었습니다. 그에 맞춰 저는 가리켜야 하는 한국어와 좋아하는 k-pop을 물어보고 k-pop으로 한국어를 가르쳤습니다. 그래서 그런지 여자아이들의 집중력이 크게 발휘되었던 것 같습니다. 미숙했지만 한국어를 열심히 배우려고 했던 학생들 덕분에 제가 도움이 된 것 같아 많은 성취감을 느꼈습니다. 그렇게 어학연수를 마치고 군대를 가게 되었습니다. 군대를 다녀온 뒤 다시 학교를 복귀하였습니다. 무난하게 학교 생활을 하던 중 연구실에 학부생 입장으로 들어가게 되었습니다. 연구실에서 처음 했던 것은 C#을 활용해 Winform개발을 하는 것이었습니다. Winform을 조금씩 사용해 보며 점차 익숙해질 무렵 My_SQL을 C#과 연동하여 사용하여 도서 관리 프로그램을 만들었습니다. 이제 그 뒤로는 게임 개발에 관심이 생겨 Unity를 활용해 기본적인 게임 개발을 하였고 실제 게임 개발을 위해서는 모델이 필요한데 모델링을 할 수 없어서 게임 개발은 미뤄두고 안드로이드에 대해 관심이 생기게 되었습니다. 그렇게 안드로이드를 배우면서 애플리케이션을 하나 개발해보면 좋을 것 같다는 생각이 들었습니다. 그렇게 닮은 동물 찾기라는 애플리케이션을 개발하였습니다. 이 앱은 심리테스트 앱입니다. 15가지 문제를 통해 사용자의 성격을 5개로 나누어 가장 높은 점수의 성격과 2위의 성격을 토대로 현재 성격에 맞는 동물을 찾아내게 됩니다. 이러한 과정에서 유튜브를 통해 심리학 자료를 수집하였고 저만의 문제를 개발하여 애플리케이션이 만들어지게 되었습니다. 주로 사용된 기술은 인텐트로 기존 액티비티에서 다른 액티비티로 넘어가게 하였고 플래그를 no_History로 지정하여서 화면에서 사라진 액티비티는 저장 스택에 저장되지 않고 사라지게 만들었습니다. 그리고 문제 뒤의 배경을 만들 때 많은 고민을 하였습니다. 우선 저작권이 없는 이미지는 구글에서 쉽게 찾을 수 있었지만 이미지의 용량이 크면 액티비티가 느리게 넘어가는 현상을 해결해야 했습니다. 그렇게 이미지 용량을 줄여서 출시하게 되었습니다. 그렇게 현재까지 1만 명이 넘는 다운로드 수를 기록하고 최근에 확인한 수익으로는 92달러 정도의 수익이 발생하였습니다. 수익은 애드몹 광고를 사용하였고 종류로는 배너 광고와 전면 광고를 사용하였습니다. 비록 많은 돈은 아니지만 이렇게 직접 만든 앱으로 돈을 번다는 것은 신기하고 재밌는 체험이었고 애플리케이션 개발에 관심이 가게 되는 계기가 되었습니다. 시간이 흘러 여름 방학이 끝나갈 즘 제6회 대한민국 해커톤 대회를 참여하였습니다. 주제는 스마트 시티를 위한 프로그램을 개발하는 것이었습니다. 저희 팀이 선정한 주제로는 아파트 생활 편리를 위한 시스템을 만드는 것이었습니다. 사용된 기술은 C#, 아두이노, 안드로이드였습니다. 아파트 생활 편리 시스템은 기본적으로 아두이노 센서 값을 C# 서버로 정보를 보내게 됩니다. C# 서버에서는 시리얼 통신으로 데이터를 받게 되고 그 값을 안드로이드 앱으로 보내게 됩니다. 그럼 안드로이드 앱에서는 실시간으로 주차공간에 차가 주차되었는지 시각적인 주차공간 이미지에 자동차가 주차되어 있는지 여부를 볼 수 있게 됩니다. 또한 소음 탐지 센서가 각자의 집에 설치되어 있는데 소음 센서가 큰 소리를 감지하면 집주인에게 경보를 주는 기능도 있습니다. 제가 기여한 부분은 주로 안드로이드 앱 개발이었습니다. 이렇게 해카톤을 참여했지만 아쉽게 수상은 하지 못하였습니다. 하지만 빅데이터와 인공지능 등을 활용한 여러 작품을 보면서 많은 자극을 받게 되었습니다. 그다음으로 2019년도 11월에는 스마트 서울 모바일 앱 공모전에 참여하게 되었습니다. 주제는 택시 승치 거부를 막기 위한 애플리케이션 개발이었습니다. 참여 인원은 3명이었고 2명은 개발 1명은 디자인을 하였습니다. 저는 개발하는 쪽이었고, 처음에는 애플리케이션으로 번호판 인식을 넣어 승차 거부한 택시의 번호판을 쉽게 저장할 수 있게끔 만들려고 하였으나 학습 데이터 파일을 인식하는데 실패하여 아쉽게 기능을 넣진 못하였습니다. 택시 승차 거부 앱에 포함된 기능 들로는 신고 처리를 도울 수 있게 입력 절차를 보여주고 실제 데이터를 입력받아서 신고 접수까지 도와주게 됩니다. 또한, 어떠한 상황이 승차 거부가 성립되는지 알려주고, 신고 목록을 볼 수 있는 기능과 간편하게 문자로 신고하는 것을 도와주게 됩니다. 그렇게 작품을 만들어 공모전에 공모하였지만 아쉽게도 택시 승차 거부라는 주제가 조금 난해한 주제라서 탈락한 것 같습니다. 그 뒤로 리눅스 프로그래밍 종합 설계에서 과제를 하였습니다.  라즈베리 운영체제와 소켓 통신하는 스마트 홈이라는 앱을 만들어 스마트폰으로 집안 불을 끄거나 방문을 열거나 욕조 물을 받을 수 있게 구현하였습니다. 재밌는 점은 앱 버튼의 상태를 통해 불이 켜져있는지 아닌지 확인할 수 있습니다. 

#include <opencv2 / improc.hpp>
#include <opencv2 / highgui.hpp>
#include <opencv2 / imgproc /imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat src, dst, cdst;
    src = imread("KN_building.jpg", IMREAD_GRAYSCALE);
    
    Canny(src, dst, 35, 255);
    cvtColor(dst, cdst, COLOR_GRAY2BGR);
    vector <Vec4i> lines;
    HoughLinesP(dst, lines, 1, CV_PI / 180, 50, 100, 20);
    for(size_t i = 0; i< lines.size(); i++){
    	Vec4i l = lines[i];
        line(cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 2);
    }
    
    imshow("허프변환",cdst);
    
    waitkey(0);
}

 

#include <opencv2/improc.hpp>
#include <opencv/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat src, dst1, dst2, dst3, dst4, 
    src = imread("disney.jpg", IMREAD_GRAYSCALE);
    
    threshold(src, dst1, 127, 255, THRESH_BINARY);
    
    Mat saltpepper_noise = Mat::zeros(src.rows, src.cols, CV_8U);
    randu(saltpepper_noise, 0, 255);
    
    Mat black = saltpepper_noise < 30;
    Mat white = saltpepper_noise > 225;
    
    Mat saltpepper_img = dst1.clone();
    saltpepper_img.setTo(255, white);
    saltpepper_img.setTo(0, black);
    
    imshow("1단계: 소금후추 노이즈 적용", saltpepper_img);
    
    Mat element = getStructuringElement(MORPH_ELLIPSE, Size(3,3));
    morphologyEx(saltpepper_img, dst2, MORPH_CLOSE, element);
    imshow("2단계: 모폴로지 닫힘 연산 적용", dst3);
    
    morphologyEx(dst2, dst3, MORPH_OPEN, element);
    imshow("3단계: 모폴로지 열림 적용", dst4);
    
    erode(dst3, dst4, element);
    imshow("4단계: 침식 적용", dst5);
    
    waitKey(0);
}

 

#include <opencv2 /imgproc.hpp>
#include <opencv2 /highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;

Mat src_gray;
Mat dst, detected_edges; 
int lowThreshold = 50;
int highThreshold = 140;

int main()
{
	Mat src = imread("dog.png", IMREAD_COLOR); 
    if(src.empty())
    {
    	cout << "Could not open or find the image\n" << endl;
        return -1;
    }
    cvtColor(src, src_gray, COLOR_BGR2GRAY);
    blur(src_gray, detected_edges, Size(3, 3));
    Canny(detected_edges, detected_edges, lowThreshold, highThreshold, 3);
    namedWindow("Canny Edge", WINDOW_AUTOSIZE);
    imshow("Canny Edge", detected_edges);
    
    waitKey(0);
    return 0;
}

 

 

#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;


void maded_prewitt(const Mat& image, Mat& result, int thresh) {

	// 수직마스크
	Mat maskX = (Mat_<double>(3, 3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);
	// 수평마스크
	Mat maskY = (Mat_<double>(3, 3) << 1, 1, 1, 0, 0, 0, -1, -1, -1);

	int filterOffset = 3 / 2;

	result = Mat::zeros(image.rows - filterOffset * 2, image.cols - filterOffset * 2, image.type());

	double sumEdgeX;
	double sumEdgeY;
	double magnitude;

	for (int yimage = filterOffset; yimage < image.rows - filterOffset; ++yimage) {
		for (int ximage = filterOffset; ximage < image.cols - filterOffset; ++ximage) {

			sumEdgeX = 0;
			sumEdgeY = 0;
			for (int ymask = -filterOffset; ymask <= filterOffset; ++ymask) {
				for (int xmask = -filterOffset; xmask <= filterOffset; ++xmask) {
					sumEdgeX += image.at<uchar>(yimage + ymask, ximage + xmask) * maskX.at<double>(filterOffset + ymask, filterOffset + xmask);
					sumEdgeY += image.at<uchar>(yimage + ymask, ximage + xmask) * maskY.at<double>(filterOffset + ymask, filterOffset + xmask);
				}
			}
			magnitude = sqrt(pow(sumEdgeY, 2) + pow(sumEdgeX, 2));
			result.at<uchar>(yimage - filterOffset, ximage - filterOffset) = ((magnitude > thresh) ? 255 : 0);
		}
	}

}

void maded_sobel(const Mat& image, Mat& result, int thresh) {

	// 수직마스크
	Mat maskX = (Mat_<double>(3, 3) << -1, 0, 1, -2, 0, 2, -1, 0, 1);
	// 수평마스크
	Mat maskY = (Mat_<double>(3, 3) << 1, 2, 1, 0, 0, 0, -1, -2, -1);

	int filterOffset = 3 / 2;

	result = Mat::zeros(image.rows - filterOffset * 2, image.cols - filterOffset * 2, image.type());

	double sumEdgeX;
	double sumEdgeY;
	double magnitude;

	for (int yimage = filterOffset; yimage < image.rows - filterOffset; ++yimage) {
		for (int ximage = filterOffset; ximage < image.cols - filterOffset; ++ximage) {

			sumEdgeX = 0;
			sumEdgeY = 0;
			for (int ymask = -filterOffset; ymask <= filterOffset; ++ymask) {
				for (int xmask = -filterOffset; xmask <= filterOffset; ++xmask) {
					sumEdgeX += image.at<uchar>(yimage + ymask, ximage + xmask) * maskX.at<double>(filterOffset + ymask, filterOffset + xmask);
					sumEdgeY += image.at<uchar>(yimage + ymask, ximage + xmask) * maskY.at<double>(filterOffset + ymask, filterOffset + xmask);
				}
			}
			magnitude = sqrt(pow(sumEdgeY, 2) + pow(sumEdgeX, 2));
			result.at<uchar>(yimage - filterOffset, ximage - filterOffset) = ((magnitude > thresh) ? 255 : 0);
		}
	}

}

int main()
{
	Mat src, sobel_1;
	Mat grad, prewitt;

	src = imread("dog.png", IMREAD_GRAYSCALE);
	if (src.empty()) { return -1; }

	imshow("Image", src);
	maded_sobel(src, sobel_1, 100);
	imshow("sobel", sobel_1);
	maded_prewitt(src, prewitt, 100);
	imshow("prewitt", prewitt);

	waitKey(0);
	return 0;


}

왼쪽이 소벨 오른쪽이 프리윗 마스크가 적용된 이미지입니다.

 

 

#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;

Mat image, roi;
int mx1, my1, mx2, my2;
bool cropping = false;

void onMouse(int event, int x, int y, int flags, void* param)
{
	if(event == EVENT_LBUTTONDOWN) {
    	mx1 = x;
        my1 = y;
        cropping = true;
    }
    else if(event == EVENT_LBUTTONUP)
    {
    	mx2 = x;
        my2 = y;
        cropping = false;
        rectangle(image, Rect(mx1, my1, mx2 - mx1, my2 - my1), Scalar(0, 255, 0), 2);
        imshow("image", image);
    }
}

int main()
{
	image = imread("dog.png", IMREAD_COLOR);
    Mat clone = image.clone();
    
    if(image.empty())
    	cout << "영상을 읽을 수 없음" << endl;
    imshow("image", image);
    setMouseCallback("image", onMouse);
        
        while(1) {
        	int key = waitKey(100);
            
            if(key == 'q') break;
            else if(key == 'c') {
            roi = clone(Rect(mx1, my1, mx2 - mx1, my2 - my1));
            imshow("press_c", roi);
            }
            else if(key == 's'){
            	resize(image, image, Size(128, 128));
                imshow("image", image);
            }
            eles if(key == 'g') {
            	cvtColor(image, image, COLOR_BGR2GRAY);
                imshow("image", image);
            }
        }
        
        return 0;
 }

 

실행시켰을 경우

 

드래그 하였을 경우

c 클릭시 드래그 영역이 새로운 윈도우 창으로 나타난다.

g를 눌렀을 경우 색상이 컬러에서 흑백으로 바뀐다.

s를 눌렀을 경우 사이즈가 아까 드래그한 사각형의 창보다 작아진 것을 확인할 수 있다. 현재 위의 윈도우 크기는 128*128 이다.

+ Recent posts