반응형


문제 출처

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


문제풀이

1. 문자열 풀이

/**
* 폭탄문자열 끝과 결과값의 끝이 같다면 폭탄문자열이 포함되어 있는지 검사한다.
* 만약 포함되어 있다면 그 문자열의 길이만큼 결과값에서 지워주면 되는 문제.
* 중간에 포함되어 있어도 일단 끝문자를 첫 기준으로 삼기 때문에 연쇄적으로 폭발시킬 수 있다.
*/


2. 스택 풀이

/**
* 아이디어는 스택에 push할때 int값을 같이 push해줘서 int값이 폭탄 문자열 길이와 같다면 pop해주는 것이다.
* 먼저 stack에 input문자열을 push한다. 이때 문자열과 현재 문자열로부터 폭탄문자열과 몇번째로 같은지 같이 push한다.
* 예시를 들어 설명하면 AWSASWA가 input이고 폭탄 문자열이 SW라고 가정한다.
* 스택에는 다음과 같이 입력될 것이다.
* (A,0) / (W,0) / (S,1) / (A,0) / (S,1) / (W,2) / (A,0)
* 이 때 폭탄문자열의 길이가 2이므로 int값이 2일때 2개만큼 pop을 해준다.
*/


소스코드


1. 문자열 풀이


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string>
using namespace std;
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    string input, bomb, result;
    cin>>input>>bomb;
    int inputSize=input.size();
    int bombSize=bomb.size();
    for(int i=0; i<inputSize; i++) {
        result.push_back(input[i]);
        bool searchBomb = true;
        if(result.back() == bomb.back() && result.size() >= bombSize) {
            for(int j=0; j<bombSize; j++) {
                if(bomb[j] != result[result.size() -bombSize +j]) {
                    searchBomb = false;
                    break;
                }
            }
            if(searchBomb) {
                result.erase(result.size()-bombSize, bombSize);
            }
        }
    }
    if(result.empty())
        cout<<"FRULA";
    else
        cout<<result;
    return 0;
}
cs


2. 스택 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    string input, bomb;
    cin>>input>>bomb;
    stack<pair<charint> > st;
    int inputSize=input.size();
    int bombSize=bomb.size();
    int sameBombCnt=0;
    for(int i=0; i<inputSize; i++) {
        if(input[i] == bomb[0]) sameBombCnt=1;
        else if(input[i] == bomb[sameBombCnt]) sameBombCnt++;
        else sameBombCnt=0;
        st.push(make_pair(input[i], sameBombCnt));
        if(bombSize == sameBombCnt) {
            for(int j=0; j<bombSize; j++)
                st.pop();
            if(!st.empty()) sameBombCnt=st.top().second;
            else sameBombCnt=0;
        }
    }
    if(st.empty()) cout<<"FRULA";
    else {
        char result[st.size()];
        result[st.size()]='\0';
        for(int i=st.size()-1; i>=0; i--) {
            result[i]=st.top().first;
            st.pop();
        }
        cout<<result;
    }
    return 0;
}
cs


반응형

'Algorithm' 카테고리의 다른 글

[BOJ 10974] 모든 순열  (0) 2019.02.25
[BOJ 9996] 한국이 그리울 땐 서버에 접속하지  (0) 2019.02.22
[BOJ 1764] 듣보잡  (0) 2019.02.20
[BOJ 1213] 펠린드롬 만들기  (0) 2019.02.19
[BOJ 1431] 시리얼 번호  (0) 2019.02.18
반응형

문제출처

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


문제풀이

/**
* vector를 2개 사용해서 단순 비교한 뒤 같다면 answer에 추가해주는 방식으로 진행했더니
* 시간초과가 났다. 2개를 사용하지 않고 하나에 입력을 받아 compare해준 뒤 같다면
* answer에 추가해주는 방식으로 풀이. 사실 문제이름이 재미있어서 선택했는데
* 너무 쉬운문제였다는 것이 함정.
*/


소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int n,m;
    cin>>n>>m;
    vector<string> dbj(n+m), answer;
 
    for(int i=0; i<n+m; i++)
        cin>>dbj[i];
    sort(dbj.begin(), dbj.end());
 
    for(int i=1; i<n+m; i++)
        if(dbj[i].compare(dbj[i-1]) == 0)
            answer.push_back(dbj[i]);
 
    cout<<answer.size()<<"\n";
    for(string name : answer) cout<<name<<"\n";
 
    return 0;
}
cs


