[05.19 / week10]TIL

CHO WanGi·2025년 5월 19일

KRAFTON JUNGLE 8th

목록 보기
56/89

오늘 하루 요약

✏️ 오늘의 한 일

  • PintOS LAP Argument Passing 구현(미완료)
  • 프로그래머스 [DP]정수삼각형 문제 풀이

🌈오늘의 성장!

PintOS LAP Argument Passing 구현(미완료)

일단 procee_exec함수에서 file_name을 받아서 이를 띄어쓰기를 기준으로 잘라서
사용자 스택에 차곡차곡 쌓는 과제이다.

int process_exec(void *f_name)
{
	char *file_name = f_name;
	bool success;

	/* We cannot use the intr_frame in the thread structure.
	 * This is because when current thread rescheduled,
	 * it stores the execution information to the member. */
	struct intr_frame _if;
	_if.ds = _if.es = _if.ss = SEL_UDSEG;
	_if.cs = SEL_UCSEG;
	_if.eflags = FLAG_IF | FLAG_MBS;

	/* We first kill the current context */
	process_cleanup();

	// 1.Break the command
	char *token;
	char *save_ptr;

	// file name에서 공백을 만나면 문자열 자르고 save_ptr에 다음 문자열 주소 저장
	// 첫번째 호출
	token = strtok_r(file_name, " ", &save_ptr); // args-single onearg 일경우 args-single

	char *argv[99];
	int argc = 0;

	while (token != NULL)
	{
		argv[argc] = token; // 자른 문자열 저장
		argc++;
		token = strtok_r(file_name, " ", &save_ptr); // args-single onearg 일경우 args-single
	}

	/* And then load the binary */
	success = load(file_name, &_if); // setup_stack 을 통해 rsp를 초기화 => argv 쌓기

	// 2. Place the words at the top of Stack
	char *argv[99]; // 문자열 저장될 배열
	int argc = 0;		// argv의 요소 개수

	while (token != NULL)
	{
		argv[argc] = token;
		argc++;
		token = strtok_r(file_name, " ", &save_ptr); // args-single onearg 일경우 args-single
	}

	// 3. Push the address of each string + null pointer(\0)
	// first push 전 8의 배수로 round 후 push => 더 좋은 성능보장 목적
	// argv의 마지먁 idx부터 들어가야함.

	char *str[99]; // 각 인자 문자열의 주소 담을 배열

	for (int i = argc; i > 0; i--)
	{
		uint16_t length = strlen(argv[i]);
		_if.rsp = _if.rsp - length;			 // str의 길이 만큼 stack top pointer 이동(높은 주소 -> 낮은 주소)
		str[i] = _if.rsp;								 // TOS 주소 저장
		memcpy(str[i], argv[i], length); // 주소에 argv 값 복사해서 저장(Stack에 push)
	}

	// 4. %rsi가 argv(argv[0]) 가리키고, %rdi가 argc 가리키도록(Point)

	// 5. 가짜 return address push

	/* If load failed, quit. */
	palloc_free_page(file_name);
	if (!success)
		return -1;

	/* Start switched process. */
	do_iret(&_if);
	NOT_REACHED();
}

GitBook 가이드에 따라 단계별 Step을 주석으로 쓰고 맞추어서 진행중이다..
무엇보다 argv[3]이 더 먼저 들어가야하기에 음수를 활용해서 반복문을 돌았다.

프로그래머스 [DP]정수삼각형 문제 풀이

  • 구할 것
    문제 조건 : 꼭대기에서 바닥으로 이어지는 경로중 거쳐간 숫자의 합이 가장 큰 경우 그때의 최대 합
    이동 가능 방향은 대각선 방향으로 왼쪽, 오른쪽으로만 이동 가능

  • 나의 코드

function solution(triangle) {
    var answer = 0;
//     DP 배열 생성
    let DP = triangle.map(row => Array(row.length).fill(0));
    DP[0][0] = triangle[0][0]
    
//     Bottom UP으로 저장
    for(let i = 1; i < triangle.length; i++){
        for(let j = 0; j < triangle[i].length; j++){
            let candidate = [(DP[i -1][j] || 0), (DP[i - 1][j + 1] || 0)]
            DP[i][j] += Math.max(...candidate);
        }
    }
    
    console.log(DP)
    
    return answer;
}
  1. 점화식 오류
    점화식의 방향 자체는 맞았는데 일단 왼쪽으로 가는 경우는 J가 아닌, j - 1로, 오른쪽을 j로 받았어야 했다.
    쉽게 말해서 부모 레벨에서 값을 받아오는 것인데, 왼쪽 위인 경우가 빠지게 된다.
   행 i-1:    (j)     (j+1)
                   B       D
                    \     / \
                     \   /   \
      행 i:            C     E   F
                     (j)  (j+1)(j+2)
  1. DP 배열에 triangle[i][j] 더하지 않음
    이렇게 되면 7과 0만 들어가서 이걸로 계속 Max를 계산한다...
  • 정답 코드
function solution(triangle) {
    var answer = 0;
//     DP 배열 생성
    let DP = triangle.map(row => Array(row.length).fill(0));
    DP[0][0] = triangle[0][0]
    
//     Bottom UP으로 저장
    for(let i = 1; i < triangle.length; i++){
        for(let j = 0; j < triangle[i].length; j++){
            let candidate = [(triangle[i -1][j - 1] || 0), (triangle[i - 1][j] || 0)]
            triangle[i][j] += Math.max(...candidate);
        }
    }
    
    console.log(triangle)
    
    return Math.max(...triangle[triangle.length-1]);
}

triangle 배열 자체를 DP 저장소처럼 활용하는 것이다.
따라서 경로를 따라가서 가장 아래 레벨에서 가장 큰값이 바로 정답.

⛏ 오늘의 삽질

PintOS 어려워여...
GitBook에 Step 있었는데 그거 못보고 헤딩부터 한게 삽질...

profile
제 Velog에 오신 모든 분들이 작더라도 인사이트를 얻어가셨으면 좋겠습니다 :)

2개의 댓글

comment-user-thumbnail
2025년 5월 19일

GitBook에 Step이 있구나...

1개의 답글