반응형

문제 출처

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


nCr = nCn-r 이라는 성질을 알고 있다면 쉽게 풀 수 있는 문제입니다.



#include <iostream>

#include <algorithm>

using namespace std;


int N, R;


void sol()

{

ios_base::sync_with_stdio(0);

cin.tie(0);


while (true) 

{

long long ret = 1;

cin >> N >> R;


if (N == 0 && R == 0)

break;


//이항계수의 성질

R = min(R, N - R);


for (int i = 1; i <= R; i++) {

ret *= N;

ret /= i;

N--;

}

cout << ret << endl;

}

}


int main()

{

sol();

return 0;

}



반응형

'Algorithm' 카테고리의 다른 글

[BOJ 2309] 일곱 난쟁이  (0) 2018.11.12
[BOJ 3053] 택시 기하학  (0) 2018.11.12
[BOJ 2490] 윷놀이  (0) 2018.11.09
[BOJ 11051] 이항계수2 - 동적계획법  (0) 2018.11.09
[BOJ 11050] 이항계수  (0) 2018.11.09
반응형

문제

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



#include "pch.h"

#include <iostream>


using namespace std;

/*

1 1 1 1 모

1 1 1 0 도

1 1 0 0 개

1 0 0 0 걸

0 0 0 0 윷

*/

char RET[5] = { 'D', 'C', 'B', 'A', 'E' };

void sol()

{

for (int i = 0; i < 3; i++) {

int idx = 0;

for (int j = 0; j < 4; j++) {

bool tmp;

cin >> tmp;

idx += tmp;

}

cout << RET[idx] << endl;

}

}


int main()

{

sol();

return 0;

}

 


반응형

'Algorithm' 카테고리의 다른 글

[BOJ 3053] 택시 기하학  (0) 2018.11.12
[BOJ 6591] 이항 쇼다운  (0) 2018.11.12
[BOJ 11051] 이항계수2 - 동적계획법  (0) 2018.11.09
[BOJ 11050] 이항계수  (0) 2018.11.09
[SW Expert Academy] 1206 View  (0) 2018.11.06
반응형

문제

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


사실 이항계수의 성질만 잘 알고 있다면 쉽게 풀 수 있는 문제입니다.

파스칼의 법칙? 인가요? nCr = (n-1)Cr + (n-1)C(r-1) 입니다.


#include "pch.h"

#include <iostream>

#include <stdlib.h>


using namespace std;

const int MAX = 1001;

const int MOD = 10007;

int N, K;

int cache[MAX][MAX];

void init()

{

for (int i = 1; i <= N; i++)

{

cache[i][1] = i;

cache[i][i] = cache[i][0] = 1;

}

}

void sol()

{

for (int i = 3; i <= N; i++) {

for (int j = 2; j < i; j++) {

cache[i][j] = cache[i - 1][j] % MOD + cache[i - 1][j - 1] % MOD;

}

}

}

int main()

{

cin >> N >> K;

if (N < 1 || N >= MAX || K<0 || K>N)

exit(-1);


init();

sol();

cout << cache[N][K] %MOD << endl;

return 0;

}



반응형

'Algorithm' 카테고리의 다른 글

[BOJ 6591] 이항 쇼다운  (0) 2018.11.12
[BOJ 2490] 윷놀이  (0) 2018.11.09
[BOJ 11050] 이항계수  (0) 2018.11.09
[SW Expert Academy] 1206 View  (0) 2018.11.06
[SW Expert Academy] 1204 최빈수 구하기  (0) 2018.11.06
반응형

문제

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


#include "pch.h"

#include <iostream>


using namespace std;

//N<=10 K<=N 인 자연수


int sol(int n)

{

if (n == 0)

return 1;


int ret=1;

for (int i = n; i >= 1; i--)

ret *= i;


return ret;

}


int main()

{

int n, k;

cin >> n >> k;

cout << sol(n) / (sol(k)*sol(n - k));

return 0;

}

 


반응형
반응형


문제 출처

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV134DPqAA8CFAYh


직관적인 방법으로 풀이하였습니다. 처음에 ret 변수를 전역변수로 두고 매 실행시 초기화를 하지 않아 테스트케이스 오류가 나와 많이 헤맸던 문제.... 역시 처음부터 실수하지 않고 짜는게 중요한거 같습니다. 제가 짠 코드에서 오류를 찾으려니 너무 어렵군요 ㅠㅠ 문제자체는 간단한 문제입니다!


#include <iostream>

#include <algorithm>

#include <string.h>


using namespace std;


const int MAX = 1000;

