반응형

문제

한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오.

 

첫째 줄에 x, y, w, h가 주어진다.

 

출력

첫째 줄에 문제의 정답을 출력한다.

제한

  • 1 ≤ w, h ≤ 1,000
  • 1 ≤ x ≤ w-1
  • 1 ≤ y ≤ h-1
  • x, y, w, h는 정수

 

해설

문제를 쉽게 풀어서 설명한다면

"직사각형 내부에 있는 점 (x,y)에서 직사각형의 변까지의 최소 거리" 를 구하는 문제이다.

결국 최솟값을 찾으면 되는 문제이다. 무엇중에 최소값을 구하는지만 생각하면 해결된다.

사각형이니까 변이 4개, 우리에게 주어진 점은 1개(x, y)

그렇다면 (x, y)에서 사각형 각 변까지의 거리 총 4개를 구하고 그중에 최솟값을 취하면 된다.

아래 코드는 4개의 거리값을 구하고, 정렬을 이용하여 최솟값을 구하는 코드이다.

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var fs = require('fs');
var input = fs.readFileSync('/dev/stdin').toString().split(' ');
 
var [x, y, w, h] = input.map(el => parseInt(el));
 
 
//w, h 는 x, y보다 크기 떄문에 항상 양수
const xDiff = w-x
const yDiff = h-y
 
// 네개의 변수 중 최소값이 문제에서 하는 최소 거리이다.
const arr = [xDiff, yDiff, x, y]
// js의 기본 sort는 ascii 문자를 기준으로 정렬하기 때문에 반드시 비교함수를 넣어줘야한다.
arr.sort((a, b) => {
  return a - b
});
console.log(arr[0])
cs
반응형
반응형

문제

정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.

 

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

 

해설

1은 표현을 하지 않아도 되기 때문에 2부터 시작하며 해당 수를 나누면서 진행하면 소인수를 얻을 수 있다.

나누어서 0이 되는 숫자를 찾게 된다면, 나누어서 소인수를 저장하고 다시 2부터 나누기를 시도하며 진행한다.

작은 숫자에서부터 차례로 검사하며 배열에 넣기 때문에 소수를 오름차순으로 정렬을 하라는 요구조건은 따로 처리를 하지 않아도 만족한다.

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var fs = require('fs');
var input = fs.readFileSync('/dev/stdin').toString().split(' ');
var num = parseInt(input[0]);
 
var i = 2;
var primes = []
while (true) {
  if (num % i === 0) {
    num = num / i
    primes.push(i)
    i = 1;
  }
  i++;
  if (i > num) {
    break;
  }
}
 
console.log(primes.join("\n"));
cs

 

반응형
반응형

golang 1.14

증상

운영중인 서버 상태를 모니터링 하는데 Memery 사용률이 50% 이상인 상태로 2시간이 넘게 지속되는 현상이 발생.

하지만 CPU 사용량은 3% 미만이고 트래픽이 많이 발생하지 않는 상태였음.

로그를 확인해보니 중간에 트래픽이 몰리면서 CPU 사용량이 30% 이상으로 지속되면서 메모리 사용량이 늘어난 것을 확인함.


문제 해결

최초에는 'Memory leak이 있나?' 생각했지만 6개월 이상 정상적으로 동작하던 서버였기 때문에 Memory leak을 찾기 전 관련 Issue를 찾아보기 위하여 Stack overflow와 Golang 커뮤니티를 검색함.


결론

Memory leak이 아님!

golang에서 OS에서 할당받은 메모리를 release해주지 않던것이 해당 증상의 원인이었음.

Memory를 할당 받는 것은 비용이 크기 때문에 반환을 하지 않고, golang에서 해당 메모리를 계속 들고 있게됨.(OS에서 Memory가 필요하면 반납함)

만약 강제로 Memory를 반납하고 싶다면 

 

debug.FressOSMemory()

 

를 사용 할 수 있음

 


추가 사항

Autoscaling 정책에 Memory 점유율도 포함을 시켜놓고 있었는데, 

해당 서버에서는 컨테이너화된 Go 서버만 돌고 있기 때문에 Memory 점유율에 대한 정책을 조절하여 위와 같은 상황에서 Scale-out되는 경우가 덜 발생하도록 함.

 

Golang 1.16에서는 Memory 계산 방법이 변경되어 위와 같은 증상이 발생하지 않는다고 하는데, Golang 버전 변경을 아직 해보지 않아서 확인해보지 못함.(나중에 해봐야지...)

반응형

+ Recent posts