반응형

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

 

[문제풀이]

1.BFS로 풀수 있다. 

2.L:육지로 이동가능한곳, W:물로 이동할 수 없다 

3.L만 찾아서 1개씩 큐에 저장후 이동할 수 있는 가장 먼 거리를 찾는 문제이다.

4.map정보가 같은 크기의 visited배열을 만들어서 방문 기록을 하고 매번 초기화 해줘야한다.

 

#include <iostream>
#include <queue>
#include <memory.h>
using namespace std;
#define MAXN (50)
int N, M;//세로, 가로
char map[MAXN+10][MAXN+10];//지도정보
int visited[MAXN+10][MAXN+10];//방문 표시 
struct Q{
	int y,x,t;
};
int count=0,ans=-1;
int BFS(int y, int x,int t){
	queue<Q>q;
	int dy[]={-1,1,0,0};//동서남북
	int dx[]={0,0,-1,1};
	//1.초기화 
	count=0;
	q={};
	//2.큐에 초기값 저장 
	q.push({y,x,t});	
	//3.반복문 
	while(!q.empty()){
		Q cur=q.front();q.pop();
		visited[y][x]=1;

		for(int i=0; i<4; i++){
			t=cur.t;
			int ny=cur.y+dy[i];
			int nx=cur.x+dx[i];
			if((ny<0) || (ny>=N) || (nx<0) || (nx>=M) || map[ny][nx]!='L') continue;
			if(visited[ny][nx]==0){
				visited[ny][nx]=1;
				q.push({ny,nx,t+1});
				count=t+1;
				if(ans<count) ans=count;//ans에 최대값 업데이트 
			}
		}
	}
	return ans;
}
void Solve(){
	for (int i=0; i<N; i++){
		for (int j=0; j<M; j++){
			if(map[i][j]=='L'){
				ans=BFS(i,j,0);
				memset(visited,false,sizeof(visited));
			}
		}
	}
	cout<<ans<<endl;
}
void InputData(){
	cin>>N>>M;
	for (int i=0; i<N; i++){
		cin>>map[i];
	}
}
int main(){
	InputData();
	Solve();
	return 0;
}
반응형

'Algorithm > BFS,DFS' 카테고리의 다른 글

[c++][백준]뱀과 사다리  (0) 2022.05.16
[C++][백준]1520 내리막길  (0) 2022.04.10
[C++][백준]14502 연구소  (0) 2022.04.10
[C++][백준]적록색약  (0) 2022.04.10
[c++][algoritm][baekjoon]7562 나이트의 이동  (0) 2021.09.23
반응형

www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

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

www.acmicpc.net

 

문제

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

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

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

입력

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

출력

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

 

 

 

/*baekjoon 2839 설탕 배달*/
#include <iostream>

using namespace std;

int N; // 설탕 무게 

void InputData(){
	cin >> N;
}

void Solve()
{
	int total = 0;
	int tmp = 0;

	if( N%5 == 0 ){
		cout <<  N/5 << endl;
	}else {
		tmp = N/5;	
		do{
			if( (N - tmp*5)%3 == 0){
				cout << tmp + (N -5*tmp)/3 << endl;
				break; 
			}
			tmp--;
		}while(tmp >=0 );
	}	

	if( tmp == -1 )
		cout << "-1" << endl;
}

int main()
{
	InputData();
	Solve();

	return 0;
}
/*baekjoon 2839 설탕 배달*/
반응형
반응형

www.acmicpc.net/problem/2751

 

2751번: 수 정렬하기 2

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

 

 

2750문제에서 array size만 1000000로 변경하였다. 

 

/*baekjoon 2751 수 정렬하기2 */
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

#define MAX 1000001

int main()
{
	int data[MAX];
	int i,j, N;
	int tmp, exchg;

	vector<int> v;

	//input data size
	cin >> N;

	//input data
	for(i=0; i<N; i++) {
		cin >> data[i];
		v.push_back(data[i]);
	}

	sort(v.begin(), v.end());
	for(vector<int>::iterator it=v.begin(); it<v.end(); it++)
		printf("%d\n", *it );
		
	return 0;
}
/*baekjoon 2751 수 정렬하기2 */
반응형
반응형

www.acmicpc.net/problem/2750

 

2750번: 수 정렬하기

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

 

풀이 방법 : 

-입력 받고 

-단순 sorting함수 이용해서 풀면 되는 간단한 문제 

/*baekjoon 2750 수 정렬하기*/
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

#define MAX 1001

int main()
{
	int data[MAX];
	int i,j, N;
	int tmp, exchg;

	vector<int> v;

	//input data size
	cin >> N;

	//input data
	for(i=0; i<N; i++) {
		cin >> data[i];
		v.push_back(data[i]);
	}

	sort(v.begin(), v.end());
	for(vector<int>::iterator it=v.begin(); it<v.end(); it++)
		printf("%d\n", *it );
		
	return 0;
}
/*baekjoon 2750 수 정렬하기*/