반응형

'Algorithm' 카테고리의 다른 글

[BOJ 9996] 한국이 그리울 땐 서버에 접속하지  (0) 2019.02.22
[BOJ 9935] 문자열 폭발  (0) 2019.02.21
[BOJ 1213] 펠린드롬 만들기  (0) 2019.02.19
[BOJ 1431] 시리얼 번호  (0) 2019.02.18
[BOJ 1937] 욕심쟁이 판다  (0) 2019.02.15
반응형

문제출처

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


문제풀이

/**
* 1. 홀수개인 알파벳이 2개 이상이라면 펠린드롬을 만들 수 없음,
* 2. 짝수개인 알파벳을 n/2개 나열하고 홀수개인 알파벳을 나열한 후
* 나머지 짝수개 알파벳을 역순으로 나열하면 펠린드롬이 생성
*
* 정리하면 input 길이가 홀수라면 홀수개인 알파벳이 1개여야 하며,
* input 길이가 짝수라면 모든 알파벳의 갯수도 짝수개여야 한다.
* 이 조건을 통과하면 사전순으로 출력하는 문제이다. a~z까지 n/2개씩 출력하고
* 거꾸로 z~a까지 절반을 출력하면 사전순으로 출력된다.
*/


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <string>
 
using namespace std;
 
