https://www.acmicpc.net/problem/1934

 

1934번: 최소공배수

두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있으며, 최소 공배수는 30이다. 두 자연수 A와 B가 주어졌을 때, A와 B의 최소공배수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

문제

두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있으며, 최소 공배수는 30이다.

두 자연수 A와 B가 주어졌을 때, A와 B의 최소공배수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 둘째 줄부터 T개의 줄에 걸쳐서 A와 B가 주어진다. (1 ≤ A, B ≤ 45,000)

출력

첫째 줄부터 T개의 줄에 A와 B의 최소공배수를 입력받은 순서대로 한 줄에 하나씩 출력한다.

해결 방안

1. 유클리드 호제법을 이용하여 최대 공약수를 구한다. 

(https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95)

2. A, B의 최소공약수 = A * B // 최대공약수

소스코드

T = int(input())

# Greatest Common Divisor
def GCD(x,y):
    x,y = max(x,y), min(x,y)
    while(y > 0):
        z = x % y
        if z == 0:
            return y
        x,y = y,z
    return x

# Least Common Multiple
def LCM(x,y):
    return x * y // GCD(x,y)

for t in range(T):
    x,y = map(int, input().split())
    print(LCM(x,y))

 

https://www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

문제 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다. 상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수

www.acmicpc.net

문제

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)

출력

상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.

해결 방안

1. 봉지의 수를 최소화 하기 위해서는 최대한 5킬로그램 봉지를 많이 사용하면 된다.

2. N을 5로 나눈 최대치에서 1씩 줄여가면서 남은 N값이 3으로 나누어 떨어지는 순간에 봉지 개수를 리턴한다.

3. 5와 3으로 나누어 떨어지지 않는 경우에 -1을 리턴한다.

소스 코드

N = int(input())

def count_bag(x):
    bag1 = 5
    bag2 = 3
    max_bag1 = x//5
    for i in range(max_bag1+1):
        cnt1 = max_bag1 - i
        rest_x = x-(cnt1*bag1)
        if rest_x % bag2 != 0:
            continue
        cnt2 = rest_x // bag2
        return cnt1 + cnt2
    return -1

print(count_bag(N))

https://www.acmicpc.net/problem/10826

 

10826번: 피보나치 수 4

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n>=2)가 된다. n=17일때 까지 피보나치 수를 써보면 다음과 같다. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597 n이 주어졌을 때, n번째 피보나치 수를 구하는

www.acmicpc.net

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n>=2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 10,000보다 작거나 같은 자연수 또는 0이다.

출력

첫째 줄에 n번째 피보나치 수를 출력한다.

해결 방안 - 1

1. 재귀 함수를 이용한다. f(n+2) = f(n+1) + f(n)

2-1. 함수 f(n)는 n이 0일때 0, 1일때 1을 리턴한다.

2-2. n이 2이상의 경우에 f(n-2) + f(n-1)을 리턴한다.

소스코드 - 1

n = int(input())

def fibonacci(x):
    if x == 0:    return 0
    if x == 1:    return 1
    return fibonacci(x-1) + fibonacci(x-2)
    
print("%d" % fibonacci(n))

*재귀 함수를 사용하는 경우에 x가 커질수록 메모리 사용량과 연산 시간이 증가하여 시간 초과로 실패한다.

해결 방안 - 2

1. Dynamic Programming 알고리즘으로 n-1, n-2번째의 수만 메모리에 갱신하여 연산해 나간다.

2. 파이썬의 특징을 활용하여 x, y = y, x+y 연산으로 x에는 n-1번째 값을, y에는 n-1번째와 n-2번째의 합을 취한다.

소스코드 - 2

n = int(input())

def fibonacci(k):
    x, y = 0, 1
    for i in range(k):
        x, y = y, x+y
    return x 

print("%d" % fibonacci(n))

 

[Time Complexity] Python - Find Value in List vs Set vs Dict

[시간 복잡도] 파이썬 - List vs Set vs Dict 에서 Value 찾기

code n = 100000 n = 1000000 n = 1000000 Time Complexity
x in list 0.000494 0.019270
0.235368
O(n)
list.index(x) 0.000537
0.020288
0.246275
O(n)
for a in list:  if(a==x) 0.010289
0.107806
1.036934
O(n)
x in set 0.000002
0.000002
0.000006
O(1)
list to set 0.115826
0.066516
0.716471
 
x in dict 0.000005
0.000005
0.000004 O(1)
list to dict 0.147385
0.223651
2.232983  

결론

1. Set, Dict 에서 value를 찾을 경우에 시간 복잡도 O(1)로 가장 빠름

2. 다만 List to Set/Dict conversation이 필요한 경우에 일정 값 이하의 n에서는 List를 사용

[Time Complexity] Python - Deque vs List performance comparison (append, appendleft, pop, popleft)

