반응형

문제

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


for문 전체를 break해야 하는 문제. 정말 많이 헤맸다 ㅠㅠ



#include <iostream>

#include <algorithm>

#include <stdlib.h>


using namespace std;


#define N 9

#define MAX 100

int arr[N];

bool breakFlag=false;

void sol()

{

int tmp=0;

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

cin >> arr[i];

tmp += arr[i];

}


for (int i = 0; i < N - 1; i++) {

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

if (tmp - arr[i] - arr[j] == MAX)

{

arr[i] = -1;

arr[j] = -1;

breakFlag = true;

}

}

if (breakFlag)

break;

}

sort(arr, arr + N);

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

cout << arr[i] << endl;

}


int main()

{

sol();

return 0;

}



반응형

'Algorithm' 카테고리의 다른 글

[프로그래머스] K번째 수  (0) 2018.11.14
[BOJ 2293] 동전 1  (0) 2018.11.12
[BOJ 3053] 택시 기하학  (0) 2018.11.12
[BOJ 6591] 이항 쇼다운  (0) 2018.11.12
[BOJ 2490] 윷놀이  (0) 2018.11.09
반응형

문제 출처

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


#include <iostream>

#include <algorithm>


#define M_PI 3.14159265358979323846


using namespace std;


void sol()

{

ios_base::sync_with_stdio(0);

cin.tie(0);

double r;

cin >> r;


//소수점 6자리 고정

cout << fixed;

cout.precision(6);


cout << r * r*M_PI << "\n";

cout << r * r * 2 << "\n";

}


int main()

{

sol();

return 0;

}



반응형

'Algorithm' 카테고리의 다른 글

[BOJ 2293] 동전 1  (0) 2018.11.12
[BOJ 2309] 일곱 난쟁이  (0) 2018.11.12
[BOJ 6591] 이항 쇼다운  (0) 2018.11.12
[BOJ 2490] 윷놀이  (0) 2018.11.09
[BOJ 11051] 이항계수2 - 동적계획법  (0) 2018.11.09
반응형

문제 출처

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;

}





반응형
반응형

문제 링크

https://algospot.com/judge/problem/read/PI


핵심은

 

길이 3일때 난이도 + 나머지 수열 최적해

길이 4일때 난이도 + 나머지 수열 최적해

길이 5일때 난이도 + 나머지 수열 최적해


를 구하는 것인데 이때!

나머지 수열의 최적해를 구할때는 어떻게 나눴는지 중요하지 않다는 것입니다. 


어떤 자릿수 n부터 외우기 시작한다고 가정한다면

{n, n+1, n+2}

{n, n+1, n+2, n+3}

{n, n+1, n+2, n+3, n+4} 의 난이도를 구한 이후 최솟값을 사용하는 것입니다.


 //

//  main.cpp

//  AlgorihmStudy

//

//  Created by sw on 2018. 9. 19..

//  Copyright © 2018년 sw. All rights reserved.

//

#include <cstdio>

#include <string.h>

#include <string>

#include <iostream>

#include <algorithm>

#include <queue>

#include <stack>

#include <vector>

#include <functional>

const int INF = 987654321;

using namespace std;


string input;

int dp[10002];


int getLevel(int head, int tail)

{

    string temp=input.substr(head,tail-head+1);

    // 모든 숫자가 같은 경우

    if(temp == string(temp.size(), temp[0]))

        return 1;

    // 숫자가 1씩 단조 증가 || 단조 감소

    bool isProgress=true;

    for(int i=0;i<temp.size()-1;i++)

    {

        if(temp[i+1]-temp[i] != temp[1]-temp[0])

            isProgress=false;

    }

    if(isProgress && abs(temp[1]-temp[0])==1)

        return 2;

    // 두 개의 숫자가 번갈아나타남

    bool isRotate=true;

    for(int i=0;i<temp.size();i++)

    {

        if(temp[i] != temp[i%2])

            isRotate=false;

    }

    if(isRotate)

        return 4;

    // 등차 수열

    if(isProgress)

        return 5;

    // 이외의 모든 경우

    return 10;

}


int solve(int start)

{

    // 기저사례

    if(start == input.size())

        return 0;

    int& ret=dp[start];

    if(ret != -1)

        return ret;

    

    ret=INF;

    

    for(int i=3; i<=5; i++)

    {

        if(start+i <= input.size())

            ret=min(ret,solve(start+i) + getLevel(start, start+i-1));

    }

    return ret;

}


int main(int argc, const char * argv[]) {

    int tc;

    scanf("%d",&tc);

    //기저 사례

    if(tc<0 || tc>51)

        exit(-1);

    while(tc--)

    {

        memset(dp,-1,sizeof(dp));

        cin>>input;

        cout<<solve(0)<<endl<<endl;

    }

    return 0;

}


반응형

+ Recent posts