파이썬 알고리즘 : 요세푸스 문제, 30번

2023년 8월 19일 알고리즘 문제풀이 문제 1 백준 1158 문제 링크 1차 시도 나의 생각 요세푸스 문제. deque을 사용해 왼쪽에서 하나씩 꺼내면서 K번째에는 다시 오른쪽으로 넣어주지 않고 정답을 위한 배열에 추가했다. 몇번째인지는 loop가 반복될 떄마다 1씩 더해주고 K로 나눈 나머지를 통해 표시했다. 결과 정답 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import sys from collections import deque n,k = map(int,sys.stdin.readline().split()) arr = deque() for i in range(1,n+1): arr.append(str(i)) ans = [] cnt = 0 while arr: tmp = arr.popleft() cnt += 1 if cnt%k: arr.append(tmp) else: ans.append(tmp) ans = ', '.join(ans) print('<',ans,'>',sep='') 문제 2 백준 13116 문제 링크 ...

2023년 8월 19일 · 4 분 · 배준수

경계(2)

책너두 5기 17일차 로버트 C. 마틴의 클린코드 p.151 ~ p.160 내용 정리 8. 경계 깨끗한 경계 통제하지 못하는 코드를 사용할 때는 과투자나 향후 변경 비용의 과대화를 주의해야 한다. 통제 불가능한 외부 패키지보다 통제 가능한 우리 코드에 의존하는 것이 좋다. 9.단위 테스트 과거의 단위 테스트는 자기 프로그램이 ‘돌아간다’는 사실만 확인하는 일회성 코드였다. TDD 법칙 세가지 첫째 법칙 : 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 둘째 법칙 : 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. ...

2023년 8월 18일 · 2 분 · 배준수

파이썬 알고리즘 : N과 M (4), 최솟값과 최댓값

2023년 8월 18일 알고리즘 문제풀이 문제 1 백준 15652 문제 링크 1차 시도 나의 생각 처음엔 조합(combination)을 이용해야하나 생각했다. 하지만 문제가 수를 구하는게 아니라 모든 결과를 출력해야 하기 때문에 조합은 의미가 없을 것이라 생각했다. 어떻게 해야할까 고민하다가 모든 경우를 탐색해야하니 dfs로 풀면 좋겠다는 생각을 했다. 실마리를 찾으니 푸는건 쉬웠다. 결과 정답 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import sys sys.setrecursionlimit(10**6) n, m = map(int, sys.stdin.readline().split()) arr = [i for i in range(n+1)] def dfs(x, tmp): if len(tmp) == m: print(*tmp) return for i in range(x,n+1): tmp.append(i) dfs(i,tmp) tmp.pop() for i in range(1, n+1): tmp = [] tmp.append(i) dfs(i, tmp) 문제 2 백준 2357 문제 링크 ...

2023년 8월 18일 · 5 분 · 배준수

경계

책너두 5기 16일차 로버트 C. 마틴의 클린코드 p.142 ~ p.150 내용 정리 8. 경계 패키지나 오픈 소스를 사용할 때, 외부 코드를 우리 코드에 깔끔하게 통합해야 한다. 이를 위해 소프트웨어 경계를 깔끔하게 처리해야 한다. 외부 코드 사용하기 인터페이스 제공자는 많은 고객이 사용하길 바라기 때문에 적용성을 넓히지만, 사용자는 자신의 니즈에 집중하는 인터페이스를 바란다. 이 사이에서 문제가 발생한다. 예시 : java.util.Map 사용자는 마음만 먹으면 어떤 객체 유형도 추가할 수 있다. 아래처럼 Sensor라는 객체를 담는 Map을 만든다. ...

2023년 8월 17일 · 3 분 · 배준수

파이썬 알고리즘 : 올바른 괄호, 디스크 컨트롤러, 피보나치 함수

2023년 8월 17일 알고리즘 문제풀이 문제 1 올바른 괄호 문제 링크 1차 시도 나의 생각 문자열을 앞부터 한글자씩 스택에 넣는다. 여는 괄호’(‘는 무조건 넣고, 닫는 괄호’)‘는 경우가 나누어진다. 스택에 마지막으로 들어가있는 원소가 여는 괄호면 합쳐서 올바른 괄호니 마지막에 들어간것을 pop해준다. 스택이 비어있으면 올바른 괄호가 아니라는 의미이다. 단어의 모든 글자를 순회했는데 아직 스택에 괄호가 남아있다면 올바르지 못한 괄호이다. 결과 정답 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from collections import deque def solution(s): answer = True arr = list(s) q = deque() for i in range(len(s)): if arr[i] == '(': q.append(arr[i]) else: if not q or q[-1] != '(': return False elif q[-1] == '(': q.pop() continue if q: return False else: return answer 문제 2 디스크 컨트롤러 문제 링크 ...

