문제 : https://www.acmicpc.net/problem/3190import sysinput = sys.stdin.readlineN=int(input())# 사과 받기K=int(input())apple=[[False for _ in range(N)] for _ in range(N)]for _ in range(K): a, b = map(int,input().split()) apple[a-1][b-1] = True# 방향 변환 정보 받기L = int(input())dir = []for _ in range(L): dir.append(list(input().split()))dir.append([0,0])# 오른쪽으로 방향 90도 회전# (0,1) -> (1,0)# (1,0) -> (0,..
문제 : https://www.acmicpc.net/problem/17298import sysinput = sys.stdin.readlineN = int(input())A = list(map(int,input().split()))stack=[]# 오른쪽에서 왼쪽으로 쭉 진행한다for i in range(N-1,-1,-1): n = A[i] # 오큰수랑 비교해서 원래 수열에선 오큰수로 기록해버린 다음 noks = True for j in range(len(stack)-1,-1,-1): if stack[j] > n: noks = False A[i] = stack[j] break if noks: A[..
문제 : https://www.acmicpc.net/problem/2504 import sysinput = sys.stdin.readlinebrackets = list(input().strip())stack=[]# 유효한 괄호열인지 확인for brkt in brackets: if stack: if stack[-1] == '(' and brkt == ')': stack.pop() continue elif stack[-1] == '[' and brkt == ']': stack.pop() continue stack.append(brkt)if stack: print(0)else: for ..
·📚 Book/CS:APP
가상 메모리 매커니즘(1) 메인 메모리를 디스크에 저장된 주소공간에 대한 캐시로 취급해서 메인 메모리 내 활성화 영역만 유지하고, 데이터를 디스크와 메모리 간에 필요에 따라 전송하는 방법으로 메인 메모리를 효율적으로 사용(2) 각 프로세스에 통일된 주소공간을 제공함으로써 메모리 관리를 단순화(3) 각 프로세스의 주소공간을 다른 프로세스에 의한 손상으로부터 보호가상메모리를 이해해야 하는 이유가상메모리는 중요함 : 가상메모리는 컴퓨터의 모든 수준의 시스템에 스며들어 있음. 가상메모리를 이해하면 어떻게 시스템이 동작하는지 이해할 수 있음.가상메모리는 강력함 : 가상메모리는 응용에 메모리 블록 생성, 제거, 디스크 파일에 메모리 블럭 매핑, 다른 프로세스들과 메모리 공유 등 강력한 기능을 제공함. 메모리 위치에..
·📚 Book/CS:APP
제어 흐름의 양상은 크게 세 종류이다.메모리에 연속적으로 할당되어 있는 명령어들을 순차적으로 실행 (기본적)프로그램 상태의 변화에 반응하여 제어 흐름이 갑자기 바뀌는 경우 jump, call, return 등 실행예외적인 제어 흐름(ECF)예외적인 제어 흐름(ECF)은 시스템 상태의 갑작스러운 변화에 대응하여 프로그램의 실행 흐름이 변화하는 것을 의미한다.ECF는 하드웨어, 운영체제, 응용 프로그램 수준에서 모두 발생할 수 있으므로 이에 대한 대응도 전부 준비되어 있어야 한다.하드웨어 : 하드웨어에 의해서 검출되는 이벤트들은 예외 핸들러로 갑작스런 제어이동을 발생시킨다.운영체제 : 문맥전환을 통해서 사용자 프로세스에서 다른 프로세스로 제어가 이동한다.응용수준 : 프로세스는 시그널을 수신하는 곳에 있는 시..
·📚 Book/CS:APP
심볼 해석 규칙코드랑 데이터 모아서 메모리에 로드 가능하고 실행 가능한 파일로 만드는 과정컴파일할 때나 실행될 때 등등 여러 상황에서 수행될 수 있다별도로 수정하고 링크해서 큰 규모의 응용 프로그램을 별도로 수정할 수 있게된다링커를 배워야 하는 이유큰 프로그램을 작성하는데 도움됨 : 모듈, 라이브러리, 맞지 않는 라이브러리 버전 때문에 링커 에러를 발생시킬 때가 있다. 어떻게 링커가 참조를 해결해나가는지, 라이브러리가 뭔지 모르면 링커 에러날 때 당혹스러울 것.위험한 에러 회피 : 리눅스 링커가 심볼 참조를 해결할 때 하는 결정들은 프로그램의 정확성에 영향을 조금 줄 수 있다. 전역변수를 중복해서 정의한 프로그램도 기본 설정의 경우 경고 메시지 없이 링커를 통과할 수 있다. 이렇게 되면 런타임 동작 때 ..
·📚 Book/CS:APP
컴퓨터는 데이터를 처리하고, 메모리를 관리하고, 저장장치에 데이터를 읽거나 쓰고, 네트워크를 통해 통신하는 등의 하위 동작들을 인코딩한 연속된 바이트인 기계어 코드를 실행한다.컴파일러는 프로그램 언어의 규칙, 대상 컴퓨터의 인스트럭션 집합, 운영체제의 관례 등에 따라 기계어 코드를 생성한다.GCC C 컴파일러는 기계어 코드를 문자로 표시한 어셈블리 코드의 형태로 출력을 만들어 프로그램의 각 인스트럭션을 만들어 낸다.그러고 나서, GCC는 어셈블러와 링커를 호출하여 어셈블리 코드로부터 실행 가능한 기계어 코드를 생성한다.자바, C 같은 고급 언어로 프로그래밍하면 컴파일러가 어셈블리 코드 알아서 잘 짜주는데 왜 기계어 코드를 배워야 하는가? : 컴파일러 최적화 성능 알 수 있음. 코드에 내재된 비효율성을 분..
·📚 Book/CS:APP
CSAPPhello world 출력하는 간단한 프로그램조차도 실행되고 종료되기 위해서 시스템 주요 부분들이 조화롭게 동작해야 함. 이게 어떤 과정으로 일어나는지 알아보는 것이 이 책의 목적.1.2 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다linux> gcc -o hello hello.c 이거 유닉스 시스템에서 입력하면 hello.c를 읽어서 실행파일인 hello로 번역한다.번역은 전처리기, 컴파일러, 어셈블러, 링커 이 4가지의 컴파일 시스템을 거친다.전처리 단계 : 전처리기(cpp)는 C 프로그램을 #문자로 시작하는 디렉티브에 따라 수정한다. #include 컴파일 단계 : 컴파일러(ccl)는 텍스트파일 hello.i를 텍스트 파일인 hello.s로 번역하며, 이 파일에는 어셈블리어 프로그램..
RequirementsInsertionRotationDeletion
삼중 for문으로 모든 정점을 순회하면서"나 거쳐서 갈 수 있는 놈들 있어? 싹 다 갱신해봐"가 플로이드 와샬 알고리즘이다. 이행적 폐쇄 (Transitive Closure)비용 상관없이 갈 수 있느냐 없느냐만 따져보면for k in range(n): # 나 A를 거쳐서 for i in range(n): # B 너가 for j in range(n): # C로 갈 수 있니? if closure[i][k] and closure[k][j]: closure[i][j] = True 첫번째 for문 요소 : "나 A를 거쳐서"두번째 for문 요소 : "B 너가"세번째 for문 요소 : "C로 갈 수 있니?""나 A를 거쳐서, B 너가, C로 갈 ..
lazyArtisan
lazyArtisan