본문 바로가기
728x90
반응형

python81

[자료구조 with Python] 14. 정렬 알고리즘(7), 쉘 정렬(Shell Sort) 사실, 오늘 포스팅으로 다룰 쉘 정렬은 지난 포스팅에서 언급한 퀵 정렬 이전, 그러니까 삽입 정렬 바로 이후에 다루어야 했던 포스팅이다. 그럼에도 불구하고 지금에서야 쉘 정렬(Shell Sort)에 대해 이제야 다루게 된 것은... 엊그제 무렵 쉘 정렬에 대해 알게 되어서다... (포스팅 구성 다 꼬이네..) 1. 쉘 정렬(Shell Sort) 개요 쉘 정렬은 삽입 정렬과 연관이 있다고 필자가 위에서 힌트처럼 언급을 했으니, 다시 삽입 정렬을 살펴보자. 삽입 정렬은 좌측 또는 우측 끝단에 위치한 원소를 제외한 나머지 원소 중 하나를 선택한 뒤, 극값과의 크기 비교를 통해 자리 교체를 진행하는 정렬 방식이다. 그런데 원소의 교대 방식이 버블 정렬과 상당히 유사하기 때문에, 특수한 상태의 배열 정렬를 진행함.. 2024. 3. 18.
[자료구조 with Python] 13. 정렬 알고리즘(6), 퀵 정렬(Quick Sort) 선형 자료 구조 내에 저장된 데이터를 빠르게 정렬하는 방법의 두 번 째 포스팅이다. 지난 번에는 병합 정렬 과정을 구현하고 실행함으로써 중첩 Loop 문으로 진행하는 정렬 알고리즘보다 빠른 정렬이 가능함을 알아보았다. 이번에는 퀵 정렬(Quick Sort)이라고 하는, 이름만 들어도 무진장 빠를 듯한 정렬에 대한 내용이다. 1. 퀵 정렬 (Quick Sort) 퀵 정렬은 의외로 개념은 단순하다(구현은 생각보다 머리가 아프다). 먼저 배열 내 가운데에 위치한 값을 하나 지정한다. 이 값을 Pivot - 농구를 하셨던 분들이라면 익숙할 - 이라고 하는데, 말 그대로 배열 내 원소를 교대하는 일종의 축 또는 기준점을 말한다. 8, 4, 2, 5, 1, 3, 7 -> Pivot으로 배열 한 가운데에 위치한 5를.. 2024. 3. 15.
[자료구조 with Python] 12 - 정렬 알고리즘(5), 병합 정렬(Merge Sort) 선형 자료의 정렬과 관련된 내용을 지난 4개의 포스팅을 통해 살펴보았다. 조금만 정리를 하고 넘어가자면, 각각 버블, 삽입, 선택 정렬에 대한 내용이었으며 이들은 모두 중첩된 Loop 문을 사용하기에 시간 복잡도가 BigO(N^2)으로 나타난다. 그럼, 이런 의문이 들 수 밖에 없다. "선형 자료를 정렬하는 더 빠른 방법은 없는 것일까요?" 왜 없을까. 머리 좋은 선구자들은 이미 자기들도 문제를 인지하고 머리 싸맸던 역사가 있다. 선형 정렬을 빠르게 할 수 있는 방법으로는 병합 정렬, 퀵 정렬, 쉘 정렬 등이 있는데, 그 중에 오늘은 병합 정렬(Merge Sort)라고 불리는 알고리즘에 대해 정리하려한다. 1. 병합 정렬(Merge Sort)의 개요 이름이 참 요상하다. 분명 정렬해야하는 배열은 하나인데.. 2024. 3. 13.
[자료구조 with Python] 11 - 정렬 알고리즘(4), 선택 정렬(Selection Sort) 이번 포스팅은 정렬 알고리즘의 하나인 선택 정렬(Selection Sort)에 대한 내용이다. 지난 포스팅에서 살펴본 삽입 정렬과 매우 유사한 형태로 동작하는 코드이나, 처음 코드를 구현하는 단계라면 삽입 정렬보다 오히려 쉽다(삽입 정렬은 필자가 빠가라 이해를 잘못한 거고..). 바로 시작해보자. 1. 선택 정렬의 개요 선택 정렬은 삽입 정렬과 유사하다. 삽입 정렬처럼 원소 하나를 선택하고, 최소값을 판별하는 경우 자신의 왼쪽, 그렇지 않은 경우 자신의 오른쪽의 원소와 비교하는 것은 동일하다(오름차순을 기준으로). 다만 삽입 정렬과 큰 차이점이 있다면, 삽입 정렬은 선택하는 원소를 배열의 index 순서로 진행하나, 선택 정렬은 최소값을 선택한다는 차이점이 하나 있고, 선택한 값을 버블 정렬로 이동시키는.. 2024. 3. 12.
[자료구조 with Python] 9. 정렬 알고리즘(2) - 버블 정렬과 Shaker 정렬 지난 포스팅에서 구현한 버블 정렬 코드로 데이터를 돌려본 결과, 일부 배열을 정렬할 때, 버블 정렬 Loop가 완전히 종료되지 않았음에도 이미 배열 정렬이 완료된 케이스에 대해 마지막에 소개를 잠깐 했었다. 버블 정렬을 위해 Loop를 도는 와중에 정렬이 완료되어버리면, 사실 그 이후에는 배열을 돌면서 비교를 하는 행위가 무의미해진다. 즉, 컴퓨터한테 쓸데없는 일을 시키는 것이다. 그럼, 어느정도 정렬이 된 배열을 조금 더 빠르게 수행하도록 만들 방법은 없을까? 이번 포스팅에서는 일반 버블 정렬의 개선 방안과 쉐이커 버블 정렬에 대해 알아보려 한다. 1. 일반 버블 정렬의 개선 방안 일반 버블 정렬의 코드를 보자. 잘 보면 while 조건문은 무조건 비교해야하는 배열의 크기가 2가 될 때까지 버블 정렬을.. 2024. 3. 8.
[자료구조 with Python] 8. 정렬 알고리즘(1) - 버블 정렬 개요 원래, Stack과 Queue에 대한 내용으로 이번 포스팅을 작성하려다, 정렬과 관련된 내용을 한 번 포스팅하고 넘어가야 할 듯 해서 급히 지난 포스팅의 뒷 부분을 수정했다. 사실 Stack과 Queue야 선형 구조인 배열의 파생 개념이라 크게 어렵지 않기 때문에 지금 포스팅으로 다루지 않는다고 크게 문제가 될 것도 아니다. 정렬의 경우에는 조금 이야기가 다르다. 정렬의 경우에는 프로그래밍을 하다보면 다루어야하는 데이터 셋이 무조건 발생하기 때문에, 조금이라도 더 효율적인 프로그램을 만들려면 다량의 데이터를 어떠한 규칙을 적용해 효과적으로 정렬할 수 있을지 계속 고민할 수 밖에 없다. 선형 자료구조의 정렬 알고리즘은 버블 정렬, 선택 정렬, 삽입 정렬, 힙 정렬 등등등 무수히 많다. 그 중에서도 앞으로 .. 2024. 3. 7.
[자료구조 with Python] 7. 선형 자료 구조 - 배열(6), Hash 충돌과 개방 주소법(Open Address) 자료 구조 마지막 포스팅이 언제였더라...(뒤적뒤적) 세상에... 3년 전이 마지막 자료구조 포스팅이었다. 필자가 최근 밀린 포스팅들을 몰아서 작성하다보니, 놓치고 있던 카테고리들이 상당히 많은데, 최근에 자료 구조 서적을 다시 뒤적거릴 일이 생긴 참에 이 카테고리를 방문(?)하게 되었다. 하여간, 마지막 자료구조 포스팅의 내용은 Hash 충돌을 해결하는 방법 중 하나인 Chaining이었는데, 이번 포스팅에서는 Hash 충돌을 피하는 또 다른 방법인 개방 주소법(Open Address)에 대해 알아보려한다. 1. Open Address 개요 Hash값의 충돌로 Hash List의 동일 Bucket(index라고 생각하자)에 둘 이상의 자료가 저장되는 경우, Hash 충돌이 일어났다고 말한다. 아무래도 .. 2024. 3. 5.
10. Python - Lamdba의 활용 되도 않는 망상에 빠져 Python으로 "이런 기능 한 번 만들어봐야지" 하면서 지낸 것이 벌써 5년이 되었다. 물론 필자 나름대로 아직까지 잘 쓰고 있는 프로그램도 있긴 하지만 99%가 업무로 바빠서(핑계가 아니다. 진짜...) 엎어진 것들이 많다. 그런데, 최근 어떠한 이유로 갑자기 옛 코드들을 들여다보다가, 공통적으로 개선이 필요한 사항이 필자의 눈에 많이 띄인다. 오늘 다루어 볼 내용은 지금까지 필자의 능력 부족으로 잘 사용하지 못했던 Lambda 함수다. 1. Lambda 식 아래와 같은 상황을 가정해보자. List형 데이터 변수가 있고, 여기에는 5명의 학생의 '국어', '영어', '수학', '프로그래밍' 점수가 Tuple 형태로 저장되어 있다고 가정해보자. 아래와 같은 형태로 나타날 것이다... 2024. 2. 19.
17. [Python] firewall-cmd rich rule 제어 오류 * Error: Python subprocess로 firewall-cmd rich rule 제어 시 오류 발생(Error: INVALID_RULE: internal error in _lexer():) * Environment: CentOS8, Python 3.11 최근 말단의 Linux 방화벽에 차단 정책을 자동으로 생성하는 시스템을 개인 프로젝트로 진행하고 있다.사실, 이전에 Bash로만 작성한 스크립트가 있는데, 외근 갔다가 올라오는 기차 안에서 심심한 김에 만든 것인데다 실시간 적용 기능도 없고, 무엇보다도 현재는 거의 사양된 iptables에 적용된 스크립트였기 때문에 언젠가 한 번 개선을 해야겠다고 마음먹고있던 참이었다. 최근에는 필자도 회사 일에만 파묻혀있기 싫어 일부러 개인 프로젝트에 비중을.. 2023. 9. 6.
9. Python - 자꾸 까먹어서 기록하는 Json, Yaml 파일 읽기/쓰기 Python이 주력 언어다 보니, 업무 상으로도 왠만한 프로그램은 Python으로 개발하고 있는 중이다. 그러다보니, 필자가 자주 사용하는 코드는 개인 라이브러리 형태로 만들어 사용하고 있는데, 이 업계가 항상 그러하듯이 개발은 갑작스럽게, 급하게 진행되어야 하다보니 라이브러리 상에서도 개판 5분전인 코드들이 많이 나온다. 그래서 요즘 아예 필자의 개인 프로젝트용으로 라이브러리를 다시 만들고 있는 상태인데, 맨날 라이브러리를 통해 설정 파일들을 불러오다보니, 설정 파일의 주 단골 손님인 Json과 Yaml을 읽고 불러들이는 방법을 완전히 잊은 상태가 되었다... 이번 포스팅에서는 Json, Yaml의 읽기와 쓰기에 대해 간략히 정리하려 한다. 1. Json, Yaml 파일 RW 패키지 Json과 Yaml.. 2023. 8. 11.
[Python tkinter] 10. Text 위젯 생성 Text 위젯은 한 줄 이상의 글자를 작성할 수 있는 위젯이다. 의외로 굉장히 광범위하게 볼 수 있는 위젯인데, 윈도우의 기본 프로그램인 메모장이나, 인터넷 카페나 블로그의 댓글 입력창 등을 Text 위젯의 예로 들 수 있다. 기능 자체가 워낙 단순한 위젯이기 때문에, 생성과 배치는 크게 어렵지는 않다. 속성이 조금 많아서 문제긴 하다만 말이다. 바로 시작해보자. 1. Text() 클래스 Text() 클래스의 선언은 아래의 포맷으로 진행한다. Text 위젯 변수명 = tkinter.Text(master=Text 위젯을 배치할 창 객체명) 다른 클래스들과 달리, master 속성으로 배치할 창이나 프레임 등만 지정해주면 위젯 생성이 끝난다. 기타 위젯 속성은 아래의 표를 참고하도록 하자. 필수 속성(인자).. 2022. 3. 10.
[Python tkinter] 9. Checkbutton 위젯 생성 및 목록 생성 이번 포스팅에서는 tkinter의 Checkbutton에 대해 알아보려 한다. Checkbutton은 항목 앞에 선택/해제가 가능한 네모 모양의 버튼이 존재하는 위젯이며, 해당 항목의 활성화/비활성화 여부를 설정해야하는 내용이 필요한 경우 주로 사용된다. 1. Checkbutton() 클래스 Checkbutton의 생성은 일반적인 상황이라면 아래의 포맷으로 진행한다. Checkbutton 위젯 변수명 = tkinter.Checkbutton(master=위젯을 배치할 창 객체명, text="checkbutton 항목", onvalue="Checkbutton 선택 시 반환값 지정", offvalue="Checkbutton 해제 시 반환값 지정, variable=Checkbutton을 그룹화 할 tkinter.. 2022. 3. 9.
728x90
반응형