이제 좀 코딩 연습을 하고 나서 다시 작성한 내용입니다. 

2021.6.26

  1 /*baekjoon 2750 수 정렬하기*/
  2 #include <iostream>
  3 #include <algorithm>
  4 using namespace std;
  5 #define MAXN 1001
  6 
  7 int N;
  8 int Data[MAXN+10];
  9 
 10 void InputData(){
 11     cin >> N;
 12     for(int i=0; i<N; i++){
 13         cin >> Data[i];
 14     }
 15 }
 16 void Solve(){
 17     for(int i=0; i<N; i++){
 18         cout << Data[i] << endl;
 19     }
 20 }
 21 int main()
 22 {
 23     InputData();
 24     sort(Data, Data+N);
 25     Solve();
 26     return 0;                                                                          
 27 }   
 28 /*baekjoon 2750 수 정렬하기*/
반응형
반응형

www.acmicpc.net/problem/5430

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

문제

선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.

함수 R은 배열에 있는 숫자의 순서를 뒤집는 함수이고, D는 첫 번째 숫자를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.

함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다. 예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 숫자를 버리는 함수이다.

배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 최대 100이다.

각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다. p의 길이는 1보다 크거나 같고, 100,000보다 작거나 같다.

다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. (0 ≤ n ≤ 100,000)

다음 줄에는 [x1,...,xn]과 같은 형태로 배열에 들어있는 수가 주어진다. (1 ≤ xi ≤ 100)

전체 테스트 케이스에 주어지는 p의 길이의 합과 n의 합은 70만을 넘지 않는다.

출력

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

 

 

 

아래 코드 완성해서 정상적으로 출력되는 데 런타임오류(segfault)가 발생한다.

어디가 문제인지 잘 모르겠네요. 

 

/*baekjoon 5430 dequeue*/
#include <iostream>
#include <deque>
#include <cstring>

using namespace std;

deque<int> q;
#define MAX 100001 

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);


    int i=0,k=0,m;
    int testN; //test case
    int N; // N  
    char dt[MAX];
    char control[MAX];
    int numC, sizeq;
    int flag;
    int error=0;
    cin >> testN;


    for(i =0; i < testN; i++) {
        error = 0;
        cin >> control;
        cin >> N;
        cin >> dt;
        char *tok=strtok(dt, "[,]");

        flag = 1;
        while(tok != NULL) {
            q.push_back(atoi(tok));
            tok=strtok(NULL, "[,]");
        }    

        numC = strlen(control);
        for(k=0; k< numC; k++ ) {
            if( control[k] == 'R') {
                flag = (flag + 1 )%2;
            } else if ( control[k] == 'D' ){
                if(!q.empty()){
                    if( flag == true ){
                        q.pop_front();
                    }else if( flag == false){
                        q.pop_back();
                    }
                } else{
                    error++ ;
                    continue;
                }
            }
        }

        if (!q.empty() &&  error == 0) {
            cout << '[';
            sizeq = q.size();
            for(m=0; m<sizeq; m++){
                if( !q.empty() && (flag == true) ){
                    if( q.size() > 1){
                        cout << q.front() << ',';
                    }else if(q.size() == 1) {
                        cout << q.front();
                    }
                     q.pop_front();
                }else if( !q.empty() && (flag == false) ) {
                    if( q.size() > 1){
                        cout << q.back() << ',';
                    }else if( q.size() == 1) {
                        cout << q.back();
                    }
                    q.pop_back();
                }
            }
            cout << ']' << '\n';
        } else if(error >= 1){
            cout << "error" << '\n';
        }else if(q.size()==0){
            cout <<  "[]\n";
        }

    }

    return 0;
}
/*baekjoon 5430 dequeue*/

문제 해결이 됐습니다.  control은 RD와 같이 control 입력부이고 dt는 숫자 array이 인데 cotrol보다 3배 이상 크게 잡아 줘야 문제 해결이 됩니다. 

 

    char control[MAX]; //RD control 입력 
    int N; // dt array size    
    char dt[MAX*3+2];// array [1,2,3,4]

 

 

수정코드는 아래와 같습니다. 참고하시기 바랍니다. 

/*baekjoon 5430 dequeue*/
#include <iostream>
#include <deque>
#include <cstring>

using namespace std;

