목록분류 전체보기 (139)
배고픈 개발자 이야기
def solution(k, room_number): ret = [] rooms = dict() for i in room_number: reserve = i while True: if reserve in rooms: reserve += 1 else: rooms[reserve] = 1 ret.append(reserve) break return ret 풀이 1. 방번호 리스트를 생성한 후 원하는 방이 있으면 방을 주고 리스트에서 지워준다. 2. 방이 없을시 남은 방중에서 원하는 방보다 큰번호의 방을 주고 마찬가지로 리스트에서 지워준다. 위의 풀이법은 정확성은 100%지만 효율성은 다 실패했다. 다른사람이 푼걸 보고, 다시 풀어보자. 다른사람의 풀이 재귀로 푸는 방법과 재귀를 루프로 풀어 푸는 방법이 있다. ..
def nCr(temp, number, matched_group): global result if len(temp) == len(matched_group): temp = set(temp) if temp not in result: result.append(temp) return else: for j in range(len(matched_group[number])): if matched_group[number][j] not in temp: temp.append(matched_group[number][j]) nCr(temp, number+1, matched_group) temp.pop() result = [] def solution(user_id, banned_id): global result matched_..
import re def solution(s): tmp, answer = [], [] for x in s.split("}"): elem = list(map(int, re.findall('\d+', x))) if elem != []: tmp.append(elem) tmp.sort(key=lambda x : len(x)) for x in tmp: for y in x: if y not in answer: answer.append(y) return answer 풀이 input으로 주어진 집합이 표현하는 튜플을 구하는 문제로 설명과 예제를 보고 규칙을 이해하였다. 1. 주어진 문자열을 원소단위로 잘라주기 위해 "}"로 나누었고, 원소를 다시 정수리스트로 변환하여 저장하였다. 2. 원소의 크기순서로 정렬한 후 튜플..
def solution(board, moves): tmp, answer = [], 0 while len(moves): for i in range(len(board)): if board[i][moves[0]-1] != 0: # 인형이 있는 경우 tmp.append(board[i][moves[0]-1]) board[i][moves[0]-1] = 0 moves.remove(moves[0]) break elif i == len(board)-1: moves.remove(moves[0]) # 인형이 없는 경우 if tmp == []: return 0 while True: before = answer for i, _ in enumerate(tmp[:len(tmp)-1]): if tmp[i] == tmp[i+1]: d..
윈도우 프로시져(Window Procedure)를 뜻하며, WinMain 함수와는 별도로 메시지가 발생할 때 프로그램의 반응을 처리하는 일을 담당한다. WinMain내의 메시지 루프는 메시지를 메시지 처리 함수로 보내주기만 할 뿐이며, WndProc은 메시지가 입력되면 윈도우즈에 의해 호출되어 메시지를 처리한다. 그러므로 WndProc은 WinMain에서 호출되지 않고 윈도우즈에 의해 호출되고, 이러한 운영체제에서 호출되는 프로그램 내부의 함수를 콜백(CALLBACK)함수라고 한다. WndProc의 인수는 모두 4개이며 MSG 구조체의 멤버 4개와 동일하다. LRESULT CALLBACK wndproc(HWND handle, UINT message, WPARAM w_param, LPARAM l_param..
프로그래머라면 한번쯤은 들어봤을 것이다. 뮤텍스 / 세마포어 / 데드락등이 있다. 그냥 설명만으로는 이해하기가 어려워서 보통 화장실에 많이 비유를 한다.. Mutex는 화장실에서 한줄로 줄을 서서 기다리는 거고, Semapore는 여러줄로 서서 기다리는거야라고 해서 아.. 그럼 Semapore가 효율적이겠네?? 라고 이해했지만 그것은 오산이었다. 비유적으로 이해하는것에는 한계가 있다. 테스트가 아닌 실질적인 코드로 보니 확실히 이해되는 부분이 있었다. 우선 변기통의 개수는 스레드의 개수를 의미한다는것이다. 그리고 줄서서 기다리는것은 lock을 걸려고하는자 예를들면 client와 같은 개념이고 스레드를 가진 친구는 server라고 이해하면 편하다.. 왜냐하면 client가 보통 서버에 요청을 하니까 C++..
MFC에서 문자열을 사용하면 CString, LPSTR, LPCSTR, LPCTSTR, LPCWSTR처럼 다양한 자료형이 있다. C언어를 쓸때는 String또는 char*만 쓰다가 MFC로 넘어오니 이상한 변수들이 있다. 개발을 하려면 저게 어떤건지 좀 명확하게 확인하고 넘어가고 싶어 풀네임부터 알아보았다. CString = LPCTSTR = const t_char* LPSTR = Long Pointer String = char* LPCSTR = Long Pointer Constant String = const char* LPCTSTR = Long Pointer Constant T_String = const t_char* LPCWSTR = Long Pointer Constant Wide String = ..
신입개발자로 입사해서 현업으로 개발하다보면, 여러가지 문제에 직면하게 된다. 오늘은 만났던 문제들 중에 꼭 고쳐야겠다는 생각이 들었던 점들을 나열해 보려고 한다. 1. 시나리오 이해 코딩을 어느정도 하면서부터 시나리오 이해의 중요성에 대해 생각해보게 됬다. 팀단위로 보통 개발을 하게 되면 다른 곳은 잘 모르겠지만, 보통 역할이 나누어져 있고, 업무를 분할하여 진행한다. 물론 기업 규모나 조직 특성 및 개인 기량에 따라, 감당하는 수준이 다를 수 있다고 생각한다. 처음 프로젝트를 시작하면 필요성에 따라 시나리오를 구성하기 마련이다. 모든 팀원이 시나리오 구성을 함께 한다면 문제가 없겠지만, 시나리오를 전달 받는 개발자가 시나리오의 목적과 내용을 컴팩트하게 이해하지 못하는 경우 문제가 발생한다. 본인은 이해..