[시간 복잡도] 파이썬 - Deque vs List 퍼포먼스 비교 (append, appendleft, pop, popleft)

code n = 10000 n = 100000 n = 1000000 Time Complexity
list.append() 0.0010249615 0.0093748569 0.0974259377 O(1)
deque.append() 0.0012080669 0.0113868713 0.1131999493 O(1)
list.insert(0,0) 0.0436980724 4.2723989487 430.9322969913 O(n)
deque.appendleft() 0.0010690689 0.0137970448 0.1067051888 O(1)
list.pop() 0.0013749599 0.0134758949 0.1310129166 O(1)
deque.pop() 0.0009977818 0.0100331306 0.1004290581 O(1)
list.pop(0) 0.0262870789 3.5589528084 372.6231980324 O(n)
deque.popleft() 0.0009810925 0.0101020336 0.0985748768 O(1)

결론

1. append와 pop의 경우에는 List와 Deque 둘 다 Time Complexity가 O(n)으로 별차이가 없음

2. appendleftpopleft의 경우에 Deque가 훨씬 빠름

[Time Complexity] Python - Numpy vs List of zeros declaration

[시간 복잡도] 파이썬 - Numpy vs List의 제로 배열 선언 비교

code n = 10000000 n = 100000000 n = 1000000000 Time Complexity
[0] * n 0.0831630230  0.8130910397 8.0924339294 O(n)
[0 for i in xrange(n)] 0.3735442162  3.7914631367  37.1647899151  O(n)
x = [] 
for i in xrange(n):
    x.append(0)
0.9481530190  9.4668169022  94.6755440235  O(n)
numpy.zeros((n,)) 0.0000300407 0.0000290871  0.0000340939  O(1)
numpy.full((n,),0) 0.0420970917 0.4114339352 4.0288629532 O(n)
numpy to list 0.5932991505 5.9227490425 59.9193470478 O(n)

결론

1. 제로 리스트 선언은 numpy.zeros가 가장 빠름

2. 다만 numpy to list 시간 복잡도가 O(n)이므로 리스트로 변환이 필요시에 [0] * n 가 가장 빠름

Jenkis Error - Build step 'Execute shell' marked build as failure

젠키스에서 shell을 이용하여 spark submit을 하는데 에러가 발생하였다.

shell 최상단에 다음과 -li 옵션을 추가하여 해결하였다.

 #!/bin/bash -li

-i

Force the shell to run interactively. Interactive shells are described in Interactive Shells.

-l

Make this shell act as if it had been directly invoked by login. When the shell is interactive, this is equivalent to starting a login shell with ‘exec -l bash’. When the shell is not interactive, the login shell startup files will be executed. ‘exec bash -l’ or ‘exec bash --login’ will replace the current shell with a Bash login shell. See Bash Startup Files, for a description of the special behavior of a login shell.




- Reference

Invoking Bash - https://www.gnu.org/software/bash/manual/html_node/Invoking-Bash.html

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch


[Amazon Lumberyard Tutorial in Korean] 럼버야드 튜토리얼 한국어 자료


https://docs.aws.amazon.com/ko_kr/lumberyard/latest/gettingstartedguide/intro.html

Amazon Lumberyard Tutorial 2 - Editor Overview

  • 새로운 레벨 생성
  • 럼버야드 오브젝트
  • 에디터 레이아웃
  • 필수 도구
  • 3D 네비게이션
  • 에디터
  • 디스플레이 옵션 및 설정
  • 레이어
  • 자동 백업


Step 1 : 새로운 레벨 생성


1. File -> New Nevel (Ctrl + N) -> 레벨 이름 입력후 생성

2. 텍스처 해상도로 레벨 지형을 생성

Step 2 : 럼버야드 오브젝트


럼버야드 오브젝트 타입

1. 엔티티 - 동작 속성이 있는 개체

동작 속성은 게임 스크립트나 코드를 통해 객체가 게임 이벤트에 응답할 수 있도록 한다.

엔티티는 다음 4가지 유형으로 세분한다.

  a. 엔티티 - 게임 재생 조건 또는 시각적 설정(예: 조명, 볼륨, 카메라, 물리 객체)을 설정하고 만드는 데 사용되는 일반 개체

  b. 지오메트리 (기하학적) 엔티티 - 지오메트리 메쉬가 부착된 엔티티

  c. 파티클 엔티티 - 한 레벨 내에서 생성 및 배치되는 파티클 시스템

  d. 아치형 엔티티 - 기존 엔티티 속성에 따라 사용자가 정의한 사용자 정의 엔티티

2. 브러쉬 - 3D 메쉬 데이터로만 구성된 객체. 브러쉬는 엔티티의 동작 요소는 포함하지 않는다.