deque<int> q;
#define MAX 100001 

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);


    int i=0,k=0,m;
    int testN; //test case
    char control[MAX]; //RD control 입력 
    int N; // dt array size    
    char dt[MAX*3+2];// array [1,2,3,4]
    int numC, sizeq;
    int flag;
    int error=0;
    cin >> testN;


    for(i =0; i < testN; i++) {
        error = 0;
        cin >> control;
        cin >> N;
        cin >> dt;
        char *tok=strtok(dt, "[,]");

        flag = 1;
        while(tok != NULL) {
            q.push_back(atoi(tok));
            tok=strtok(NULL, "[,]");
        }    

        numC = strlen(control);
        for(k=0; k< numC; k++ ) {
            if( control[k] == 'R') {
                flag = (flag + 1 )%2;
            } else if ( control[k] == 'D' ){
                if(!q.empty()){
                    if( flag == true ){
                        q.pop_front();
                    }else if( flag == false){
                        q.pop_back();
                    }
                } else{
                    error++ ;
                    continue;
                }
            }
        }

        if (!q.empty() &&  error == 0) {
            cout << '[';
            sizeq = q.size();
            for(m=0; m<sizeq; m++){
                if( !q.empty() && (flag == true) ){
                    if( q.size() > 1){
                        cout << q.front() << ',';
                    }else if(q.size() == 1) {
                        cout << q.front();
                    }
                     q.pop_front();
                }else if( !q.empty() && (flag == false) ) {
                    if( q.size() > 1){
                        cout << q.back() << ',';
                    }else if( q.size() == 1) {
                        cout << q.back();
                    }
                    q.pop_back();
                }
            }
            cout << ']' << '\n';
        } else if(error >= 1){
            cout << "error" << '\n';
        }else if(q.size()==0){
            cout <<  "[]\n";
        }

    }

    return 0;
}
/*baekjoon 5430 dequeue*/
반응형

'Algorithm > queue,dequeu' 카테고리의 다른 글

[c++]dequeue (double-ended queue)  (0) 2021.04.12
[c++]baekjoon 10866  (0) 2021.04.11
[c++]baekjoon 1021  (0) 2021.04.11
[c++]baekjoon 11866  (0) 2021.04.11
[c++]baekjoon 2164  (0) 2021.04.11
반응형

www.acmicpc.net/problem/10866

 

10866번: 덱

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

문제

정수를 저장하는 덱(Deque)를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여덟 가지이다.

  • push_front X: 정수 X를 덱의 앞에 넣는다.
  • push_back X: 정수 X를 덱의 뒤에 넣는다.
  • pop_front: 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • pop_back: 덱의 가장 뒤에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 덱에 들어있는 정수의 개수를 출력한다.
  • empty: 덱이 비어있으면 1을, 아니면 0을 출력한다.
  • front: 덱의 가장 앞에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • back: 덱의 가장 뒤에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

 

 

dequeue를 기본 api 확인하는 문제이다. 

 

/*baekjoon 10866 dequeue*/
#include <iostream>
#include <deque>
#include <cstring>

using namespace std;
#define MAX_N 100

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);


    int n,i,dt;
    char str[20];
    cin >> n;

    deque<int> dq;


    for(i =0; i < n; i++ ){

        cin >> str;

        if( !strcmp(str, "push_front") ){
            cin >> dt;
            dq.push_front(dt);
        }else if( !strcmp(str, "push_back") ){
            cin >> dt;
            dq.push_back(dt);
        }else if( !strcmp(str, "pop_front") ){
            if(!dq.empty() ){
                cout << dq.front() << '\n';
                dq.pop_front();
            }else{
                cout << "-1" << '\n';
            }
        }else if( !strcmp(str, "pop_back") ){
            if(!dq.empty() ){
                cout << dq.back() << '\n';
                dq.pop_back();
            }else{
                cout << "-1" << '\n';
            }
        }else if( !strcmp(str, "size") ){
            cout << dq.size() << '\n';
        }else if( !strcmp(str, "empty") ){
            cout << dq.empty() << '\n';
        }else if( !strcmp(str, "front") ){
            if(!dq.empty() ){
                cout << dq.front() << '\n';
            } else {
                cout << "-1" << '\n';
            }
        }else if( !strcmp(str, "back") ){
            if(!dq.empty() ){
                cout << dq.back() << '\n';
            } else {
                cout << "-1" << '\n';
            }
        }
    }

    return 0;
}
반응형

'Algorithm > queue,dequeu' 카테고리의 다른 글

[c++]baekjoon 5430  (0) 2021.04.12
[c++]dequeue (double-ended queue)  (0) 2021.04.12
[c++]baekjoon 1021  (0) 2021.04.11
[c++]baekjoon 11866  (0) 2021.04.11
[c++]baekjoon 2164  (0) 2021.04.11
반응형

www.acmicpc.net/problem/11866

 

11866번: 요세푸스 문제 0

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)

www.acmicpc.net

요세푸스 문제는 다음과 같다.

1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.

N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.

 

예 

