반응형
이번 글에서는 백준 110번 문제를 통해 이항계수를 활용하고
최대 값을 넘어서는 순간을 다루는 방법을 알아보자.

문제 핵심

  • 서쪽 ( N )
  • 동쪽 ( M )
  • N <= M
  • 최대 한 개의 다리만 연결

풀이 과정

이 문제는 조합론으로 mCn이라고 할 수 있다.

다만 M의 최대값이 30일 때 factorial의 값은 다음과 같다.

 

  • 1! = 1
  • 2! = 2
  • 3! = 6
  • 4! = 24
  • 5! = 120
  • 6! = 720
  • 7! = 5040
  • 8! = 40,320
  • 9! = 362,880
  • 10! = 3,628,800
  • 11! = 39,916,800
  • 12! = 479,001,600
  • 13! = 6,227,020,800
  • 14! = 87,178,291,200
  • 15! = 1,307,674,368,000
  • 16! = 20,922,789,888,000
  • 17! = 355,687,428,096,000
  • 18! = 6,402,373,705,728,000
  • 19! = 121,645,100,408,832,000
  • 20! = 2,432,902,008,176,640,000
  • 21! = 51,090,942,171,709,440,000
  • 22! = 1,124,000,727,777,607,680,000
  • 23! = 25,852,016,738,884,976,640,000
  • 24! = 620,448,401,733,239,439,360,000
  • 25! = 15,511,210,043,330,985,984,000,000
  • 26! = 403,291,461,126,605,635,584,000,000
  • 27! = 10,888,869,450,418,352,160,768,000,000
  • 28! = 304,888,344,611,713,860,501,504,000,000
  • 29! = 8,841,761,993,739,701,954,543,616,000,000
  • 30! = 265,252,859,812,191,058,636,308,480,000,000

한계는 이미 초과했다.

이 때 우리는 각 프로그래밍언어에서 제공하는 클래스를 사용하면 된다.

Java에서는 BigInteger가 있다.

 

핵심 코드

이항 계수1 문제 처럼 나왔지만 이번에는 동쪽이 숫자가 항상 크다.

( 값을 받을 때 반대로 받았다. 헷갈리지 않게 N M으로 선언하는게 좋다. )

int T = Integer.parseInt(bufferedReader.readLine());
int N, K;
BigInteger result;

for (int i = 0; i < T; i++) {
    stringTokenizer = new StringTokenizer(bufferedReader.readLine());
    K = Integer.parseInt(stringTokenizer.nextToken());
    N = Integer.parseInt(stringTokenizer.nextToken());


    result = factorial(N).divide(factorial(K).multiply(factorial(N - K)));
    stringBuilder.append(result).append("\n");
}

 

 

이번 문제는 자료형의 최대값을 한참 넘어서기 때문에,
그 부분만 해결할 수 있다면 이전 이항계수 문제를 활용해 아주 쉽게 풀 수 있는 문제이다.

꼭 BigInteger같은 클래스를 사용하지 않더라도 비슷한 방식으로
직접 문자로 만들어서 처리하는 방법도 존재한다.

 

전체코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.StringTokenizer;

public class Main {

    public static BigInteger factorial(int n) {
        BigInteger result = BigInteger.ONE;
        for (int i = 2; i <= n; i++) {
            result = result.multiply(BigInteger.valueOf(i));
        }
        return result;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer;
        StringBuilder stringBuilder = new StringBuilder();

        int T = Integer.parseInt(bufferedReader.readLine());
        int N, K;
        BigInteger result;

        for (int i = 0; i < T; i++) {
            stringTokenizer = new StringTokenizer(bufferedReader.readLine());
            K = Integer.parseInt(stringTokenizer.nextToken());
            N = Integer.parseInt(stringTokenizer.nextToken());


            result = factorial(N).divide(factorial(K).multiply(factorial(N - K)));
            stringBuilder.append(result).append("\n");
        }

        System.out.println(stringBuilder);
    }
}
반응형
반응형

 

인공지능 모델 선정 중 무겁지 않고, 빠른 학습이 가능한 모델을 찾아보다
MobileNet을 보게 되었고, 여러 블로그와 논문을 보고 정리하는 글이다.

 

 

MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

We present a class of efficient models called MobileNets for mobile and embedded vision applications. MobileNets are based on a streamlined architecture that uses depth-wise separable convolutions to build light weight deep neural networks. We introduce tw

arxiv.org

MobileNet ( 경량 모델 )

  • 모바일 및 임베 디드 비전 애플리케이션 용
  • 깊이별로 분리 가능한 컨볼류션 사용 - 가벼운 깊이를 구축
  • 소규모 네트워크에 관한 많은 논문들은 크기에만 초점을 맞추고 속도는 고려하지 않는데, MobileNet은 속도를 최적화 하는데 중점을 둔다. ( 물론 소규모 네트워크도 제공 하면서 )