int alpha[26];
 
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    string input,answer="";
    cin>>input;
    int len = input.size();
    for(int i=0; i<len; i++) alpha[input[i]-'A']++;
    int oddCnt=0, center=-1;
    for(int i=0; i<26; i++) {
        if(alpha[i]%2) {
            oddCnt++;
            center=i;
        }
    }
    if((len%2 && oddCnt!=1|| (!(len%2&& oddCnt)) {
        cout<<"I'm Sorry Hansoo";
        return 0;
    }
 
    for(int i=0; i<26; i++)
        for(int j=0; j<alpha[i]/2; j++)
            answer+=(char)i+'A';
 
    if(center>-1) answer+=(char)center+'A';
 
    for(int i=25; i>=0; i--)
        for(int j=0; j<alpha[i]/2; j++)
            answer+=(char)i+'A';
 
    cout<<answer;
    return 0;
}
cs


반응형

'Algorithm' 카테고리의 다른 글

[BOJ 9935] 문자열 폭발  (0) 2019.02.21
[BOJ 1764] 듣보잡  (0) 2019.02.20
[BOJ 1431] 시리얼 번호  (0) 2019.02.18
[BOJ 1937] 욕심쟁이 판다  (0) 2019.02.15
[BOJ 10989] 수정렬하기3  (0) 2019.02.15
반응형

문제출처

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


문제풀이

/**
* 단순 문제대로 구현하면 되는 문제이다.
* 다만 주의할 점은 1번 2번 조건이 부합하지 않는 경우에만
* 3번조건으로 정렬한다는 것이다. 처음에 c++로 채점을 해서 계속 틀렸는데
* c++14로 하니 맞았다 왜인지는 모르겠지만 ide도 c++14를 사용해서 앞으로는
* c++14로 제출해야겠다...
*/


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int sum(const string &a) {
    int ret=0;
    for(int i=0; i<a.length(); i++) {
        if((a[i]-'0')>=1 && (a[i]-'0')<=9)
            ret += a[i]-'0';
    }
    return ret;
}
bool comp(const string &a, const string &b) {
    if(a.size() != b.size())
        return a.size() < b.size();
    else {
        int asize=sum(a);
        int bsize=sum(b);
        if(asize != bsize) {
            return asize<bsize;
        } else {
            return a<b;
        }
    }
}
int main(int argc, const char * argv[]) {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int n; cin>>n;
    vector<string> vec_str(n);
    for(int i=0; i<n; i++cin>>vec_str[i];
    sort(vec_str.begin(), vec_str.end(), comp);
    for(int i=0; i<n; i++cout<<vec_str[i]<<"\n";
    return 0;
}
 
cs


반응형

'Algorithm' 카테고리의 다른 글

[BOJ 1764] 듣보잡  (0) 2019.02.20
[BOJ 1213] 펠린드롬 만들기  (0) 2019.02.19
[BOJ 1937] 욕심쟁이 판다  (0) 2019.02.15
[BOJ 10989] 수정렬하기3  (0) 2019.02.15
[BOJ 10814] 나이순 정렬  (0) 2019.02.13
반응형

문제출처

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


문제풀이

/**
* 왜 정렬문제인지 모르겠다.
* dp로 풀이 했으며 전체탐색으로는 시간초과가 난다.
* dp[y][x]는 y에서 x로 올 수 있는 최대값이다.
* 풀이 방법이 dp인 것만 알면 쉽게 풀 수 있었다.
* dp배열을 -1로 초기화 해주고 초기값이 아니라면 return으로 빠져나온다.
* 이후 상하좌우방향에서 dfs를 통해 리턴값+1(하루더 살기때문)과 dp[y][x](현재까지의 최대값)중 큰것을 dp[y][x]에 넣는다.
*/


소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <algorithm>
#include <cstring>
#define MAX 500
 
using namespace std;
 
int n, ans;
int map[MAX][MAX], dp[MAX][MAX];
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
 
int dfs(int y, int x) {
    if(dp[y][x]!=-1return dp[y][x];
    dp[y][x]=1;
    for(int i=0; i<4; i++) {
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx<0 || nx>=|| ny<0 || ny>=|| map[y][x]>=map[ny][nx]) continue;
        dp[y][x]=max(dp[y][x], dfs(ny,nx)+1);
    }
    return dp[y][x];
}
 
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    cin>>n;
    memset(dp, -1sizeof(dp));
    for(int y=0; y<n; y++)
        for(int x=0; x<n; x++)
            cin>>map[y][x];
    for(int y=0; y<n; y++)
        for(int x=0; x<n; x++)
            ans=max(dfs(y,x), ans);
    cout<<ans;
    return 0;
}
cs


반응형

'Algorithm' 카테고리의 다른 글

[BOJ 1213] 펠린드롬 만들기  (0) 2019.02.19
[BOJ 1431] 시리얼 번호  (0) 2019.02.18
[BOJ 10989] 수정렬하기3  (0) 2019.02.15
[BOJ 10814] 나이순 정렬  (0) 2019.02.13
[BOJ 1026] 보물  (0) 2019.02.12
반응형

문제출처

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


문제풀이

/**
* 일반적인 sort로 처음에 풀었는데 메모리초과가 났다.
* 아이디어적인 문제인데 counting sort를 알게 된 문제.
* 이 문제의 핵심은 입력받을 수가 10000까지라는 것이다.
* 정렬문제라고 무조건 sort를 사용하면 안되겠다.
*/


소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int n,input;
    int num[10001]={0,};
    cin>>n;
    for(int i=0; i<n; i++) {
        cin>>input;
        num[input]++;
    }
    for(int i=1; i<=10000; i++) {
        while(num[i]--) {
            cout<<i<<"\n";
        }
    }
    return 0;
}
cs


반응형

'Algorithm' 카테고리의 다른 글

[BOJ 1431] 시리얼 번호  (0) 2019.02.18
[BOJ 1937] 욕심쟁이 판다  (0) 2019.02.15
[BOJ 10814] 나이순 정렬  (0) 2019.02.13
[BOJ 1026] 보물  (0) 2019.02.12
[BOJ 3056] 007  (0) 2019.01.31
반응형

문제출처

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


문제풀이

1
2
3
4
5
6
7
8
9
10
11
12
/**
 * 1. endl 쓰지 않기
 * 2. sort와 stable_sort의 차이
 * endl은 개행문자를 출력할 뿐만 아니라 출력 버퍼를 비우는 역할까지 합니다. 그래서 출력한 뒤
 * 바로 보이게 할 수 있는데 이 버퍼를 비우는 작업이 매우 느립니다. 때문에 endl 대신 "\n"을 쓰는 것으로도
 * 시간향상이 굉장히 많이 나므로 최대한 endl을 사용하지 않는것이 좋습니다.
 * sort = 컨테이너 정렬이 필요할 때 (quick sort)
 * stable_sort = 순서가 유지되어야 할 경우 (merge sort, insertion sort)
 * 시간은 sort < stable_sort 이며 이 문제의 핵심은 나이가 같은 경우
 * 가입한 순서를 유지한 채로 정렬하는 것이기 때문에 stable_sort를 사용해야 한다.
 * STL pair의 정렬은 기본적으로 first를 기준으로 정렬이 되고 first가 같을 경우 second를 사용해서 비교를 하게 된다.
 */
cs


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool comp(const pair<intstring> &a, const pair<intstring> &b) {
    return a.first<b.first;
}
 
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int n; cin>>n;
    vector<pair<intstring> > member(n);
    for(int i=0; i<n; i++cin>>member[i].first>>member[i].second;
    stable_sort(member.begin(), member.end(), comp);
    for(int i=0; i<n; i++cout<<member[i].first<<" "<<member[i].second<<"\n";
    return 0;
}
cs


반응형

'Algorithm' 카테고리의 다른 글

[BOJ 1937] 욕심쟁이 판다  (0) 2019.02.15
[BOJ 10989] 수정렬하기3  (0) 2019.02.15
[BOJ 1026] 보물  (0) 2019.02.12
[BOJ 3056] 007  (0) 2019.01.31
[BOJ 1102] 발전소  (0) 2019.01.30
반응형

문제출처

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


문제풀이

/**
* a배열과 b배열의 곱을 최소한으로 하는 문제입니다.
* 가장 큰 값과 가장 작은 값을 곱하면 최소값이 나오는 것을 이용해 정렬을 사용하면
* 쉽게 풀 수 있는 문제입니다. 이문제에서 b에 있는 수는 재배열하면 안된다고 나와있어 당황스러웟는데
* 배열을 따로 출력하거나 하지 않기 때문에 일단 제출하니 맞았습니다가 나왔습니다. 다른 풀이도
* 오름차순, 내림차순 소팅을 하는 것을 보아 제가 생각하는 재배열과 문제에서 말하는 것은 다른것 같습니다.
*/


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <algorithm>
using namespace std;
bool desc(int a, int b) {
    return a>b;
}
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int n;
    cin>>n;
    int a[n], b[n], answer=0;
    for(int i=0; i<n; i++cin>>a[i];
    for(int i=0; i<n; i++cin>>b[i];
    sort(a, a+n);
    sort(b, b+n, desc);
    for(int i=0; i<n; i++) answer+=a[i]*b[i];
    cout<<answer;
    return 0;
}
cs


반응형

'Algorithm' 카테고리의 다른 글

[BOJ 10989] 수정렬하기3  (0) 2019.02.15
[BOJ 10814] 나이순 정렬  (0) 2019.02.13
[BOJ 3056] 007  (0) 2019.01.31
[BOJ 1102] 발전소  (0) 2019.01.30
[BOJ 1799] 비숍  (0) 2019.01.29
반응형

문제출처

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


문제풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * dp + bitmask문제는 유형이 비슷한거 같다. 지금까지 비슷한 유형만 푼거일수도...
 * 입력에서의 행을 요원, 열을 확률로 생각하면 되는데 0번 요원은 100, 1번요원은 13, 2번요원은 90을
 * 계산해주면 출력값이 나온다. 처음에 이해를 잘못해서 출력이 어떻게 나오는지 고생...
 * x축을 기준으로 탐색을 해주면서 방문을 안한 확률에 대해서만 방문표시를 하고 확률을 곱해준다.
 * 기저사례에서 확률을 곱해주기 때문에 0을 리턴하면 안되기 때문에 1을 리턴해주면 된다.
 * 이 문제를 처음 구현했을때 시간초과가 나왔는데 처음에는 이해를 못했다.
 * 문제는 기저사례였다. 기존에는 if(y==n)  return 1; 이런식으로 했었는데
 * bitmask를 사용해서 if(state == (1<<n)-1)로 조건을 바꿔주니 맞았다.
 * 아마 y==n이면 제때 빠져나오지 못하는 경우가 존재하는것 같다.
 * 그리고 이 문제에서 출력형식이 뭔가 잘못된거 같다.
 * 오차범위가 소수점 6자리인데 출력은 5자리까지만 나와있다.
 * 그런데 5자리로만 출력하면 틀렸습니다가 나온다 ㅡㅡ (이해를 잘못하고 있는건가?)
 */
cs


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <algorithm>
#define MAX 20
using namespace std;
int n;
double p[MAX][MAX], dp[1<<MAX];
double solve(int y, int state) {
    if(state == (1<<n)-1)   return 1;
    double &ret=dp[state];
    if(ret!=0.0)  return ret;
    for(int i=0; i<n; i++) {
        if((state & (1<<i)))    continue;
        ret=max(ret, solve(y+1, state|(1<<i)) * p[y][i]);
    }
    return ret;
}
int main() {
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cout.precision(6); cout<<fixed;
    cin>>n;
    for(int y=0; y<n; y++)
        for(int x=0; x<n; x++) {
            cin >> p[y][x];
            p[y][x] /= 100.0;
        }
    cout<<solve(00* 100.0<<endl;
    return 0;
}
cs


반응형

'Algorithm' 카테고리의 다른 글

[BOJ 10814] 나이순 정렬  (0) 2019.02.13
[BOJ 1026] 보물  (0) 2019.02.12
[BOJ 1102] 발전소  (0) 2019.01.30
[BOJ 1799] 비숍  (0) 2019.01.29
[Programmers] 정렬 - 가장큰수  (0) 2019.01.28
반응형

문제출처

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


문제풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * 처음에 그리디적으로 접근하다가 알고리즘 분류에 dp가 있어서 생각을 바꾸고 다시 푼 문제.
 * 이제부터 알고리즘 분류를 보면 안되겠다... dp문제와 비트마스크 문제를 좀 기계식으로 풀었다.
 * 이 문제는 외판원 순회와 굉장히 유사하고 답도 거의 유사하다.
 * 처음 input을 받을때 켜져있는 발전소가 어떤 것인지 알기 위해 'Y'를 입력받으면 on변수에 해당 비트를 켜준다.
 * 만약 'YNN'을 입력 받았다면 1<<0 이므로 on은 0001의 상태가 되어 첫번째 발전소만 켜진 것을 의미한다.
 * dp배열은 인덱스를 켜져있는 발전소 상태를 참조하여 값으로 최소 비용을 넣어준다.
 * 즉 dp[idx]는 최소 p개 키는데 사용하는 최소비용이며 idx는 현재 켜진 발전소 상태를 의미한다.
 * 만약 모든 발전소가 꺼져있거나 p가 0인경우는 비용이 없으므로 0을 리턴하게 되며 현재 켜져있는 발전소에 대해서만
 * solve함수를 호출한다. solve함수에서는 가장먼저 켜져있는 발전소의 index를 먼저 찾고 꺼져있는 발전소의 index를 찾는다.
 * 꺼진 발전소를 키고 dp값에 저장하는 방식으로 풀이하면 된다.
 *
 * 처음에 시간초과가 났는데 dp배열을 INF로 초기화 해주지 않았다. 왜 시간초과가 나는지는 모르겠지만 앞으로는 그냥 일단 
 * 초기화 하고 사용하도록 해야겠다.
 */
cs


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <algorithm>
#include <cstring>
#define MAX 16
#define INF 0x3f3f3f3f
using namespace std;
int n, on, onCnt, p;
int cost[MAX][MAX];
int dp[1<<MAX];
int solve(int state, int cnt) {
    if(cnt>=p) return 0;
    int &ret=dp[state];
    if(ret!=INF)  return ret;
    for(int i=0; i<n; i++) {
        if(!(state & (1<<i))) continue;
        for(int j=0; j<n; j++) {
            if(state & (1<<j))   continue;
            ret=min(ret, solve(state | (1<<j), cnt+1+ cost[i][j]);
        }
    }
    return ret;
}
int main() {
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>n;
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            cin>>cost[i][j];
    for(int i=0; i<n; i++) {
        char c;
        cin>>c;
        if(c=='Y') on|=(1<<i), onCnt++;
    }
    cin>>p;
    memset(dp, INF, sizeof(dp));
    int answer=solve(on, onCnt);
    if(answer >= INF) answer=-1;
    cout<<answer;
    return 0;
}
cs


반응형

'Algorithm' 카테고리의 다른 글

[BOJ 1026] 보물  (0) 2019.02.12
[BOJ 3056] 007  (0) 2019.01.31
[BOJ 1799] 비숍  (0) 2019.01.29
[Programmers] 정렬 - 가장큰수  (0) 2019.01.28
[BOJ 7562] 나이트의 이동  (0) 2019.01.28

+ Recent posts