프로그래밍 30

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

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

[Go] 12. Go(golang)의 메소드(method)

이전 공부에서 golang의 구조체에 대해서 정리를 했었다. 오늘 정리할 내용은 구조체의 메소드에 관한 내용이다. 메소드 객체지향 언어에서 특정 속성들의 기능을 수행하기 위해 만들어진 특별한 함수를 "메소드"라고 한다. Go 언어는 객체지향 언어이지만 필드와 메소드를 묶어서 정의하는 클래스가 없다. Go 언어에서 메소드를 구조체 내부에서 정의하지 않고 구조체 밖에 일반 함수처럼 별도로 선언한다. Go언어의 메소드 Go언어에서 메소드를 선언하는 문법은 일반 함수를 선언하는 문법과 차이가 있다. - 기본 함수 선언 문법 func 함수 이름(매개변수 이름 매개변수형) 반환 형{ ` ` ` - 메소드 선언 문법 func (매개변수이름 구조체 이름) 메소드 이름() 반환형 { ` ` ` 메소드에서도 기본 함수에서..

[백준] 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..

[Go] 10. Go(golang)의 익명 함수(Anonymous function)

이전 공부에서 golang의 함수에 대해서 정리를 했었다. 오늘 정리할 내용은 익명 함수에 관한 내용이다. 파이썬에서 Lambda와 비슷한 맥락이라고 봐도 될 것 같다. Go에서 익명 함수란? 익명 함수는 말 그대로 이름이 없는 함수이다. 함수는 하나의 큰 프로그램을 여러 부분으로 나누고, 여러 상황에서 여러 차례 호출할 수 있으며 일부분을 수정하기 쉽다는 장점을 가진다. 그렇다면 익명함수는 어떤 녀석이고 어떻게 호출할까? 익명함수는 그 자리에서 만들고 바로 그 자리에서 실행할 수 있다는 장점이 있다. 사실 익명 함수의 쓰임새는 말로 설명하는 것보다 직접 상황이 돼봐야 이해할 수 있을 것이다. (링크 - 실제로 내가 파이썬에서 익명 함수를 사용했던 경우이다.) Go에서 익명 함수의 형태는 함수의 이름만 ..

[DB][MySQL] pymysql을 사용하여 파이썬에서 DB 다루기

이번 포스트는 MySQL을 파이썬으로 다루기 위해 기본적인 pymysql 모듈의 사용법에 대해 정리해보려고 한다. pymysql 모듈 설치 pymysql을 모듈을 설치하는 방법이다. 간단하게 파이썬 모듈을 설치하던 방식으로 설치하면 된다. import pymysql connect = pymysql.connect(host='localhost', port=3306, user='root', password='********', db='JOO_DATA', charset='utf8') cursor = connect.cursor() sql = "select * from CS" cursor.execute(sql) print(cursor.fetchall()) 필자는 윈도우에서 docker를 이용해 MySQL환경을 만들..

[Go] 9. Go(golang)의 함수(func)

오늘 정리할 내용은 함수에 관한 내용이다. 특정 기능들을 기능별로 묶어서 구현하기 위해서 함수를 사용한다. 코드의 야이 줄어들고, 가독성도 좋아지고, 재사용 하기도 편리하다. 함수를 자주 호출하면 그만큼 오버헤드가 생긴다는 단점 말고는 사용하지 않을 이유가 없는 것 같다. Go언어의 함수 기본 문법 package main import "fmt" func func_1() { fmt.Println("매개변수와 반환값이 없는 함수를 실행하였습니다.\n") } func main() { func_1() } 매개변수와 반환 값이 없는 가장 기본적인 함수의 형태이다. 다른 언어들과 마찬가지로 가장 기본 문법에 조금씩 추가하면 반환 값과 매개변수를 갖는 함수를 선언할 수 있다. 여러 가지 변형된 함수를 정리한 코드를 ..

[C] C언어의 Stack_Frame

오늘은 스택 프레임에 대해 공부했다. 사실 이해하는데 정말 많은 시간이 걸렸는데 막상 공부하고 보니 그렇게 어려운 개념은 아닌 것 같다. 시작하기 전에.. 비주얼 스튜디오 2019를 통해 결과를 확인해보려 했는데, 디버그 옵션도 변경하고, 최적화 설정도 "사용 안 함"으로 바꿔줬는데 스택과 스택 사이에 예상하지 못한(?) 값이 계속 들어가서 아직도 실습을 못해보고 있다..ㅜ 제대로 된 설정을 찾게 되면 꼭 직접 테스트해보고 싶다. 아니면 우분투에서 GDB를 써서라도 꼭 확인해 볼 것이다. 스택 프레임 스택 프레임을 한 줄로 요약하자면, "함수 a가 호출되었을 때 그 함수가 가지는 공간(공간의 구조)"이다. 스택 영역을 함수가 어떻게 사용하는지 천천히 공부해보자. #include void func_a() ..

Computer_Language/C 2019.10.15

[Go] 8. Go(golang)의 맵(map)

오늘 정리할 내용은 맵(map)에 대한 내용이다. 맵은 슬라이스와 마찬가지로 참조 타입이다. 문법도 슬라이스와 유사하여 쉽게 공부할 수 있었다. Go언어의 맵 기본 문법 Go언어의 맵은 Python언어의 딕셔너리와 매우 유사하다. nil map이라는 개념이 있다는 것이 유일한 차이점인 것 같다. 코드를 통해 nil map을 선언해보고, 선언과 동시에 초기화도 해보자. package main import "fmt" func main() { var dict1 map[string]string if dict1 == nil { fmt.Println("this is nil map") } dict2 := map[string]string{ "name": "주성민", "age": "25", "birth": "950906..