int map[MAX];

int caseNum;

void solution()

{

    int tc;

    int ret=0, tmp=0;

    memset(map, 0, sizeof(map));

    caseNum++;

    scanf("%d", &tc);

    for(int i=0;i<tc;i++)

       scanf("%d", &map[i]);

    

    for(int i=2;i<tc-2;i++)

    {

        tmp = map[i] - max(max(map[i-1], map[i-2]), max(map[i+1], map[i+2])); 

        if(tmp > 0)

            ret+=tmp;

    }

    cout<<"#"<<caseNum<<" "<<ret<<endl;

}

int main(void)

{

    for(int i=0;i<10;i++)

        solution();

    return 0;   





반응형
반응형

문제 출처

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV13zo1KAAACFAYh



#include <iostream>

#include <string.h>


using namespace std;

const int STUDENT = 1000;

int T,testNum,ret;

int arr[101];

int main(void)

{

int score;

scanf("%d",&T);

while(T--)

{

int max=0;

memset(arr,0,sizeof(arr));

scanf("%d", &testNum);


for(int i=0; i<STUDENT; i++)

{

scanf("%d", &score);

arr[score]++;


if(arr[score]>max)

max=arr[score];

}


for(int i=0; i<101; i++)

{

if(arr[i]==max)

ret=i;

}

cout<<"#"<<testNum<<" "<<ret<<endl;

}

return 0;


반응형
반응형

 코딩인터뷰 완전분석에 집필된 문제를 풀이하는 게시글 입니다. 문제공개로 인한 문제가 생길 시 삭제하도록 하겠습니다.


-- 문제

/****************************************************************************************************

자료구조 03 스택과 큐

2018.11.02

3.1 하나의 배열을 사용해 세 개의 스택을 구현

3.2 push와 pop 두 가지 연산과 함께 최솟값을 반환하는 min을 갖춘 스택을 구현

push, pop, min은 O(1)시간에 처리되도록 구현하시오

3.3 접시 무더기 높이가 특정 수준 이상으로 높아지면 새로운 무더기를 만드는 자료구조 SetOfStacks를 구현

SetOfStacks는 여러 스택으로 구성되어야 하며, 이전 스택이 지정된 용량을 초과하는 경우

새로운 스택을 생성해야 한다. push()와 pop()은 스택이 하나인 경우와 동일하게 동작하도록 구현하시오

3.4 하노이탑 문제 

한번에 하나만 옮길 수 있으며 탑의 맨 꼭대기에 있는 원판은 옆에 있는 탑으로 옮길 수 있다.

    원판은 자기보다 지름이 큰 원판 위로만 옮길 수 있다. 스택을 사용하여, 첫 번째 탑에 있는 모든 원판을

마지막 탑으로 옮기는 프로그램을 구현하시오.

****************************************************************************************************/ 



3.1 Solve

 간단한 문제입니다. 조금만 생각하면 풀 수 있는 문제이며 저는 각각의 스택사이즈를 가정하고 배열을 스택사이즈 * 3으로 선언했습니다. 1/3은 1번째 스택, 1/3 ~ 2/3 까지는 2번째 스택 나머지는 3번째 스택으로 나눠서 구현했습니다.

#include <iostream>

#include <algorithm>

#include <vector>

#include <string.h>

#include <string>


using namespace std;

//solve 3.1 -- start

const int STACKSIZE = 100;

int s[STACKSIZE * 3];

int top[3] = {-1, -1, -1}; //3개의 스택 top포인터


int getTop(int nStack)

{

return nStack*STACKSIZE + top[nStack];

}

void push(int nStack, int value)

{

top[nStack]++;

s[getTop(nStack)] = value;

}

int pop(int nStack)

{

int ret = s[getTop(nStack)];

s[getTop(nStack)] = 0; //value 0으로 초기화

top[nStack]--; //top값 1 감소

return ret;


3.2 Solve

 저는 최솟값을 저장하는 Stack을 하나 더 만들어 구현했습니다. push연산과 pop연산이 이루어질 때 top과 minTop이 동시에 연산이 진행하도록 구현했습니다. 


 


#include <iostream>

#include <algorithm>

#include <vector>

#include <string.h>

#include <string>


using namespace std;

// solve 3.2 push, pop, min O(1)시간 처리 스택 구현


typedef struct node {

int data;

struct node* next;

} Node;


class Stack {

private:

int cnt;

Node* top;

Node* minTop;

public:

Stack();

void push(int);

int pop();

int min();

bool isEmpty();

};


Stack::Stack() {

cnt=0;

top=NULL;

};

void Stack::push(int data) {

Node *newNode = new Node;

newNode->data=data;

if(isEmpty()) {

top=newNode;

minTop=newNode;

} else {

newNode->next=top;

top=newNode;

if(newNode->data <= minTop->data) {

newNode->next=minTop;

minTop=newNode;

}

}

}

int Stack::pop() {

if(isEmpty())

exit(1);

int ret=top->data;

if(minTop->data == ret) {

minTop=minTop->next;

}

top=top->next;

return ret;

}

int Stack::min() {

return minTop->data;

}

bool Stack::isEmpty() {

if( top == NULL )

return true;

else

return false;

}





반응형
반응형

[ 이글은 Effective Java를 참고하여 작성하였습니다 ]



생성자를 따로 만들지 않으면 컴파일러는 자동으로 인자가 없는 public 기본 생성자를 만든다. 사용자는 이 생성자를 일반 생성자와 구별할 수 없으므로 원래 의도와는 달리 객체 생성이 가능한 클래스로 될 위험이 존재한다. 또한 객체를 만들 수 없게 하기 위해 abstract(추상) 클래스로 선언해 봤자 하위 클래스를 정의하는 순간 객체 생성이 가능해 지기 때문에 무용지물이다. 


이런 경우에는 private 생성자를 클래스에 넣어서 객체 생성을 방지할 수 있다. 명시적으로 정의된 생성자가 private이므로 클래스 외부에서 사용하는 것은 불가능 하기 때문이다.

public class UtilityClass {

     // 기본 생성자가 자동 생성되지 못하도록 하여 객체 생성 방지

     private UtilityClass() {

          throw new AssertionError();

     }

}


이와 같이 구현한다. 이때 AssertionError는 꼭 필요하지는 않지만 클래스 안에서 실수로라도 생성자를 호출했을 때 알기 위해 한 것이며, 생성자를 명시적으로 구현했음에도 불구하고 호출할 수 없다는 것이 직관적이지 않으므로 위에 보인 것처럼 주석을 달아두는 것이 좋다.



반응형
반응형

[ 이 글은 Effective Java를 참조하여 작성되었습니다. ]


 싱글턴 패턴에 대해서 모르시는 분은 먼저 싱글턴 패턴에 대해 공부하고 오시는 것이 좋습니다.

 싱글턴은 간단하게 객체를 하나만 만들 수 있는 클래스 입니다. 때문에 보통 유일할 수 밖에 없는 컴포넌트를 나타내곤 하죠. 하지만 클래스를 싱글턴으로 만들면 테스트하기가 어려울수도 있습니다. 싱글턴 패턴을 구현하는 방법은 크게 2가지가 있습니다. 두 방법 모두 생성자는 private이고 객체는 static멤버를 이용합니다.

 첫번째 방법은 정적 멤버를 final로 선언하는 것입니다. 

public class Sw{

     public static final Sw INSTANCE = new Sw();

     private Sw(){ ... }

     메소드...

}


와 같은 방식이죠. private 생성자는 INSTANCE를 초기화 할 때 단 한번만 호출됩니다. public 또는 protected로 선언된 생성자가 없기 때문에 오로자 하나만 존재하게 되는거죠. 


 두번째 방법은 정적 팩토리 메서드를 사용하는 것입니다. 

public class Sw{

     private static final Sw INSTANCE = new Sw();

     private Sw() { ... }

   

     public static Sw getInstance() { return INSTANCE; }

}


와 같은 방식입니다. 여기서 getInstance는 항상 같은 객체만을 return 해줍니다. 이 두가지 방법은 JDK 1.5이전에 주로 사용하던 방법이기 때문에 최적의 방법은 아닐 수도 있습니다. 왜냐하면 최신 Java Virtual Machine은 정적 팩토리 메서드를 항상 인라인 처리하기 때문입니다. 하지만 이 정적 팩토리 메서드를 사용하는 방식은 2가지의 장점이 존재합니다.


(1) API를 변경하지 않고도 싱글턴을 포기할 수 있다는 것입니다.


싱글턴 객체를 참조하는 유일한 필드가 private이므로 이를 지우고 getInstance의 구현을 변경해도 API는 영향을 받지 않겠죠.


(2) 제네릭 타입을 수용하기 쉽다.


간단히 설명하자면 자료형 유추가 가능하고, 형 안정성을 제공할 수 있다는 것이다. 하지만 이 장점이 필요 없는 경우도 많습니다. 

이럴 때는 public 필드를 사용하는 쪽이 더 간단합니다.



그렇다면 JDK 1.5 이후에는 어떤 방법을 사용하는지 알아봅시다.

바로 원소가 단 하나뿐인 enum 자료형을 정의하는 방법입니다.

public enum Sw{

     INSTANCE;



 이와 같은 방법은 기능적으로는 public 필드를 사용하는 방법과 동등하지만 좀 더 간결하다는 것과 직렬화가 자동으로 처리된다는 장점이 있다. 또한, enum은 인스턴스가 여러 개 생기지 않도록 확실하게 보장해주며 유일한 INSTANCE가 생성될 떄, 멀티 쓰레드 환경에서 안전하기도 하다.

Effective Java에서는 enum을 사용하는 것이 가장 좋은 방법이라고 언급하고 있다. 하지만 enum은 익숙하지 않은 방법이라 자주 사용할지는 모르겠지만 의식적으로라도 한 번씩 사용하도록 노력해야겠다.

반응형
반응형

Web에 관련된 자료를 보게 되거나 혹은 API를 보게 되었을 때 가장 많이 보이는 단어가 REST란 단어였다. 하지만 REST란 단어만 알고만 있을 뿐 자세한 의미는 무엇인가.... 사실 알지 못했다. 그래서 이번 기회에 RESTful API에 대해 정리를 시작해보려고 한다.

요약하자면 GET, POST, PUT, DELETE 이 4가지로 요약할 수도 있겠다.


REST는 Representational State Transfer 약자로 웹의 장점을 최대한 활용활 수 있는 아키텍처라고한다...

조금 더 상세히 설명해보면 HTTP URI를 통해 resource를 명시하고! HTTP Method(GET, POST, PUT, DELETE)를 통해 해당 resource에 대한 CRUD operation을 적용하는 것이다. 즉 REST는 HTTP Method를 통해 resource를 처리하도록 설계된 아키텍처를 뜻한다.

즉, RESTful 이란 HTTP와 URI 기반으로 자원에 접근할 수 있도록 제공하는 어플리케이션 개발 인터페이스라고 할 수 있다.


아래 표는 HTTP 메서드와 CRUD operation에 대한 매핑관계이다.


 METHOD

CRUD 

POST 

Create 

GET

Read 

PUT

Update 

DELETE 

Delete 


그럼 간단한 게시판을 구현한다고 생각하고 RESTful 웹서비스 URI와 메서드들을 정의해 보자. 그 전에 기존 웹서비스를 생각하면 로컬기준

localhost:8080/users.jsp?id=1234로 제공되었다. 하지만 RESTful하게 설계한다면 다음과 같이 정의된다. (localhost:8080/users/1234)


Action 

Resource URI 

HTTP Method 

 사용자 목록

/users 

GET 

 사용자 보기

/users/{id} 

GET 

 사용자 등록

/users 

POST 

 사용자 수정

/users/{id} 

PUT 

 사용자 삭제

/users/{id} 

DELETE 


RESTful에서 4개의 HTTP Method만을 사용하는 이유는 가장 추상적인? 동사이기 때문입니다. 예를 들어 우리는 라면을 먹을수는 있고 모니터를 먹을수는 없겠죠. 하지만 라면을 GET할수도 모니터를 GET할수는 있습니다. 이러한 예시처럼 특정한 동사들은 한정적인 경우에 사용할 수 있기 때문입니다. 사실 이 4가지로는 세상을 표현하는게 어려울 수도 있겠지만 앞서 말했듯이 가장 추상적이라고 말씀드렸습니다. 추상화를 잘 한다면 RESTful한 설계를 완성하는 것은 무리가 아닐 것입니다!


사실 깊게 들어가면 RESTful하기 위해서는 ROA속성과 연관되기 때문에 ROA에 대해 잘 이해한 후 디자인해야 한다.

하지만 RESTful한 것은 HTTP 메소드와 응답코드가 모호하기 때문에 그 뜻이 정확히 뭘 의미하는지 사람마다 다르게 인식하기 때문에 (물론 따지고보면 그걸 모르는 사람의 문제라고 생각한다) 탄생?된것처럼 정답은 없다고 생각한다.(개인적 생각)

RESTful은 모든 것을 만족해야 하는게 아니라 그 중 쓰고 싶은 개념을 가져다 쓰면 된다고 생각한다. 어쨋든 REST에 대해 간략히 정리해 보았지만 부족한 내용이라는 것은 인정하고 넘어가야겠다.(추가적으로 학습 후 수정하겠습니다 ㅠ)

반응형

+ Recent posts