(7, 3)

 

1 2 3 4 5 6 7

3번째  제거  3

4 5 6 7 1 2

3번째 제거  6

4 5 6 7 1 2

 

3번째 제거 2

7 1 2 4 5

 

3번째 제거 7

4 5 7 1

 

3번째 제거 5

 1 4 5

 

3번째 제거 1

1 4

 

나머지 남은 건

4

 

[키 포인트]

큐는 FIFO인 특성을 잘 이해하고 풀면 될 것 같습니다. 

front를 빼서 다시 push하면 loop를 돌면서 저장되는 특성이 있는 걸 이해하면 쉽게 풀 수있을 것 같습니다. 

 

[풀이 ]

loop( queue가 빌때까지 ){

  K-1 만큰 front를 다시  queue에 저장 

  K번째는 front해서 print하고 나서 pop해서 제거 

}

  

  

/*baekjoon 11866 queue*/
#include <iostream>
#include <queue>

using namespace std;
queue<int> q;

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);


	int i=0,j=0;
	int N; // N명 
	int K; //K번째 제거 
	cin >> N;
	cin >> K;



    for(i =1; i <= N; i++ ){
        q.push(i);
    }

    cout << "<";
    while( !q.empty() ){
        for(i=0; i<K-1; i++){
            q.push( q.front() );
            if(!q.empty()){  q.pop(); }
            j++;
        }

        j++;
        if( !(j%K) ) {

            if(q.size() != 1)
                cout << q.front() << ", ";
            else if(q.size() == 1)
                cout << q.front();

            if(!q.empty()){
                q.pop(); }
        }
    }

    cout << ">" << endl;


	return 0;
}

 

반응형

'Algorithm > queue,dequeu' 카테고리의 다른 글

[c++]dequeue (double-ended queue)  (0) 2021.04.12
[c++]baekjoon 10866  (0) 2021.04.11
[c++]baekjoon 1021  (0) 2021.04.11
[c++]baekjoon 2164  (0) 2021.04.11
[c++]baekjoon 18258  (0) 2021.04.11
반응형

www.acmicpc.net/problem/2164

 

2164번: 카드2

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가

www.acmicpc.net

 

 

N=4일 경우 

 

1 2 3 4

 

규칙 : 아래 반복 

맨 위 카드 버림 --> 맨 위 카드를 맨 아래로 이동 --> 맨 위카드 버림 --> 맨 위카드를 맨 아래로 이동 

 

1 2 3 4

맨 위 카드 버림

2 3 4

맨 위 카드 맨 아래 

3 4 2

맨 위 카드 버림

4 2

맨 위 카드 맨 아래로

2 4

맨 위 카드 버림

4

 

#include <iostream>
#include <queue>
#include <cstring>

using namespace std;
#define MAX_N 100
queue<int> q;


int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);


	int i,n,tmp;
	cin >> n;



	for(i =1; i <= n; i++ ){
		q.push(i);
	}

	while( 1 ){
		if( q.size() ==1)
			break;

		q.pop();
		tmp = q.front();	
		q.pop();
		q.push(tmp);
	}

	cout << q.front();
		
	return 0;
}
반응형

'Algorithm > queue,dequeu' 카테고리의 다른 글

[c++]dequeue (double-ended queue)  (0) 2021.04.12
[c++]baekjoon 10866  (0) 2021.04.11
[c++]baekjoon 1021  (0) 2021.04.11
[c++]baekjoon 11866  (0) 2021.04.11
[c++]baekjoon 18258  (0) 2021.04.11
반응형

www.acmicpc.net/problem/1874

 

1874번: 스택 수열

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.

www.acmicpc.net

이 문제는 여러 우여곡절 끝에 답을 찾은 문제 입니다.

for loop에 39,43 라인에 원래 cout을 사용했더니 시간초과로 정답이 안되는 문제가 있어서 여기저기 찾아보니

endl이 시간을 많이 소모해서 문제가 된다고 하여 printf로 수정했습니다. 

endl을 '\n'으로 바꾸셔도 되고 아예 printf문으로 다 바꿔도 됩니다. 

cout이 편리해서 잘 사용하고 있었는데, 이런 문제가 있네요. 참고로 하시기 바랍니다.  

아래 코드도 아직 틀렸다고 하는데 왜 틀렸는지 잘 모르겠네요. 혹시 아시는 분은 아래 답변 좀 부탁드립니다. 

 

cout << dtout[i] << endl;

