목록분류 전체보기 (427)
안 쓰던 블로그
0이 들어오면 0전까지 쌓인 수를 거꾸로 출력 즉 1 2 3 4 5 0이면 5 4 3 2 1 0을 출력하라는 말 고급 언어에서 이런 경우 1. 입력 받고 0인지 판단 2. 0이 아니면 스택에 값을 넣음. 길이+1 3. 0이면 스택에 있는 값을 길이만큼 전체 출력 순서겠고, 어셈으로 바꿔보면 1. 입력 받고 0인지 판단 2. 0이 아니면 스택에 값을 넣음. BAK에 길이+1 3. 0이면 입력 일시 정지. 스택에 있는 값을 길이BAK만큼 전체 출력 4. 출력이 끝나면 입력 다시 실행 입력을 잠시 멈추는 코드가 필요하다 안 그러면 출력하는데 다른 값을 출력하게 되니까ㅋㅋ 1번 노드에서 1번 과정을 한다 0이 아니면 계속 아래로 값을 보내고, 0이면 오른쪽에서 값이 들어올 때까지 대기한다 2번 노드에서는 위에서..
HEAP 완전 이진 트리에 있는 노드 중에서 특정 노드(키 값이 가장 큰 노드나 가장 작은 노드)를 찾기 위해서 만든 자료구조 최대 힙 max heap 키 값이 가장 큰 노드를 찾기 위한 완전 이진 트리 (이진 트리: https://foxtrotin.tistory.com/184 ) {부모 노드의 키 값>자식 노드의 키 값} 루트 노드: 키 값이 가장 큰 노드 최소 힙 min heap 키 값이 가장 작은 노드를 찾기 위한 완전 이진 트리 {부모 노드의 키 값 삽입 원소의 키값} 관계가 성립되지 않으면 서로 자리를 바꾸면서 제 자리를 찾는다 예를 들어 17을 삽입하는 경우 완전 이진 트리의 무게를 맞출 수 있는 곳인 오른쪽 맨 아래 노드에다가 17짜리 노드 추가 값 비교 하면서 17이 있어야 할 자리로 옮긴..
IN.A > IN.B면 IN.A-IN.B-0 순서대로 출력 IN.A < IN.B면 IN.B-IN.A-0 순서대로 출력 그냥 IN.B-IN.A하고 양수면 BA0 음수면 AB0 순서대로 출력하면 되는데 한 가지 주의할 점은 값을 두 번 쓰기 때문에 두 번 넘겨줘야 한다 로직은 그냥 두 값을 빼고 양수면 B가 더 크므로 UP-LEFT 순으로 보내고 음수면 A가 더 크므로 LEFT-UP순으로 DOWN에 보낸다 DOWN은 두 번 출력하고 0출력한다 근데 이 작업을 하는 중에는 MOV UP, ACC에서 UP에서 넘어온 값을 하나 쓰고 SUB LEFT에서 LEFT에서 넘어온 값을 하나 쓴다 근데 L: R:로 분기했을 때 MOV에서 LEFT, UP값을 한 번 더 써서 DOWN으로 넘긴다 이 때 만약 LEFT, UP에서..
IN.S값이 -1이면 IN.A값 출력 IN.S값이 1이면 IN.B값 출력 IN.S값이 0이면 IN.A+IN.B값 출력 한 노드에서 3가지 경우를 다 처리할 수 있는데 -1일 때, 1일 때, 0일 때 이렇게 3번 분기를 만들면 한 칸에 명령어줄이 부족해서 다 안 들어간다 2가지 경우만 하고 나머지일 때~ 이런 식으로 else문처럼 분기해야 한다 시작하자마자 왼쪽/오른쪽에서 값을 받는다 -1이면 L로 분기, 0이면 ZERO로 분기, 이도저도 아니면 그냥 아래 명령어 실행 L로 분기하면 LEFT값을 DOWN으로 보내주고, RIGHT를 NIL로 보낸다 ZERO로 분기하면 LEFT+RIGHT값을 DOWN으로 보내준다 이도저도 아니면(1이면) RIGHT값을 DOWN으로 보내주고, LEFT를 NIL로 보낸다 NIL로..
Solve SEQUENCE COUNTER without using the SWP instruction 그냥 풀면 이렇게 풀린다 https://foxtrotin.tistory.com/200 원래는 BAK에 값을 저장하다가 0이 오면 출력하는 방법으로 풀었는데 BAK을 쓰지 않는다면 ACC만 쓰면 된다 ACC만 쓰려면 0이 올 때까지 수를 그냥 ACC에 계속 누적하다가, 0이 오면 출력하는 방법으로 하면 되긴 할텐데 그러면 ACC에 새로운 값이 들어오면 누적값이 없어지는 거 아니야? 할 수도 있음 의외로 되게 간단한 방법이 있는데 0이 오면 터무니 없는 음수 값을 ACC에 더하고, 0이하라면 0이 왔다고 판단하고 출력하면 된다 물론 입력값에 음수가 없다는 위험한 전제가 있어야 하지만. 어쨌든 여기서는 음수가..
0이 들어올 때까지 들어온 값의 합을 저장하다가 0이 들어오면 합을 S에, 값의 길이를 L에 출력한다 한 노드 당 한 개씩 있는 ACC와 BAK을 활용해야 한다 ACC는 새로운 값이 오면 무조건 덮어씌워지므로 1. 값을 받는 노드 2. 합을 저장하는 노드 3. 길이를 저장하는 노드 이렇게 다 따로 해줘야 한다 맨 처음에 입력을 받아서 ACC값에 넣고 왼쪽, 아래, 오른쪽으로 보낸다 그냥 MOV LEFT, RIGHT, DOWN 으로 하면 다음 값을 받아서 넘어가니까 꼭 ACC에 저장한 뒤 그 값을 넘겨야 한다 내 코드에서는 값을 받아오는 노드 기준으로 오른쪽 3개가 길이 저장 왼쪽 3개가 더할 값 저장 아래 2개가 합을 저장하는 작업을 수행한다 합을 저장하는 작업을 하는 노드를 자세히 보면, UP에서 오는..
Solve SIGNAL AMPLIFIER in fewer than 100 cycles 원래 단순하게 풀면 160사이클씩 나오는 신호증폭기 문제를 100사이클 이하로 풀어야 하는 도전과제다 근데 이미 코드가 값을 받는다->두배->옮긴다 가 전부라 아니 여기서 뭘 더 줄여? 라고 생각할 수도 있는데 '병렬처리' 개념만 알면 쉽게 풀린다 1. 값을 ACC에 저장한다 2. 자기 자신을 더한다(두 배) 3. ACC값을 넘긴다 이 3사이클을 동시에 2개의 노드에서 실행한다 그러면 2개의 노드는 각자 다른 숫자를 두 배 하는 작업을 한다 예를 들어 첫 번째 수인 66을 오른쪽 노드가 두 배 작업을 하고 있을 때 아래 노드는 이미 그 다음 수인 34를 두 배 작업을 하고 있는 것 한 번에 두 개씩 처리하니 사이클이 약..