2023년 8월 17일 · 3 분 · 배준수

오류 처리

책너두 5기 15일차 로버트 C. 마틴의 클린코드 p.132 ~ p.141 내용 정리 7. 오류 처리 Try-Catch-Finally 문부터 작성하라 예시 : 파일이 없으면 예외를 던지는지 알아보는 단위 테스트. 1 2 3 4 @Test(expeccted = StroageException.class) public void retrieveSectionShouldThrowOnInvalidFileName() { sectionStore.retrieveSection("invalid - file"); } 위 단위 테스트에 맞춰 다음 코드를 구현 1 2 3 4 public List<RecordedGrip> retrieveSection(String sectionName) { // 실제로 구현할 때까지 비어 있는 더미를 반환한다. return new ArrayList<RecordedGrip>(); } 위 코드는 예외를 던지지 않으므로 테스트는 실패. 코드를 변경한다. ...

2023년 8월 16일 · 3 분 · 배준수

객체와 자료 구조

책너두 5기 14일차 로버트 C. 마틴의 클린코드 p.123 ~ p.131 내용 정리 6. 객체와 자료 구조 디미터 법칙 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙. 즉, 객체는 조회 함수로 내부 구조를 공개하면 안된다. final String outputDir = ctxt.getoptions().getScratchDir().getAbsolutePath(); 위 코드는 디미터 법칙을 어겼다. 각 함수가 반환하는 객체의 함수를 호출하기 때문이다. 기차 충돌 위와 같은 코드를 기차 충돌(train wreck)으로 부른다. 길게 이어진 기차같은 이 코드는 다음과 같이 수정할 수 있다. ...

2023년 8월 15일 · 2 분 · 배준수

파이썬 알고리즘 : 숨바꼭질, 비밀번호, 등산

2023년 8월 15일 알고리즘 문제풀이 문제 1 백준 1697 문제 링크 1차 시도 나의 생각 처음엔 재귀나 피보나치 등 여러 방법을 고민했다. 결국 다이나믹 프로그래밍으로 푸는게 적절하다고 생각했다. 맨처음 n에서 1초후 갈 수 있는 곳은 2n, n+1, n-1 이다. 이들을 큐에 저장하고 이들까지 도달하는데 걸린 시간도 같이 저장한다. 이 큐에서 하나씩 순회하며 2배한 좌표, +1, -1 한 좌표에 시간을 업데이트하고 큐에 다시 저장하는 것을 반복했다. 하지만 예시를 입력하면 올바른 정답이 나오지 않았다. 디버깅해봐야겠다. ...

2023년 8월 15일 · 10 분 · 배준수

4. 분할정복

4.분할정복 4.3 점화식을 풀기 위한 치환 치환(Substitution)법 : 귀납 가정을 더 작은 문제에 적용할 때 추측한 해로 치환한다. 해의 모양을 추측한다. 상수들의 값을 찾아내기 위해 수학적 귀납법을 사용하고 그 해가 제대로 동작함을 보인다. 이 책에서는 결과로 나올 해의 모양을 추측하여 치환하는 것에 대한 설명이 많다. 하지만 실제로 양 변에서 공통된 모양을 추출하여 새로운 수열로 치환함으로서 풀 수 있는 점화식 이많다. 예시

2023년 8월 14일 · 1 분 · 배준수

형식 맞추기(3)

책너두 5기 13일차 로버트 C. 마틴의 클린코드 p.111 ~ p.122 내용 정리 5. 형식 맞추기 들여쓰기 계층에서 각 수준은 이름을 선언하는 범위이자 선언문과 실행문을 해석하는 범위이다. 들여쓰는 정도는 계층에서 코드가 자리잡은 수준에 비례한다. 들여쓰기한 파일은 구조가 한눈에 들어온다. 변수, 생성자 함수, 접근자 함수, 메서드가 금방 보인다. 들여쓰기 무시하기 한 행에 범위를 뭉뜽그린 코드를 피해야 한다. 간단한 if 문, 짧은 while 문 등에서도 마찬가지. 가짜 범위 빈 while문이나 for문은 피해야 한다. 필요하다면 빈 블록을 올바로 들여쓰고 괄호로 감싸야 한다. ...

2023년 8월 14일 · 2 분 · 배준수