cout << "NO" << endl;

 

  1 /*baekjoon 1874*/                                                                         
  2 #define _CRT_SECURE_NO_WARNINGS
  3 #include <iostream>
  4 #include <stack>
  5 #include <string.h>
  6 
  7 using namespace std;
  8 #define MAX 100001
  9 int dt[MAX];
 10 char dtout[MAX];
 11 stack<int> s;
 12 
 13 
 14 int main()
 15 {
 16     int i,j=0,k=0, n;
 17     int size;
 18 
 19     /* input size*/
 20     cin >> n;
 21 
 22     /* input data*/
 23     for(i= 0; i<n; i++ ){
 24         cin >> dt[i];
 25     }
 26 
 27     for( i=1; i <= n; i++){
 28         s.push(i);
 29         dtout[k++] = '+';
 30         while( !s.empty() && s.top() == dt[j] ){
 31             s.pop();
 32             dtout[k++] = '-';
 33             j++;
 34         }
 35     }
 36 
 37     size = strlen( dtout );
 38     if( !s.empty() ) {
 39         printf("NO");
 40         return 0;
 41     }else{
 42         for( i = 0; i< size; i++) {
 43             printf("%c\n", dtout[i]);
 44         }
 45     }
 46 
 47     return 0;
 48 }
반응형

'Algorithm' 카테고리의 다른 글

[c++]baekjoon 17298  (0) 2021.04.05
[c++]baekjoon 9012  (0) 2021.04.04
[c++]baekjoon 10773  (0) 2021.04.04
[c++]baekjoon 10828  (0) 2021.04.04
[c++]baekjoon 4949  (0) 2021.04.03
반응형

www.acmicpc.net/problem/9012

아래 코드로 돌렸을 때 segmentation fault 발생 해서 gdb로 디버깅 한 결과입니다.

일단 은 어느 코드에서 문제가 발생한 정도로만 확인이 가능한데, 이정도만 추적을 해도 코드 수정하는데 많은 도움이 된다고 보입니다. 

 

  1 #include <iostream>                                                                                                                                                                                    
  2 #include <stack>
  3 #include <string.h>
  4 
  5 using namespace std;
  6 
  7 int main()
  8 {
  9     int n=0,i,j, check=0, count;
 10     char input[51];
 11 
 12     stack<char> s;
 13     cin >> count;
 14 
 15     for(j=0; j<count; j++)
 16     {
 17         check = 0;
 18         cin >> input;
 19         n = strlen(input);
 20 
 21         for(i=0; i<n; i++)
 22         {
 23             if ( input[i] == '(')
 24                 s.push(input[i]);
 25             else if(i == 0 && input[i] == ')')
 26             {
 27                 s.push(input[i]);
 28                 break;
 29             }
 30             else if( i !=0 && input[i]  == ')' )
 31             {
 32                 if( s.top() == '(' )
 33                     s.pop();
 34                 else
 35                     s.push(input[i]);
 36             }
 37         }   
 38         
 39         if( s.empty() )
 40             cout << "YES" << endl;
 41         else
 42             cout << "NO" << endl;
 43             
 44     }
 45     return 0;
 46 }   

 

#gdb ./a.out

gdb b main

gdb r

 

input값은 각각 count와 input 입력시 넣어 주시면 됩니다. 

1 <-- count

(())()) <-- input

 

 

step을 해보면서 segmentation fault발생한 지점이 32 line s.top()에서 문제가 발생한 것을 알았으며

s.top()이 stack에  아무것도 없을 경우 값이 이상한 값을 return하므로 조건문을 s.empty()인지를 추가해 주면 해결 될 것으로 판단해서 코드 수정을 해 주시면 될 것 같습니다.