3. 화이트박스 디자이너 객체 - 러버야드 화이트 박스 디자이너 모델링 도구로 만들어진 객체 (브러쉬와 유사함)

Step 3 : 에디터 레이아웃


에디터 레이아웃

1. 메인 메뉴 - 모든 기능 및 설정

2. 에디터 툴바 - 가장 일반적으로 사용되는 툴 및 에디터

3. 뷰포트 헤더 - 원근 뷰포트에 대한 검색바 및 디스플레이 옵션

4. 원근 뷰포트 - 레벨의 3D 환경 뷰

5. 뷰포트 컨트롤 - 선택된 객체의 컨트롤, 네비게이션 속도 옵션 등의 뷰포트 기능

6. 콘솔 - 에디터 및 게임 데이터의 입력과 출력

7. 롤업바 - 원근 뷰포트의 컨텐츠를 구축하고 관리하기 위한 객체 및 엔티티 접근

  - 룰업바에 포함되는 탭

Step 4 : 필수 도구


럼버야드 에디터의 필수 도구

1. 선택, 이동, 회전, 스케일

  a. 선택

선택할 객체 위에 마우스를 올리면 노란색으로 표시되고 커서가 +로 바뀔때 마우스 왼쪽 클릭

  b. 이동

객체를 선택한 후 원하는 X,Y,Z축 방향의 선을 클릭 후 드래그

  c. 회전

객체를 선택한 후 원하는 X,Y,Z축 방향의 원을 클릭 후 드래그

  d. 스케일

객체를 선택한 후 원하는 X,Y,Z축 방향의 선을 클릭 후 드래그

  e. 선택 단축키

객체를 선택한 후 키보드 입력 단축키로 작업

선택 - 1

이동 - 2

회전 - 3

스케일 - 4


2. 스냅 그리드

스냅 그리드는 객체를 움직일 때 그리드를 사용하여 스냅이 가능하다.

스냅 그리드는 기본적으로 켜져 있으며, 에디트 툴바에서 클릭하여 끄고 켤 수 있으며 사이즈 또한 조정 가능하다.

객체 선택 후 2(이동)를 입력하면 스냅 그리드의 사이즈를 확인 가능하다.

3. 스냅 엔글

스냅 엔글은 물체를 회전할 때 엔글을 이용하여 설정한 스냅 엔글(회전각) 단위로 회전이 가능하다.

객체 선택 후 3(회전)을 입력하면 스냅 엔글의 설정각을 확인할 수 있다.

4. 지형 팔로우 및 오브젝트 스냅

지형 팔로우와 오브젝트 스냅 옵션을 사용하면 X,Y,Z축 또는 평면을 따라 이동하는 대신 지형 피쳐를 따라 이동할 수 있다.

다음 온션을 선택하면 지형을 따라 어느 방향으로든 객체가 자유롭게 이동할 수 있으며 객체는 지형에 따라서 자동으로 조정된다.

Step 5 : 3D 레벨 네비게이션


럼버야드의 뷰포인트 컨트롤은 FPS 게임과 유사하게 되어 있다.

WASD : 앞뒤좌우 방향 이동

마우스 휠 클릭 후 드래그 : 위아래좌우 방향 이동

마우스 휠 : 화면 확대 / 축소

마우스 우측 클릭 후 드래그 : 시야 각도 이동

Step 6 : 에디터


View -> Open View Pane

Step 7 : 디스플레이 옵션 및 설정


1. 원근 뷰포트 옵션

뷰포터 헤더를 마우스 오른쪽 클릭하여 설정

2. 도움말 보이기 전환

우측 상단의 도움말 아이콘을 클릭

3. 디스플레이 정보 전환

우측 상단의 디스플레이 정보 아이콘을 클릭

4. 네비게이션 속도 설정

하단의 속도를 조정

.1 : Slow

1 : Normal

10 : Fast

5. AI/물리엔진 전환

하단의 AI/Physics 버튼 클릭

Step 8 : 레이어


룰업바의 레이어 탭은 레벨을 구축할 때 만들어지는 대량의 컨텐츠들을 관리하는데 도움을 준다.

레이어 리스트에서 레이어의 생성, 이름 변경, 저장, 추출이 가능하다.

또한 Ctrl + Drag를 사용하여 원하는 위치에 정확하게 배치하여 레이어를 중첩된 그룹으로 구성할 수 있다.



Step 9 : 자동 백업


Edit -> Editor Settings -> Global Perferences -> Files -> Auto Backup -> Enable 선택



Refernce


[럼버야드 튜토리얼] https://gamedev.amazon.com/forums/tutorials

[개체와 객체의 차이] https://m.blog.naver.com/PostView.nhn?blogId=zzu0e&logNo=220689973139&proxyReferer=https%3A%2F%2Fwww.google.com%2F

+ Recent posts