Programming 79

from pathlib import Path

파이썬에서 경로를 다룰 때 단순한 string으로 다룰 수도 있지만, Path 오브젝트를 사용하는 게 더 효율적이고, 코딩 실수를 방지할 수 있다.from pathlib import Path  1. path 연결예를 들어, 'dataset'이라는 path와, 그 안에 'audio'라는 path에 관한 변수를 두어야 한다고 생각해보자.이 경우 아래와 같이 '/'로 연결하면dataset_dir = Path('dataset')audio_dir = dataset_dir / 'audio' 이렇게 매우 직관적으로 처리할 수 있다.2. directory 내에 존재하는 파일명 list 구하기Path의 method인 glob에 구하고자 하는 파일에 관한 pattern을 주어서 특정한 조건을 만족하는 파일이름의 list를..

Programming 2024.05.13

CRC에서 detect 불가한 burst error

CRC의 divisor는 가장 좋은 퍼포먼스가 나오는 형태인, x^0 term과 x^n term을 가진 꼴이라고 가정하자. (e.g. x^n + 1)이때 divisor는 n+1개의 bit로 이루어져 있다Performance of CRC발생한 burst error가 divisor로 나누어떨어지는 경우 detect 불가하다.이것이 발생할 확률을 burst error의 크기에 따라 구해보자.burst error의 크기는, 발생한 error의 width가 총 몇 개의 bit로 이루어져 있는지를 의미한다.따라서 burst error 크기가 k라는 것은 그것을 이루는 k개의 bit 중 첫 번째와 k번째의 값은 1임을 내포한다.(burst error에서 특정 bit가 1이라는 것은 해당 bit에 에러가 발생했다는 것..

Programming 2024.05.11

mB/nB 인코딩에서 사용할 수 있는 codeword 개수

mB/nB 인코딩(일반적으로 n = m + 1)에서는 dataword를 codeword로 인코딩할 때 연속적으로 등장하는 0의 개수가 m 미만이 되는 것을 목표한다. (self-synchronization 위함)4B/5B 인코딩에서 사용할 수 있는 codeward를 구하는 방식으로, 앞의 2bit와 뒤의 3bit에 1이 최소한 하나 있어야 한다고 배웠다. 그러면 codeword 내부에서도 연속된 0이 4개 이상 등장하지 않고, 두 codeword를 이어붙일 때 하나의 codeword의 뒷부분과 다른 것의 앞부분이 concatenate 됨에 따라 발생하는 연속되는 0의 개수도 4개 이상이 되지 않는다. (ex. 01100을 두 개 이어 붙이면 0110001100이고 가운데 연속적으로 생기는 0이 3개이므로..

Programming 2024.04.21

tqdm(df.iterrows())

관련 글: https://www.minigb.io/295 tqdm(zip( for id, audio_path in tqdm(zip(id_list, audio_path_list)): ... 1. zip generator는 list가 하나라도 끝나면 그대로 종료한다. 만약 list의 길이가 다르면 그중에서 가장 짧은 길이만큼 iterate 하기 때문에 그 전에 두 lis www.minigb.io for idx, row in tqdm(df.iterrows()): ... pandas.DataFrame의 row를 iterate 할 때 tqdm으로 진행률을 보고 싶은 당신 막대가 보이지 않아서 당황스러우셨다고요? 괜찮아요! 우리에겐 'total'이 있으니까요! for idx, row in tqdm(df.iterro..

Programming 2024.03.22

Tail Recursion - F#에서는 recursion이 loop을 대체한다. (2)

이전 글: https://www.minigb.io/304 F#에서는 recursion이 loop을 대체한다. F#에서는 recursive function이 while과 for과 같은 loop을 대체 한다고 하셨다. 예전에 강의했을 때 누군가가 recursive function을 사용하는 것과 loop을 사용하는 것의 차이를 물어봤던 게 어렴풋이 생각났다. www.minigb.io 고수의 도움을 받았다. 🤩 감사합니다! Tail recursion에 관해 알아보았다. 아래는 챗지피티와의 대화에서 얻은 내용들입니다. Tail Recursion Tail recursion is a special case of recursion where the recursive call is the last operation i..

Programming 2024.03.19

F#에서는 recursion이 loop을 대체한다.

F#에서는 recursive function이 while과 for과 같은 loop을 대체 한다고 하셨다. 예전에 강의했을 때 누군가가 recursive function을 사용하는 것과 loop을 사용하는 것의 차이를 물어봤던 게 어렴풋이 생각났다. 내가 제시한 코드가 loop으로도 할 수 있는 거였는데 굳이 recursive function을 써야 하는지 같은 거였다. 나는 함수에서 recursive 하게 한 번 호출하는 건 loop으로 바꿀 수 있고, 지금이 그런 경우지만, 예를 들어 merge sort처럼 recursive 한 호출을 두 번 이상 해야 하는 경우는 loop으로 해결할 수 없다는 식으로 대답했던 거 같았다. 그러다가 봄 초급 divide & conquer 강의할 때 맨 마지막에 했던 말..

Programming 2024.03.15

[BOJ 24553] 팰린드롬 게임

https://www.acmicpc.net/problem/24553 24553번: 팰린드롬 게임 각 게임에서 상윤이가 이긴다면 0, 승우가 이긴다면 1을 출력한다. www.acmicpc.net 오늘 (24년 1월 16일) 영어 스터디에서 풀었던 문제 게임이론은 늘 어렵다. 그래서 optimal 한 게 뭔데? 처음 나온 솔루션은 dp 테이블을 만들어서 dp[n][k] (k = 0, 1)을 돌이 n개 남았을 때 k가 이길 수 있는지를 binary 하게 저장하는 거였다. 그리고 이건 모든 dp[n - (palindrome smaller than n)][!k]를 and operation으로 연산한 것으로 결정된다. 원래는 ‘음 그렇지 그렇게 할 수 있을 거 같아. 시간 복잡도는 얼마지?’를 물어보고 ‘근데 조금..

Programming 2024.01.17

tqdm(zip(

for id, audio_path in tqdm(zip(id_list, audio_path_list)): ... 1. zip generator는 list가 하나라도 끝나면 그대로 종료한다. 만약 list의 길이가 다르면 그중에서 가장 짧은 길이만큼 iterate 하기 때문에 그 전에 두 list의 길이가 같은지 확인해보는 게 좋다. assert len(id_list) == len(audio_path_list), f'{len(id_list)} != {len(audio_path_list)}' 사소한 습관은 중요하다. 2. zip은 generator이기 때문에 그때그때 lazy 하게 item을 생성한다. 그러므로 zip이 생성하는 것의 총 element 개수를 미리 알 수 없기 때문에 tqdm이 예상되는 전체..

Programming 2024.01.12

[BOJ 25577] 열 정렬정렬 정

https://www.acmicpc.net/problem/25577 25577번: 열 정렬정렬 정 첫 번째 줄에 배열의 크기 $N(4 ≤ N​ ≤ 100\,000)$이 주어진다. 그다음 줄에 배열의 원소 $A_1, A_2, \cdots, A_n (-10^9 ≤ A_i ≤ 10^9, i \neq j $ 이면 $ A_i \neq A_j )$ 이 주어진다. 배열의 원소는 모두 정수이다 www.acmicpc.net 하나의 예를 살펴보자. 1 7 2 9 3 8 0 이것은 이렇게 정렬되어야 한다. 0 1 2 3 7 8 9 1이 있는 자리에 0이 있어야 하고, 0이 있는 자리에 9가 있어야 하고, 9가 있는 자리에 3이 있어야 하고, … 그렇다. 그러므로 여기서 현재의 상태와, 이것이 어떻게 바뀌어야 하는지 간의 관..

Programming 2023.09.27

Bit Masking & Prefix Sum (BOJ 15661, BOJ 21758)

랩실에서 과제 하려다가 초급 스터디를 들었는데 많은 걸 배웠고 재밌었다. 끝나고 스터디에서 다룬 문제들 풀다가 기록하고 싶은 것들 * Bit Masking * BOJ 15661 링크와 스타트 한 팀을 기준으로 그 팀에 속해 있는 사람들을 비트로 관리할 때 두 사람 (i, j)이 같은 팀에 속해 있는지는 둘 다 비트가 켜져 있거나 꺼져 있는지로 확인할 수 있다. int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; vector arr(n, vector(n)); for (int i = 0; i > arr[i][j]; } } int ans..

Programming 2023.04.13