Breakpoint 1, main () at 9012.cpp:8
8	{
(gdb) n
9		int n=0,i,j, check=0, count;
(gdb) n
12	    stack<char> s;
(gdb) n
13	    cin >> count;
(gdb) n
1
15	    for(j=0; j<count; j++)
(gdb) n
17	        check = 0;
(gdb) n
18	        cin >> input;
(gdb) n
(())())
19	        n = strlen(input);
(gdb) n
21	        for(i=0; i<n; i++)
(gdb) disp n
1: n = 7
(gdb) n
23	            if ( input[i] == '(')
1: n = 7
(gdb) n
24	                s.push(input[i]);
1: n = 7
(gdb) n
21	        for(i=0; i<n; i++)
1: n = 7
(gdb) n
23	            if ( input[i] == '(')
1: n = 7
(gdb) disp *input@i
2: *input@i = "("
(gdb) n
24	                s.push(input[i]);
1: n = 7
2: *input@i = "("
(gdb) disp i
3: i = 1
(gdb) n
21	        for(i=0; i<n; i++)
1: n = 7
2: *input@i = "("
3: i = 1
(gdb) n
23	            if ( input[i] == '(')
1: n = 7
2: *input@i = "(("
3: i = 2
(gdb) n
25	            else if(i == 0 && input[i] == ')')
1: n = 7
2: *input@i = "(("
3: i = 2
(gdb) n
30	            else if( i !=0 && input[i]  == ')' )
1: n = 7
2: *input@i = "(("
3: i = 2
(gdb) n
32	                if( s.top() == '(' )
1: n = 7
2: *input@i = "(("
3: i = 2
(gdb) n
33	                    s.pop();
1: n = 7
2: *input@i = "(("
3: i = 2
(gdb) n
21	        for(i=0; i<n; i++)
1: n = 7
2: *input@i = "(("
3: i = 2
(gdb) n
23	            if ( input[i] == '(')
1: n = 7
2: *input@i = "(()"
3: i = 3
(gdb) n
25	            else if(i == 0 && input[i] == ')')
1: n = 7
2: *input@i = "(()"
3: i = 3
(gdb) n
30	            else if( i !=0 && input[i]  == ')' )
1: n = 7
2: *input@i = "(()"
3: i = 3
(gdb) n
32	                if( s.top() == '(' )
1: n = 7
2: *input@i = "(()"
3: i = 3
(gdb) n
33	                    s.pop();
1: n = 7
2: *input@i = "(()"
3: i = 3
(gdb) n
21	        for(i=0; i<n; i++)
1: n = 7
2: *input@i = "(()"
3: i = 3
(gdb) n
23	            if ( input[i] == '(')
1: n = 7
2: *input@i = "(())"
3: i = 4
(gdb) n
24	                s.push(input[i]);
1: n = 7
2: *input@i = "(())"
3: i = 4
(gdb) n
21	        for(i=0; i<n; i++)
1: n = 7
2: *input@i = "(())"
3: i = 4
(gdb) n
23	            if ( input[i] == '(')
1: n = 7
2: *input@i = "(())("
3: i = 5
(gdb) n
25	            else if(i == 0 && input[i] == ')')
1: n = 7
2: *input@i = "(())("
3: i = 5
(gdb) n
30	            else if( i !=0 && input[i]  == ')' )
1: n = 7
2: *input@i = "(())("
3: i = 5
(gdb) n
32	                if( s.top() == '(' )
1: n = 7
2: *input@i = "(())("
3: i = 5
(gdb) n
33	                    s.pop();
1: n = 7
2: *input@i = "(())("
3: i = 5
(gdb) n
21	        for(i=0; i<n; i++)
1: n = 7
2: *input@i = "(())("
3: i = 5
(gdb) n
23	            if ( input[i] == '(')
1: n = 7
2: *input@i = "(())()"
3: i = 6
(gdb) n
25	            else if(i == 0 && input[i] == ')')
1: n = 7
2: *input@i = "(())()"
3: i = 6
(gdb) n
30	            else if( i !=0 && input[i]  == ')' )
1: n = 7
2: *input@i = "(())()"
3: i = 6
(gdb) n
32	                if( s.top() == '(' )
1: n = 7
2: *input@i = "(())()"
3: i = 6
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
main () at 9012.cpp:32
32	                if( s.top() == '(' )
1: n = 7
2: *input@i = "(())()"
3: i = 6
(gdb) 

 

문제점 수정한 코드는 아래와 같으면 결과가 잘 출력되는 걸 확인 했습니다.

  1 #include <iostream>
  2 #include <stack>
  3 #include <string.h>
  4 
  5 using namespace std;
  6 
  7 int main()
  8 {
  9     int n=0,i,j, check=0, count;
 10     char input[51];
 11 
 12     stack<char> s;
 13     cin >> count;
 14 
 15     for(j=0; j<count; j++){
 16         check = 0;
 17         cin >> input;
 18         n = strlen(input);
 19 
 20         for(i=0; i<n; i++){
 21             if ( input[i] == '(')
 22                 s.push(input[i]);
 23             else if(i == 0 && input[i] == ')'){
 24                 s.push(input[i]);
 25                 break;
 26             }
 27             else if( i !=0 && input[i]  == ')' ){
 28                 if( s.empty() ){
 29                     s.push(input[i]);
 30                 }
 31                 else{
 32                     if( s.top() == '(' )
 33                         s.pop();
 34                     else
 35                         s.push(input[i]);
 36                 }
 37             }
 38         }                          
 39 
 40         if( s.empty() )
 41             cout << "YES" << endl;
 42         else
 43             cout << "NO" << endl;
 44 
 45         while( !s.empty() )
 46             s.pop();
 47     }
 48     return 0;
 49 }                              
반응형

'Algorithm' 카테고리의 다른 글

[c++]baekjoon 1874  (0) 2021.04.10
[c++]baekjoon 17298  (0) 2021.04.05
[c++]baekjoon 10773  (0) 2021.04.04
[c++]baekjoon 10828  (0) 2021.04.04
[c++]baekjoon 4949  (0) 2021.04.03
반응형
#include <iostream>
#include <stack>

