파이썬 11

[백준] 4949번 균형잡힌 세상 파이썬 해설

출처 : https://www.acmicpc.net/problem/4949 입사 후 교육을 받는 기간이라 주말에 간간히 한 두 문제 정도 풀 수 있다..ㅜ 심지어 회사와 관련된 내용과 지식은 보안상 조심해야 한다고 하기 때문에 퇴사 전 까지는 알고리즘 문제 풀이 정도나 올릴 것 같다. 오늘은 오랜만에 알고리즘 문제를 풀었기 때문에 다소 쉬운 문제를 선택했다. 문자열을 다루는 문제이며 괄호 찾기와 매우 유사한 문제이기 때문에 자료구조 stack을 이용하면 쉽게 풀 수 있다. 풀이 문제를 정독하고 간단하게 알고리즘을 설계한 뒤 그대로 코드로 구현하였다. 1. 입력을 받는다. 2. 좌측 괄호('(', '[')인지 검사한다. 만약 좌측 괄호라면 스택에 넣어준다. 3. 우측 괄호인지(')', ']') 검사한다. ..

[백준] 1713번 후보 추천하기 파이썬 해설

출처 : https://www.acmicpc.net/problem/1713 코딩 테스트 문제에서 자주 출현하는 구현 알고리즘이다. 보통 1, 2번 문제에 출제되고 긴장하면 말리기 쉬운 문제 유형이니 많이 풀어서 익숙해지는 게 중요한 것 같다. 풀이 보통 구현 문제는 여러가지 조건을 그대로 구현하면 정답을 맞힐 수 있는 구조로 많이 출제된다. 성급하게 접근하기 보단 문제의 조건을 읽어보고 정리한 뒤에 알고리즘을 설계하는 것을 추천한다. 문제의 조건은 다음과 같다. 학생들이 추천을 시작하기 전에 모든 사진틀은 비어있다. 어떤 학생이 특정 학생을 추천하면, 추천받은 학생의 사진이 반드시 사진틀에 게시되어야 한다. 비어있는 사진틀이 없는 경우에는 현재까지 추천받은 횟수가 가장 적은 학생의 사진을 삭제하고, 그 ..

[백준] 7576번 토마토 파이썬 해설 (BFS)

출처 : https://www.acmicpc.net/problem/7576 BFS 알고리즘으로 분류된 문제이다. 코딩 테스트를 통과하기 위해 알고리즘 문제를 많이 풀던 시기에 가장 취약했던 알고리즘의 종류 중 하나이다. 한 번의 시도만에 취업을 성공해서 당분간 코딩 테스트는 치르지 않지만, 약점을 보완하기 위해 내가 약했던 알고리즘을 위주로 문제를 다시 풀어보고 있다. 풀이 처음 이 문제를 접근할 때는 하루가 지날 때 마다 배열의 모든 점을 탐색하는 알고리즘을 설계하고 그대로 구현하였다. 나름 예외처리를 했다고 생각했지만 M과 N이 증가 할 수록 시간 복잡도가 기하급수적으로 늘어났고 결국 시간 초과라는 결과를 받았다. ㅜㅜ 그 후에 파이썬의 dequeue 모듈을 사용해서 좀더 효율적인 알고리즘을 새로 설..

[백준] 1717번 집합의 표현 Python 해설

출처 : https://www.acmicpc.net/problem/1717 1717번: 집합의 표현 첫째 줄에 n(1≤n≤1,000,000), m(1≤m≤100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 a가 포함되어 있는 집합과, b가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 a b의 형태로 입력이 주어진다. 이는 a와 b가 같은 집합에 포함되어 있는지를 확인하는 연산이다. a www.acmicpc.net Disjoint-set 알고리즘으로 분류된 문제이다. N사에 떨어졌다고 생각하고 K사 채용연계형 인턴 정형의 코딩 테스트를 ..

[백준] 11003번 최솟값 찾기 Python 해설

출처 : https://www.acmicpc.net/problem/11003 11003번: 최솟값 찾기 N개의 수 A1, A2, ..., AN과 L이 주어진다. Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 Ai는 무시하고 D를 구해야 한다. www.acmicpc.net 슬라이딩 윈도우 알고리즘으로 분류된 문제이다. 열몇 번의 시도만에 풀었다.. 풀이 - Python 정답 코드 from collections import deque n, l = map(int, input().split()) arr = [*map(int, input().split())] m = deque() for i in range(n): tmp = arr[..

