파이썬 알고리즘 : 아주 평범한 배낭, 행렬 곱셈 순서, 가장 긴 증가하는 부분 수열

2023년 9월 9일 알고리즘 문제풀이 문제 1 백준 12865 문제 링크 1차 시도 나의 생각 입력값을 받을 때 무게 제한보다 무거운 물건은 아예 받지 않도록 조건을 추가한다. 큐를 이용한 최소힙을 통해 물건의 무게와 가치를 원소로 하는 배열에서 무게가 낮은 순서로 하나씩 pop한다. 배낭을 나타내는 배열에 [0,0]을 추가하여 아무것도 없는 상태를 만든다. pop할 때마다 기존 가방에 있는 것에 현재 물건을 더한 것을 추가해준다. 이 방식이면 원소갯수가 2배씩 늘어난다. 비어있는것 1개 => 첫번째 물건 더한것과 안더한것 2개 => 앞의 2개에 각각 두번째 물건을 더한것과 안더한 것 해서 총 4개 => 8개 => … ...

2023년 9월 9일 · 10 분 · 배준수

big-O

5일차 게일 라크만 맥도웰의 코딩 인터뷰 완전 분석 p.59 ~ p. 70 내용 정리 6. big-O big-O 시간은 알고리즘의 효율성을 나타내는 지표 혹은 언어이다. 비유하기 파일을 보낼 때 크기가 작다면 전송하는게 빠르지만 굉장히 크다면 물리적으로 직접 가는게 빠를것.(1테라를 미국에 메일로 보내느니 들고 비행기타고 가는게 낫다!) 시간 복잡도 점근적 실행 시간(asymptotic runtime), 또는 big-O 시간에 대한 개념에 대해 얘기해보자. 데이터 전송 ‘알고리즘’의 실행 시간에서 온라인 전송: O(s), s가 파일의 크기이다. 파일의 크기가 증가함에 따라 전송 시간 또한 선형적으로 증가 비행기 전송: O(1), 파일 크기랑 상관없다. 크든 작든 비행기 한대 가는 시간이니까! O(s)가 커지다 보면 어느 순간 O(1)보다 커지게 된다. O(1)이 얼마든, O(s)가 얼마나 천천히 커지든 언젠가는 무조건! ...

2023년 9월 8일 · 12 분 · 배준수

사용자 식별