using namespace std;

int main()
{
		int count,val,i,total=0;

        stack<int> s;
		//scanf("%d", &count);
        cin >> count;

		while(count>0)
		{
			//scanf("%d", &val);
            cin >> val;

			if( val > 0)
				s.push(val);
			else if (val == 0)
				s.pop();

			count--;
		
		}

		while(!s.empty())
		{
			total += s.top();
            s.pop();
		}

        cout << total << endl;

		return 0;
}
반응형

'Algorithm' 카테고리의 다른 글

[c++]baekjoon 17298  (0) 2021.04.05
[c++]baekjoon 9012  (0) 2021.04.04
[c++]baekjoon 10828  (0) 2021.04.04
[c++]baekjoon 4949  (0) 2021.04.03
[c++]stack 사용  (0) 2021.04.02
반응형

예제 코드

file name : test.c

#include <stdio.h>

int main()
{
    char input[100];
    int i = 0;
    scanf("%[^.]s", input);
    
    while(input[i] != '0')
    {   
        printf("%c", input[i]);
        i++;
    }   
    
    return 0;
}

compile 방법

#gcc test.c -o test -g

gdb 실행

#gdb test
#b main
#run
#n
...
scanf함수까지 이동한 후 아래와 같이 임의 문장을 입력한다.
#Test code is.
#display i
#display *input@i
#n
....
이후 next를 입력하면서 값이 변하는 것을 확인하시면 됩니다.

 

 

반응형

'gdb' 카테고리의 다른 글

[gdb]coredump 생성 및 분석 방법  (0) 2021.04.07
GDB commands  (0) 2021.03.28
GDB help  (0) 2021.03.28
GDB란 ?  (0) 2021.03.28
반응형

GDB 사용하는데 많이 사용하는 command 위주로 정리를 했으며 사용하면서 필요한 정보는 gdb의 help를 이용해서 참조하면서 사용하시면 될 것 같습니다.

 

1.compile 방법 

compile시 -g debug option을 꼭 추가해야 합니다. 
#gcc test.c -g -o test
-g : debug option(-O optimization 은 주면 안됨)
-o : 실행 파일 이름 설정 

*debug option적용된 file인지 확인 방법 
#objdump -g test
.debug_xxx section들이 존재해야 한다.
<예>
.debug_arranges
.debug_info
.debug_str

 

2. gdb 시작/종료 

-시작 

gdb [프로그램명]

gdb [프로그램명] [core 파일명]

gdb [프로그램명] [프로세스 PID]

[example]
#gdb test

 

-종료 

(gdb)quit

(gdb)ctrl+d

 

 

3. 각 class별로 commands

-running

 

 

advance

advance 20 현재 파일의 20라인을 만날 때까지 진행

advance file.c:20 file.c 파일의 20라인을 만날 때까지 진행

 

continue

c 다음 breakpoint 를 만날 때까지 실행

u 현재 loop를 빠져 나감

finish 현재 함수를 수행하고 빠져 나감

return 현재 함수를 수행하지 않고 빠져 나감

return 123 현재 함수를 수행하지 않고 빠져 나감, 리턴 값은 123

si 현재의 instruction을 수행, 함수 호출 시 함수 내부로 들어감.

ni 현재의 instruction을 수행, 함수 호출 시 함수 내부로 들어가지 않음.

 

next

다음 행을 수행한다. 서브루틴을 호출하면서 계속 수행한다.

호출이 발생하지 않으면 step와 같다.

next n : 이를 n번 수행하라는 의미

n 현재 행 수행 후 멈춤, 함수 호출 시 함수 수행 후 다음 행으로 감

n 6 n을 6번 입력

 

run

[프로그램 시작/종료]
프로그램을 시작한다.(break가 있다면 break까지 실행)

run/r 프로그램 시작 

r arg1 arg2 arg1,arg2 를 인자로 프로그램 실행

run arg : 새로운 인수를 가지고 프로그램을 시작한다.

arg는 “*”나 “[…]”를 포함할 수도 있다.

쉘의 사용까지도 확장될 수 있다.

“<”,“>” , “>>”같은 입출력 방향 재지정기호도 또한 허용된다.

step

한 줄씩 실행 시킨다.

함수를 포함하고 있으면 함수 내부로 들어가서 한 줄씩 실행시킨다.

- gdb 프로그램 진행

s 현재 행 수행 후 멈춤, 함수 호출 시 함수 내부로 들어감

s 6 s를 6번 입력

kill

디버깅 중인 프로그램의 실행을 취소한다.
k 프로그램 종료

list

- gdb 소스 보기
현재 위치에서 소스 파일의 내용을 10줄 보여준다                          

list 2, 15 : 소스 파일의2 ~ 15 까지를 보여준다.

 

