Pramp - Drone Flight Planner

숲사람·2022년 6월 12일
0

멘타트 훈련

목록 보기
55/237

Pramp로 첫 mock 인터뷰 경험. (220712)

문제

[x,y,z] 좌표와 경로가 주어질때, z좌표가 고도가 높아지면 에너지를 소모하고 고도가 하강하면 에너지를 얻는다. 가령 아래 예에서는 고도가 10에서 0으로 떨어질때 총에너지가 +10이 될거고, 다시 6으로 올라갈때 총 +4(10-6) 이 될것이다. 이 총에너지 값이 음수가되면 드론은 추락한다. 드론이 추락하지 않기위한 최소의 초기 에너지값을 구하라.

https://www.pramp.com/question/BrLMj8M2dVUoY95A9x3X

input:  route = [ [0,   2, 10],
                  [3,   5,  0],
                  [9,  20,  6],
                  [10, 12, 15],
                  [10, 10,  8] ]

output: 5 # less than 5 kWh and the drone would crash before the finish
          # line. More than `5` kWh and it’d end up with excess energy
          

해결 (220712 풀이)

문제를 이해하자마자 살짝 막막했지만, 예제를 하나씩 써보면서 루프를 반복하면서 값을 더하고빼다가 가장 작은min값을 업데이트하고 최종 답안은 그 min값을 리턴하면 된다는걸 깨달았다. 그리고 문제 풀이 시작.

위 example을 좀더 풀어서 따라가보면

10  0        6       15        8
   +(10-0)  +(0-6)  +(6-15)  +(15-8)
   10        4       -5        2

이 경우에 최소값이 -5가 되기 때문에 최고 초기 에너지는 5가 되어야함. 루프를 진행하면서 sum에 (prev-curr) 를 누적해서 더해가면서 min값을 업데이트하면 됨.

#include <limits.h>
int calcDroneMinEnergy(size_t routeLength, int route[routeLength][3]) 
{
  int sum = 0;
  int prev = route[0][2];
  int min = INT_MAX;

  for (int i = 1; i < routeLength; i++) {
    if (route[i][2] < prev)
      sum += prev - route[i][2]; 
    else
      sum += prev - route[i][2]; 
    prev = route[i][2];
    if (sum < min)
      min = sum;
  }
  return min < 0? min * -1 : 0;
}

int main() {
  return 0;
}

220916 다시 풀어본 풀이

지난번에 뭘 그리 어렵게 풀었는지 이해가 안감.
단순히 [i-1] - [i] 를 누적해서 더하면서 가장 최소값(음수값인경우)을 리턴하면됨.
배열인덱싱 문제는 반드시 각각의 값들과 예상계산 값들을 적어보면서 문제를 풀것.

a   10     0        6     15      8
        +(10-0)  +(0-6)  +(6-15) +(15-8)
        +10      -6       -9       +7        
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define min(a,b) (((a) < (b)) ? (a) : (b))
int calcDroneMinEnergy(size_t routeLength, int route[routeLength][3]) 
{
  int sum = 0;
  int min = INT_MAX;
  for (int i = 1; i < routeLength; i++) {
    sum += route[i-1][2] - route[i][2];
    min = min(min, sum);
  }
  return (min < 0) ? -min : 0;
}

int main() {
  return 0;
}
  • 조금 더 개선된 풀이
    초기 min값을 0으로 하면 더 간결한 답이 나옴. INT_MAX 및 마지막 삼항연산자가 필요없어짐.
int calcDroneMinEnergy(size_t routeLength, int route[routeLength][3]) 
{
  int sum = 0;
  int min = 0;
  for (int i = 1; i < routeLength; i++) {
    sum += route[i-1][2] - route[i][2];
    min = min(min, sum);
  }
  return -min;
}

Weak Points & 개선할 점 (220712)

  • 결과적으로 코드는 매우 쉬운데, 항상보면 막상 당시에 이 코드로 작성해가는 과정은 생각보다 쉽지 않은것 같다. 압박을 느껴서 그랬는데 더 햇갈리고 버벅이게 되는것 같음. 문제와 예제에 대해서 더 차분히 풀어서 이해하고 생각했어야했다.
  • 문제와 예제를 정확히 더 파악하고 코딩을 시작했어야했는데 살짝 버벅였다. 이런 면접같은 압박환경에서 순수하게 산수를 해야하는 문제가 나오면 오히려 더 햇갈린다.
  • 루프를 돌면서 어떤 변수에 어떤값을 더하고 빼야하는지 파악하는것에 대한 훈련이 부족한것같다. 엄청 햇갈려함.
  • 이런문제는 차분하게 예제를 풀어서 써보면서 어떤값을 어떻게 더하고 뺄지 파악해보는게 중요할것같다.
  • 문제 이해하는데 좀 시간이 걸림 ->문제와 예제를 더 완벽히 이해하고 시작할것.
  • 나의 경우 압박적인 상황에서 차분하게 예제와 코드flow를 체크하는 능력이 생각보다 많이 떨어진다는것을 확실히 느낌. ->연습을 통해 개선해나가기.
  • 예상 못한 어려움에 봉작했을때, 말이 없어짐. 사실 이부분은 점점 개선되고 있는것같이 느껴짐. 그 상황에 봉착하면 무엇 때문에 난관을 느끼고 있는지 현재 상태를 말하는게 좋음.
  • 이번 문제때 솔루션만 얘기하고 바로 문제풀이로 진입했는데, 끝나고 시간/공간 복잡도에대한 이야기도 안함. 예제에 대한 코너케이스 분석으로 더 했어야함.
  • 그리고 리턴값에대한 이해도가 부족했다. 만약 리턴값이 양수가 나오는경우는 에너지를 채울필요가 없기 때문에 그냥 0을 리턴하면 되는데, 최종 계산된 min값을 리턴하려고해서 교정을 받았다. -> 사전에 문제및 input/output정확히 파악하기
  • 변수명도 그냥 min, sum, prev였는데 너무 일반적인 잘못된 변수명이었음.

총평 (220712)

  • 어쨋든 결과적으로 문제는 잘 풀었고 정답도 맞았다. 총 30~40분정도 걸린것같다.
  • 첫 mock인터뷰였는데 매우매우 좋은 경험이었다. 이런 서비스가 있다는게 너무 놀랍다.
  • 인터뷰어는 대만사람이었고, 대단히 좋은 인터뷰어였다. 적절한 타임에 힌트도 주고 문제에 대한 이해도가 높았던것같다. 발음은 이해하는데 살짝 어려움이 있었다.
  • 문제 난이도는 계속 이정도의 난이도로 훈련하면 될것같다. 지금 단계에서는 온라인 코딩인터뷰 환경 자체에 익숙해지는 연습을 하는게 우선이기 때문에 굳이 어려운 문제를 할필요는 없다. 그리고 쉬운문제를 통해 인터뷰에 대한 작은 성공의 경험들을 누적하는게 더 필요할것같다.
  • Practice Makes Perfect!
  • 마지막으로 인터뷰어로부터 받은 피드백은 아래와 같다.

profile
기록 & 정리 아카이브 용도 (보다 완성된 글은 http://soopsaram.com/documentudy)

0개의 댓글