Depthwise Separable Convolution

  • MobileNet Model은 Depthwise Separable Convolution을 기반으로 한다.
  • 표준 컨볼루션 ( standard convolution)을 두 단계로 분리하는 방법입니다.
  • 두 단계는 Depthwise Convolution과 1 x 1 PointWise Convolution 이다.
    • Depthwise Convolution: 각 입력 채널에 단일 필터를 적용합니다. 즉, 각 채널은 독립적으로 필터링됩니다.
      • 필터 적용시 Input채널의 개수와 필터의 수는 동일하게 작동합니다.
    • Pointwise Convolution: 이 후, 1×1 크기의 필터를 사용하여 Depthwise Convolution의 출력들을 결합합니다.

기존 표준 컨볼루션( Standard Convolution )의 총 연산량

  • Dk : 입력 값의 크기
  • M : 채널 입력 수
  • N : 출력 채널 수
  • Df : filter 크기

Depthwise Separable Convolution

  • Depthwise Convolution은 각 채널에 대해 개별적인 필터를 적용

Depthwise Separable Convolution

  • Depthwise Convolution은 각 채널에 대해 개별적인 필터를 적용

Depthwise Separable Convolution + Pointwise Convolution 연산량


Mobile Net Body Architecture

  • 초반부: 3×3 Conv + Depthwise Separable Convolution로 채널 확장
  • 중반부: Depthwise Conv를 반복해 특징 추출
  • 후반부: 1×1 Pointwise Conv로 연산량 줄이고 Global Average Pooling 적용
  • 마지막: Fully Connected Layer + Softmax로 최종 분류

 

  • 전체 연산량 중 **1×1 컨볼루션 (Pointwise Conv)**이 94.86% 차지 → 모델 최적화의 핵심!

Width Multiplier ( α )

  • 경량 네트워크이긴 하나, 특정 사용 사례에 맞춰 더 작은 모델이 필요할 수 있다.
  • Width Multiplier (α) 라는 매개변수를 도입하여 네트워크의 전체적인 채널 수를 줄이는 방식을 사용.
  • 특정 레이어에서 **입력 채널 수(M)과 출력 채널 수(N)**를 α 배로 줄임.
    • 입력 채널: αM
    • 출력 채널: αN

ex) 기본 MobileNet에서 어떤 레이어의 필터 수가 64라면,

  • α = 1.0 (기본 모델) → 64개
  • α = 0.75 → 48개
  • α = 0.5 → 32개
  • α = 0.25 → 16개

MobileNet의 연산량과 파라미터 수는 α² 비율로 감소.

  • 예를 들어 α = 0.5로 설정하면, 기본 모델 대비 연산량과 파라미터 수가 약 1/4로 줄어듦.

Resolution Multiplier ( ρ )

  • MobileNet에서 입력 이미지와 내부 feature map 크기를 줄이는 하이퍼파라미터입니다.
  • 연산량이 ρ² 비율로 감소 (해상도가 줄어들면 픽셀 개수가 제곱 비율로 감소하기 때문)

ex ) 이미지 해상도가 224, 224 라면,

  • ρ = 1.0 → 해상도 유지 (224×224)
  • ρ = 0.75 → 해상도가 75%로 감소 (192×192)
  • ρ = 0.5 → 해상도가 50%로 감소 (112×112)
  • ρ = 0.25 → 해상도가 25%로 감소 (56×56)

트레이드 오프 ( Trade-off )

  • α를 줄이면 모델 크기가 감소하여 속도가 빨라지지만, 정확도도 떨어질 수 있음.
  • 적절한 α 값을 선택하여 성능과 속도의 균형을 맞추는 것이 중요.
  • 연산량이 ρ² 비율로 감소하여 속도가 빨라지지만, 정확도도 떨어질 수 있음.
  • 하지만 해상도가 줄어들면 모델의 정확도가 낮아질 가능성이 있음

 


무거운 모델에 비해 다소 정확도가 낮을 수 있지만 ,
소규모 모델은 빠른 속도와 더 적은 리소스를 요구하는 장점이 있다.

이러한 점들을 고려하여 현재 모델을 배포할 환경에 맞는 선택을 하는 것이 중요하다.
또한, 데이터 가공 역시 중요한 요소이므로 이를 병행하여 고려하는 것이 좋다.
반응형
반응형
내 컴퓨터를 시작으로 지인 컴퓨터 3대 조립하였다.
이번에도 지인 컴퓨터 주문이 또 들어왔다.
이번에는 그림작업 위주의 사양에 맞추긴 하지만, 
금액적 한계로 본체 + 모니터 약 200 안으로 맞추기로 하였다.

 

부품 선정

조립시 필요한 부품은 다음과 같다. ( 본체 )

  1. CPU
  2. 메인보드
  3. 그래픽 카드
  4. CPU 쿨러
  5. 램 카드
  6. ssd
  7. 파워
  8. 케이스