l 현재 함수를 기점으로 소스 출력

l 10 10행을 기준으로 출력

l func func 함수의 소스를 출력

l - 출력된 행의 이전 행을 출력

l file.c:func file.c 파일의 func함수 부분을 출력

l file.c:10 file.c 파일의 10행을 기준으로 출력

 

break

- gdb breakpint

b func func 심볼의 시작 부분에 breakpoint 설정

b 10 10행에 breakpoint 설정

b file.c:func file.c 파일의 func 심볼에 breakpoint 설정

b file.c:10 file.c 파일의 10행에 breakpoint 설정

b +2 현재 행에서 2행 이후 지점에 breakpoint 설정

b -2 현재 행에서 2행 이전 지점에 breakpoint 설정

b *0x8049000 0x8049000 주소에 breakpoint 설정

b 10 if var == 0 10행에 breakpoint 설정하는데, var 변수의 값이 0일 때 동작

rb fun* *fun* 에 해당하는 모든 심볼에 breakpoint 설정

rb ^fun fun 으로 시작하는 모든 심볼에 breakpoint 설정

rb TestClass:: TestClass에 해당하는 모든 심볼에 breakpoint 설정


특정 라인이나 함수에 정지점을 설정한다.

break function : 현재 파일 안의 함수 function에 정지점을 설정한다.

break file:function : 파일file안의 function에 정지점을 설정한다.

watch : 감시점 설정(감시점은 어떤사건이 일어날 때에만 작동한다)

until : 실행중 line까지 실행

watch

- gdb watch point

watch [변수명] 변수에 값이 써질 때, break 걸림

rwatch [변수명] 변수의 값을 읽을 때, break 걸림

awatch [변수명] 변수의 값을 읽거나 쓸 때, break 걸림

 

clear

특정 라인이나 함수에 있던 정지점을 삭제한다.

delete

몇몇 정지점이나 자동으로 출력되는 표현을 삭제한다.

print

next

print expr : 수식의 값을 보여준다.

display

- gdb display

display [변수명] s/n 명령으로 진행하면서 변하는 변수값 확인


현재 display된 명령의 목록을 보여준다.

bt

프로그램 스택을 보여준다. (backtrace)

file

file program : 디버깅할 프로그램으로서 파일을 사용한다.

help

명령에 관한 정보를 보여주거나 일반적인 정보를 보여준다.

 

 

- gdb 변수/레지스터 값 검사

info locals 지역 변수 값 출력

info variables 전역 변수 값 출력

p [변수명] 변수의 값 출력

p [함수명] 함수의 주소 출력

p *[포인터변수명] 포인터변수의 내용을 출력

p $[register] register의 값 출력

info registers register 값 전체 출력

info all-registers MMX register를 포함해 거의 모든 register 값 출력

p *ptr_to_array@n 배열에 대한 pointer인 ptr_to_array에서 배열 원소의 수(n)를 입력으로 해서 출력

 

- gdb 변수 값 설정

p [변수명] = 값 변수명의 값을 설정

 

- gdb x

x/[범위][출력형식][범위의 단위]

메모리 특정 범위 확인

범위: 출력할 개수를 의미

범위의 단위: b(byte), h(half word = 2byte), w(word = 4byte), g(giant word = 8byte)

 

- gdb print/display/x 명령의 형식 지정

t 2진수로 출력

o 8진수로 출력

d 부호가 있는 10진수로 출력

u 부호가 없는 10진수로 출력

x 16진수로 출력

c 최초 1byte 값읅 문자옇으로 출력

f 부동소수점 값 형식으로 출력

a 가장 가까운 심볼의 오프셋을 출력

s 문자열로 출력

i 어셈블리 형식으로 출력

 

- gdb stack frame

frame [n] n번 stack frame 으로 변경

up 상위 stack frame 으로 이동

up [n] n번 상위 stack frame 으로 이동

down 하위 stack frame 으로 이동

down [n] n번 하위 stack frame 으로 이동

info frame stack frame 정보 출력

info args 함수가 호출될 때 인자를 출력

info locals 함수의 지역변수 출력

info catch 함수의 예외 핸들러를 출력

bt 전체 호출 stack frame 출력

 

- gdb 지원 함수들

disas [함수명] 함수의 어셈블리 코드 출력

call [함수명] 함수를 호출

signal [signal] 프로세스에 signal 전송

set {type}[addr]=[값] addr 주소를 type으로 인식하고 값을 저장

 

반응형

'gdb' 카테고리의 다른 글

[gdb]coredump 생성 및 분석 방법  (0) 2021.04.07
[GDB] display array(display *input@i)  (0) 2021.03.29
GDB help  (0) 2021.03.28
GDB란 ?  (0) 2021.03.28

+ Recent posts