책너두 6기 5일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.52 ~ p.64 5일차 03 사용자 및 권한 MySQL에서 사용자 계정을 생성하는 방법이나 각 계정의 권한을 설정하는 방법은 다른 DBMS와 차이 가 있음. MySQL은 ID 뿐 아니라 접속 IP도 확인함. Role로 권한을 묶는 개념이 있음 3.1 사용자 식별 MySQL의 사용자는 계정뿐 아니라 접속 지점(호스트명이나 도메인 또는 IP 주소)도 계정의 일부가 됌. 따라서 계정을 언급할 때 아이디와 호스트를 함께 명시 백슬래시(`)는 식별자를 감싸는 따옴표 역할을 하는데 홑따옴표(’)로 바뀌어서 사용되기도 함 ...

2023년 9월 8일 · 6 분 · 배준수

점진적인 개선(2)

책너두 5기 29일차 로버트 C. 마틴의 클린코드 p. 255~ p.272 내용정리 14. 점진적인 개선 초안 작성 Args.java (Boolean만 지원하는 버전) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 package com.objectmentor.utilities.getopts; import java.util.*; public class Args { private String schema; private String[] args; private boolean valid; private Set<Character> unexpectedArguments = new TreeSet<Character>(); private Map<Character, Boolean> booleanArgs = new HashMap<Character, Boolean>(); private int numberOfArguments = 0; public Args(String schema, String[] args) { this.schema = schema; this.args = args; valid = parse(); } public boolean isValid() { return valid; } private boolean parse() { if (schema.length() == 0 && args.length == 0) return true; parseSchema(); parseArguments(); return unexpectedArguments.size() == 0; } private boolean parseSchema() { for (String element : schema.split(”,”)) { parseSchemaElement(element); } return true; } private void parseSchemaElement(String element) { if (element.length() == 1) { parseBooleanSchemaElement(element); } } private void parseBooleanSchemaElement(String element) { char c = element.charAt(0); if (Character.isLetter(c)) { booleanArgs.put(c, false); } } private boolean parseArguments() { for (String arg : args) parseArgument(arg); return true; } private void parseArgument(String arg) { if (arg.startsWith(”-”)) parseElements(arg); } private void parseElements(String arg) { for (int i = 1; i < arg.length(); i++) parseElement(arg.charAt(i)); } private void parseElement(char argChar) { if (isBoolean(argChar)) { numberOfArguments++; setBooleanArg(argChar, true); } else unexpectedArguments.add(argChar); } private void setBooleanArg(char argChar, boolean value) { booleanArgs.put(argChar, value); } private boolean isBoolean(char argChar) { return booleanArgs.containsKey(argChar); } public int cardinality() { return numberOfArguments; } public String usage() { if (schema.length() > 0) return ”-[“+schema+”]”; else return ””; } public String errorMessage() { if (unexpectedArguments.size() > 0) { return unexpectedArgumentMessage(); } else return ””; } private String unexpectedArgumentMessage() { StringBuffer message = new StringBuffer(“Argument(s) -”); for (char c : unexpectedArguments) { message.append(c); } message.append(“ unexpected.”); return message.toString(); } public boolean getBoolean(char arg) { return booleanArgs.get(arg); } } 가장 초기의 코드. 우선 String 인수 유형을 추가하여 아래 코드가 된다. ...

2023년 9월 8일 · 8 분 · 배준수

파이썬 알고리즘 : 정제헌을 팔자!, LCS, LCS2

2023년 9월 8일 알고리즘 문제풀이 문제 1 백준 9273 문제 링크 1차 시도 나의 생각 결국 두 자연수 a,b에 대하여 1/n = 1/a + 1/b 가 성립해야 한다고 생각했다. 따라서 이 수식을 고쳐서 b = na/(a-n) 으로 만들었다. 이 함수를 a,b 에 대한 함수로 이해해보자. b-n = (n^2)/(a-n). 유리함수중에 분수 함수라고 할 수 있다. 점근선은 x =n, y = n이다. 아래와 같은 함수이다. 이 그래프에서 x,y가 모두 자연수인 함수 위 좌표를 찾았다. x가 0일 때 y가 n이다. x가 1이면 y는 자연수일 수 없다. 따라서 x가 2부터 1씩 증가하다가 y값이 음수면 멈췄다. ...

2023년 9월 8일 · 7 분 · 배준수

my.ini 파일

책너두 6기 4일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.36 ~ p.51 4일차 02 설치와 설정 2.4 서버 설정 MySQL 서버는 일반적으로 단 하나의 설정 파일을 사용하는데 유닉스 계열은 my.cnf, 윈도우 계열에서는 my.ini를 사용한다. mysqld --verbose --help 위 코드는 설치된 mySQL 서버가 어느 디렉토리에서 my.cnf 파일을 읽는지 궁금할 때 실행해 보면 된다. mysqld 프로그램은 MySQL서버의 실행 프로그램을 ㅗ서비스용으로 사용되는 서버에서 이미 MySQL 서버가 실행 중인데 다시 mysqld 프로그램을 시작한다거나 하지 않도록 주의해야한다. ...

2023년 9월 7일 · 8 분 · 배준수

면접 전에 해야할 일

4일차 게일 라크만 맥도웰의 코딩 인터뷰 완전 분석 p.39 ~ p. 58 내용 정리 4. 면접 전에 적절한 경험 쌓기 탄탄한 이력서를 위해 필요하다. 큰 규모의 프로젝트 수업 듣기 인턴 자리 알아보기 무언가 하기 : 개인 프로젝트, 해커톤, 오픈 소스 프로젝트 등 탄탄한 이력서 작성하기 적절한 이력서 길이 너무 길지 않게, 인상적인 항목만 적어 주의를 산만하지 않게 한다. 우선순위를 매겨라. 고용 이력 관련된 고용 이력만 나열하자. 무엇을 구현해서 무엇을 성취했고 무엇을 이루었는지 구체적으로 쓰자. ...

2023년 9월 7일 · 2 분 · 배준수

점진적인 개선(1)

책너두 5기 28일차 로버트 C. 마틴의 클린코드 p. 246~ p.254 내용정리 14. 점진적인 개선 출발은 좋았으나 확장성이 부족했던 모듈을 소개하고, 이를 개선하고 정리하는 단계를 살펴본다. 프로그램을 짜다 보면 내 사정에 딱 맞는 유틸리티가 없어서 직접 짜게 된다. 이를 Args라고 부르겠다. 이 유틸리티는 명령행 인수의 구문을 분석하기 위해 main함수로 넘어오는 문자열 배열을 직접 분석하는 유틸리티다. Args 생성자에 (입력으로 들어온) 인수 문자열과 형식 문자열을 넘겨 Args 인스턴스를 생성한 후 Args 인스턴스에다 인수 값을 질의한다. 다음을 살펴보자 ...

2023년 9월 7일 · 6 분 · 배준수

파이썬 알고리즘 : 피보나치 수 2, 01타일, 동전

2023년 9월 7일 알고리즘 문제풀이 문제 1 백준 2748 문제 링크 1차 시도 나의 생각 기본적인 다이나믹 프로그래밍 문제였다. 재귀를 이용하면 시간초과가 되니 정의한 함수를 저장하는 배열을 만들어서 이를 참조하자. 결과 정답 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import sys n = int(sys.stdin.readline()) dp = [0 for _ in range(n+1)] dp[1] = 1 def fibo(x): if x == 0: return dp[0] elif x == 1: return dp[1] else: if dp[x]: return dp[x] else: dp[x] = fibo(x-1) + fibo(x-2) return dp[x] print(fibo(n)) 문제 2 백준 1904 문제 링크 ...

2023년 9월 7일 · 3 분 · 배준수

동시성(3)

책너두 5기 27일차 로버트 C. 마틴의 클린코드 p. 237~ p.244 내용정리 13.동시성 스레드 코드 테스트하기 지금까지 공부한 것은 스레드가 하나인 프로그램은 지금까지 한 말이 모두 옳다. 하지만 같은 코드와 같은 자원을 사용하는 스레드가 둘 이상으로 늘어나면 다르다. 권장사항: 문제를 노출하는 테스트 케이스를 작성하라. 프로그램 설정과 시스템 설정과 부하를 바꿔가며 자주 돌려라. 실패하면 원인을 추적하라. 스레드가 둘 이상일 때 지침은 다음과 같다. 말이 안 되는 실패는 잠정적인 스레드 문제로 취급하라. 다중 스레드를 고려하지 않은 순차 코드부터 제대로 돌게 만들자. 다중 스레드를 쓰는 코드 부분을 다양한 환경에 쉽게 끼워 넣을 수 있도록 스레드 코드를 구현하라. 다중 스레드를 쓰는 코드 부분을 상황에 맞춰 조정할 수 있게 작성하라. 프로세서 수보다 많은 스레드를 돌려보라. 다른 플랫폼에서 돌려보라. 코드에 보조 코드(instrument)를 넣어 돌려라. 강제로 실패를 일으키게 해보라. 말이 안되는 실패는 잠정적인 스레드 문제로 취급하라 다중 스레드 코드는 아주 드물게 한번씩 나타나서 실패를 재현하기 아주 어렵고 그로 인해 일회성 문제로 치부한다. 그렇게 되면 잘못된 코드위에 코드가 계속 쌓인다. ...

2023년 9월 6일 · 3 분 · 배준수