전체 글
-
[LeetCode] 166. Fraction to Recurring DecimalComputerScience/Algorithm 2024. 4. 9. 15:13
문제 성능 요약 메모리: 16.9MB, 시간: 26ms 분류 ? 접근 방법 리트코드로 문제를 푸는 것이 처음이어서, class를 활용한 디버깅 방법 등을 연구하느라 시간이 좀 걸렸다. 문제로에서는 분수가 반복되는 부분을 찾는 것이 관건이겠다 생각했다. class Solution: def fractionToDecimal(self, numerator: int, denominator: int) -> str: ans = "" ans2 = "" n = numerator d = denominator if n % d == 0: return str(n//d) else: if len(str(n/d)) > 10: ans += str(n/d).split(".")[1] for i in ans: if i in ans2: bre..
-
[BOJ] 히든 넘버 - 8595ComputerScience/Algorithm 2024. 4. 9. 00:44
문제성능 요약메모리: 40192KB, 시간: 2336ms분류문자열파싱접근 방법주어진 단어들 사이에서 조건에 맞는 '숫자'들의 합을 구하는 문제였기 때문에, 문자열에서 숫자와 문자를 구분하는 법부터 알아야 된다고 생각했다. 하다 보니 매우 하드코딩이 된 것 같다.먼저 주어진 단어를 인덱스 하나씩 탐색하여 문자열의 아스키코드를 이용하는 ord()함수를 사용해서 문자인 것과 아닌 것의 처리를 다르게 할 수 있도록 분기를 나눴다.인덱스가 늘어나면서 숫자이면 number 문자열에 +연산으로 더하였고, 아니라면(즉 문자라면) 이때까지 더해서 나온 단어를 int()로 숫자화하여 결과값을 출력하기 위한 sum에 더해주었다.하지만 여기서 예외 케이스들이 몇개 있었다. 예를 들자면 'aaaaa0a009'와 같은 케이스였다..
-
[BOJ] 8진수, 10진수, 16진수 - 11816ComputerScience/Algorithm 2024. 4. 6. 14:24
문제https://www.acmicpc.net/problem/11816성능 요약메모리: 31252 KB, 시간: 40 ms분류사칙연산구현수학파싱문자열접근 방법주어진 조건에 맞게 분기를 나누었다.8진수는 0부터 시작하고, 16진수는 0x로 시작한다. 이에 맞게 주어진 입력을 처리하면 되었고, 문자열은 슬라이싱이 가능하기 때문에 이를 활용하였다. 잘 모르고 있었던 것은 8진수, 16진수로의 변환과 int()의 사용법이었다.정답import sysinput = sys.stdin.readlinex = input().rstrip()if len(x) >= 2: if (x[0] == "0") & (x[1] == "x"): print(int(x[2:], 16)) elif x[0] == "0": ..
-
[BOJ] 숫자의 합 - 11720ComputerScience/Algorithm 2024. 4. 5. 14:27
문제 성능 요약메모리: 31120 KB, 시간: 44 ms분류구현수학문자열접근 방법일렬로 들어오는, 구분자가 없는 문자열을 어떻게 처리할지 고민했다.split() 함수를 사용할 수 있었다. 하지만 split()은 공백, 쉽표 등의 구분자가 존재해야만 했고 이를 사용할 수 없다는 것을 알게 되었다.공백이 없는 문자열을 자르기 위해서는 list()를 사용할 수 있었다. 하지만 list()는 input()으로 들어온 모든 문자열을 문자 하나씩 원소화한다. 따라서 '\n'과 같은 개행문자도 원소에 포함한다.이를 위해서 rstrip()을 활용해 '\n'을 제거하였다.정답import sysinput = sys.stdin.readlinen = int(input())b = list(map(int, list(input(..
-
[BOJ] 소인수분해 - 11653ComputerScience/Algorithm 2024. 4. 5. 10:58
문제 접근 방법부끄럽지만 일단 소인수 분해에 대해 다시 찾아봤다..소인수분해란, 어떤 자연수를 소인수(소수인 인수)들의 곱으로 나타내는 것이다. 그렇다면 '소수'란 무엇인가?소수는 1과 자기 자신만을 인수로 갖는 수를 말한다. 그렇다면 우리가 구해야 할 것은 '소수'라고 생각해서, 나눠주는 과정 속에서 그 다음 소수로 나눠주고, 안나눠지면 또 다른 소수를 나눠주면 되겠다 생각했다.while n == i: if n % i != 0 : n = n // i; print(i) else: i += 1 if i % 2 == 0: i += 1 다음과 같이 접근하여, 자연수를 소수를 인수분해 하면 n이 인수가 될 때 까지 반복하면 끝난다..
-
[PintOS] Project 3 - Virtual Memory, Stack GrowthProjects/Krafton_Jungle_4 2024. 4. 3. 00:15
stack growth 부분 깃북을 정리해 보겠다. 프로젝트 2에서 스택은 USER_STACK이라는 주소에서 시작하는 '단일 페이지'였고, 이를 4KB로 제한하여 실행했다. 이제부터는 스택이 현재 크기를 초과하면 필요에 따라 추가 페이지를 할당한다. 현재 크기라는 것이 1MB를 말하는 것인지 4KB를 말하는 것인지? 추가 페이지는 '스택'에 접근하는 경우에만 할당한다. 스택에 접근하는 경우와 아닌 경우를 구별하는 방법을 찾아야 한다. 페이지 폴트가 발생한 주소가 스택이라고 지정된 주소 사이인지를 검증하는 로직이 필요하다. User program은 스택 포인터 아래의 스택에 쓸 경우 버그가 발생하는데, 이는 일반적인 실제 OS가 스택의 데이터를 수정하는 시그널을 전달하기 위해 프로세스를 언제든지 중단할 수..
-
[PintOS] Project 3 - Virtual Memory, Anonymous Page (2)Projects/Krafton_Jungle_4 2024. 4. 2. 16:07
구현을 열심히 해 보았지만 능력의 한계로 진행이 더뎌졌다. 그래서 빠르게 팀원의 도움과 여러 블로그의 참조를 통해서 내가 어떤 잘못을 했는지 파악하는 방향으로 나아가고자 했다. 나의 구현과 팀원 혹은 블로그들의 구현 상 달랐던 점을 비교하고 각 함수가 무엇을 하는지 살펴보겠다. 일단 구현 사항들은 다음과 같다. vm.c supplemental_page_table_entry() vm_claim_page() vm_evict_frame() vm_get_victim() spt_insert_page() vm_alloc_with_initializer() vm_do_claim_page() vm_try_handle_fault() vm_get_frame() spt_find_page() vm.h struct lazy au..
-
[PintOS] Project 3 - Virtual Memory, Anonymous page (1)Projects/Krafton_Jungle_4 2024. 3. 27. 14:32
흐름 정리 fork, process_create_initd 등으로 프로세스 생성 -> initd 함수에서 supplemental_page_table_init() 호출하여 현재 스레드의 supplemental page table 을 초기화한다. supplemental_page_table_init() 새로운 spt를 초기화한다. 기존의 pml4라는 페이지 테이블은 주어진 va를 kva로 변환만 해주고 있고, va가 가리키고 있는 페이지 구조체 정보에 대한 어떠한 정보도 가지고 있지 않다. 따라서 spt는 va가 가리키고 있는 페이지에 대한 정보를 추가적으로 보충해 주는 역할을 한다. -> pml4는 그냥 uint64_t로 선언되어 있는데 어떻게 테이블이라고 할 수 있을까?... spt가 필요한 이유는 다음과..