주로 다나와 PC견적에서 부품 선정 후 가격비교로 하나씩 구매하는 방식으로 구매하고 있다. 총 실 구매가 ( 카드 - 188만 )

 

선정 순서

선정 하기 전에 항상 부품 시장 조사를 하는게 아니다 보니 이런 요청이 있을 때마다 단기적으로 찾아보곤 한다.

그 때마다 즐겨보는 유튜버가 있는데 정말 초보자도 이해가 쉽게 엑셀로 정리하여 설명해주신다. 한 번 참고하길 바란다.

( 저렇게 엑셀에 하나하나 정리한 거 보고 참 대단한 사람이다 느낀다 )

 

 

1. 메인 보드 + CPU + 쿨러

메인보드와 CPU 호환성, CPU에 온도에 맞는 쿨러 선정이 우선시 된다고 생각하기에 항상 처음으로 선정한다.

CPU는 주로 I사을 선호한다.

( 물론 작업만 할 경우 높은 가격의 제품들이 필요하고 그럴 경우 멀티코어의 R사도 추천하지만,

진짜 작업만 할거라면 아예 A사 제품을 추천한다. )

그러나 겸사겸사 게임도 하고 여러 취미 생활과 중간 레벨(가격) 때문에 I사이 복합적으로 괜찮다.

 

메인보드는 항상 A사를 선호하는 편이다.

메인보드은 M사 와 A사를 생각하는데 같은 기판 기준 A사가 좀 더 낫다는 평이 많기도 하고, 쿨링 면에서도 우수하다.

( 실제로 A사 노트북을 사용했는데 온도 관리 측면에서 만족했다. )

다만 요즘 A/S 문제가 있다고 하는데 이 점 참고하면 되겠다.

 

쿨러는 공냉과 수냉 선택이 먼저인데, 내 컴퓨터는 수냉이지만, 조립 요청한 지인들 모두 공냉으로 맞춰드렸다.

이유는 둘 다 물론 관리 해야하지만, 할 줄 모른다면 공냉이 가격적으로도 괜찮다.

공냉도 영상에서 본 것으로 추천한다.

2. 그래픽 카드 ( + 램 카드 )

이후 가격에 맞춰서 그래픽 카드를 선정한다.

 

R사 제품도 괜찮다는 평이 몇 년전부터 있긴 했으나 N사에 대한 개인적인 생각이 확고하기 때문에 N사를 선호한다.

아직까지는 하드웨어가 비슷한 수준이라고 할 수 있으나 소프트웨어 측면에서는 아직까지는 R사는 힘들지 않나 라고 생각한다. 그만큼 지원이 많이 되는 N사 소프트웨어를 생각했을 때, 좀 더 가격을 주더라도 N제품을 사용할 것이다.

 

램 카드는 요즘 발전하는 속도에 비하면 최소 16G 이상이다. 여유가 있다면 32G 가 좋다.

사실 브랜드는 S사를 선호 했지만, 사실 오버 쿨럭(높은 성능) 할게 아니라면 가성비를 챙기는 게 좋은 것 같다.

때문에 영상에서 본 T사 추천한다. 

3. 파워와 그 외 나머지

솔직히 파워는 S사이다. 품질상으로는 좋다고 느끼지만 가격이 비싼거는 사실이다.

같은 크기의 파워로 놓고 봤을 때 가성비를 찾는다면 M사 정도로 생각하며, 파워 전력이 올라간다면 높은 등급을 고려했으면 한다.

 

SSD카드도 가성비를 놓고 보면 많지만, 현재 IT 세계에서 제일 중요한 것은 데이터다.

물론 그 데이터를 인터넷에서 지키는 것도 중요하지만, 하드웨어적으로도 높은 품질을 유지해야하기 때문에 S사 추천한다.

 

케이스는 요즘 그래픽 카드를 생각했을 때 튼튼한게 최고다.

요즘은 그래픽 카드 지지대도 포함되서 온다.

처음 조립 당시에는 그런게 없었는데..

가격대 별로 있으나 여러개 있으나 D사 추천한다.

 

조립

이번에는 나름 선 정리한다고 해서 정리해 보았다.

 

작동 테스트

 

인식 확인

그래픽 드라이버 확인

매번 150 ~ 200만원의 부품들이 왔다갔다 하는데
솔직히 이제는 익숙하다고 해도 무섭다. 실수라도 하면 수십만원이 사라진다.
( 실제로 본인 본체 업그레이드 중 기존의 SSD 카드 저장 메모리 부분을 깨먹어서 날려먹었다... )
지인 컴퓨터에서는 실수한 적 없으나 다들 조심하여 조립하기 바란다.

더 나은 조립이나 의견있으면 댓글로 남겨주시면 감사하겠습니다.  
반응형

+ Recent posts