[Python] 멀티 스레드 소켓 서버 구축하기

내가 한 번도 경험하지 못했던 "멀티 스레드 서버 프로그래밍"을 시작하기에 앞서 뼈대가 될 코드를 만들었다. 서버 코드 import socket import argparse import threading import time host = "127.0.0.1" port = 4000 def handle_client(client_socket, addr): print("접속한 클라이언트의 주소 입니다. : ", addr) user = client_socket.recv(1024) string = "안녕하세요? %s 님"%user.decode() client_socket.sendall(string.encode()) print("1초 후 클라이언트가 종료됩니다.") time.sleep(1) client_socket...

[Python] 파이썬 소켓 서버 프로그래밍

나는 개발자가 되기에 아직 많이 부족하다는 것을 느끼고 조금 더 열심히 살기로 다짐했다. 오늘은 파이썬으로 에코 서버를 TCP타입 소켓 통신을 통해 만들었다. 코드와 함께 간단한 주석으로 설명을 대체할 것이다. 사실 진짜 만들고 싶었던 건 내가 계속되는 질문에도 답을 못 했었던 스레드를 이용한 서버이다. 이번 건 맛 보기라는 뜻이다! 서버 코드 import socket host = "127.0.0.1" port = 9123 #IPv4 체계, TCP 타입 소켓 객체를 생성 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #포트를 사용 중 일때 에러를 해결하기 위한 구문 server_socket.setsockopt(socket.SOL_SO..

[Python] 파이썬 eval 과 exec 함수에 대하여

오늘은 편리하면서 위험한 함수인 eval과 exec함수에 대해서 정리해보려고 한다. 두 함수 모두 파이썬 내장 함수이며, 아마 파이썬 언어를 공부하면서 지나가다 한 번쯤 봤을 수도 있다. 왜 편리하면서 위험한지 공부해보자. eval 함수 eval 함수는 실행 가능한 문자열을 매개변수로 입력받아 문자열 자체를 실행한 결과값을 리턴해준다. 설명을 잘 못하니 직접 실행시켜보자. >>>> print(eval("5+5")) 10 파이썬 해석기에서 바로 실행한 결과이다. 문자열 "5+5"를 연산 5+5로 해석한 뒤 결과값으로 정수 10을 반환하는 것을 볼 수 있다. 얼핏 보면 정말 편리한 기능을 가진 함수지만, 남용하면 시스템에 큰 오류를 일으킬 수도 있다. 아래 코드를 실행시켜보자. string2 = ''' a+..

[Python] 파이썬 리스트와 튜플의 차이

파이썬으로 코딩을 하다 보면 튜플(tuple)과 리스트(list)를 혼합해서 사용하곤 했다. 두 클래스에 공통적으로 적용되는 연산들이 많아서 더 혼용했던 것 같다. 오늘은 짧지만 간단하게 두 자료형의 차이점을 알아보려고 한다. 튜플 vs 리스트 실험 두 자료형 모두 정수형이나 문자열 같은 자료형에 상관없이 요소를 가질 수 있고, 둘 다 인덱스 연산자로 접근이 가능하다. 또한 두 자료형 모두 반복문에 사용할 수 있다. list_d = [1,'2',3,'4'] tuple_d = ('1',2,'3',4) print(list_d[0]) print(tuple_d[1]) for i in list_d: print(i) for i in tuple_d: print(i) 나는 두 자료형의 차이점을 append 함수를 사용..

[Python] 파이썬 병렬 프로그래밍 모듈 (Multiprocessing 라이브러리)

졸업작품에 Multiprocessing 라이브러리를 사용할 부분이 생겨서 다시 공부할 겸 정리를 해보려고 한다. Multiprocessing 라이브러리를 공부하기 전 프로세스와 스레드의 개념을 정리하고 공부를 진행하겠다. 프로세스 vs 스레드 운영체제 공부를 하면서 프로세스의 정의는 "실행 중인 프로그램"이라고 했던 기억이 난다. 각 프로세스는 프로세스의 상태를 기록하는 프로세스 제어 블록(PCB - Process Control Block)이 존재하는데, 프로세스가 프로세서에 할당될 때마다 해당 프로세스의 제어 블록들이 먼저 적재된다. 이 과정을 문맥 교환(Context Switch)라고 한다. 스레드의 정의는 "프로그램 내에서 실행되는 흐름의 단위"이다. 한 개의 프로그램을 여러 개의 스레드로 정의할 ..