다시 또... 삼성 코딩테스트 준비할려고 문제를 풀기 시작했다. 이전에는 DP관련해서 문제를 많이 풀어보지 않았는데

이번에는 dfs bfs말고도 준비해볼려고 dp를 풀고있다.

이 문제는 처음에는 어떻게 풀어야지... 생각하다가 빡더킹의 강의를 듣고 쉽게 풀었다... 예제 수준의 문제지만 나에게는 아직 어렵다.

나는 숫자를 입력받을때마다 계산하는것이 효율적이라고 은연중에 생각하고 있었는데 미리 계산해서 다 정리해놓고 입력받을때마다 출력하는것이 효율적이라고 말한다.

 

#include <iostream>

using namespace std;

int dp[100];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int T;
	cin >> T;
	dp[1] = 1;
	dp[2] = 2;
	dp[3] = 4;
	for (int i = 4; i <= 11; i++) {
		dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
	}
	while (T--) {
		int n;
		cin >> n;
		
		
		cout << dp[n] << endl;
	}

	return 0;
}

이 문제는 크게 어렵지 않았다. 그냥 전형적인 재귀함수 문제였다. 

작은 예제부터 천천히 생각해본다면 쉽게 해결할수있었다.

모든 사분면이 같은 숫자면 그 숫자 출력하고 아니면 하나씩 분리해서 출력한다. 

2x2일때부터 생각해보면 쉽게 할수있다.

단, 입력받을때 string으로 받고 하나씩 넣어줘야하는 불편함이 있으니 주의해야한다.

#include <iostream>

using namespace std;

int board[64][64];

void dfs(int N, int x, int y){
    int ao=0;
    int az=0;
    if(N==1){
        cout<<board[x][y];
        return ;
    }
    for(int i=x;i<x+N;i++){
        for(int j=y;j<y+N;j++){
            if(board[i][j]==1){
                ao++;
            }
            else{
                az++;
            }
        }
    }
    if(ao==N*N){
        cout<<1;
    }
    else if(az==N*N){
        cout<<0;
    }
    else{
        cout<<"(";
        dfs(N/2,x,y);
        dfs(N/2,x,y+N/2);
        dfs(N/2,x+N/2,y);
        dfs(N/2,x+N/2,y+N/2);
        cout<<")";
    }

}

int main(){
    int N;
    string str;
    cin>>N;
    for(int i=0;i<N;i++){
        cin>>str;
        for(int j=0;j<N;j++){
            board[i][j]=str[j]-'0';
        }
    }
    dfs(N,0,0);
    return 0;
}

이 문제는 이번에 삼성 sw역량평가 오전 1번 문제였다. 이번에 나도 코딩테스트를 봤는데 이문제를 풀었었다.

현장에서 test case를 모두 통과했지만, 다시한번 풀어보고 확인해보았다.

결과는 성-공!

구현 자체는 별로 어렵지않았다. 순서대로 한바퀴 돌려주고 사람 이동시키고 내리고 올리고 하면되기때문에 간단했다.

#include <iostream>

using namespace std;

struct block{
    bool human;
    int dur;
};

block belt[202];

void init(int n){
    for(int i=0;i<2*n;i++){
        belt[i].human=false;
        belt[i].dur=0;
    }
}

int main(void){
    int N,K;
    cin>>N>>K;
    init(N);
    for(int i=0;i<2*N;i++){
        cin>>belt[i].dur;
    }
    int time=0;
    while(1){
        time++;
        //한바귀 회전
        block c_belt[202];
        for(int i=0;i<2*N-1;i++){
            c_belt[i+1]=belt[i];
        }
        c_belt[0]=belt[2*N-1];

        for(int i=0;i<2*N;i++){
            belt[i]=c_belt[i];
        }

        if(belt[N-1].human == true) belt[N-1].human=false;

        for(int i=N-2;i>=0;i--){
            if(belt[i+1].human == false and belt[i].human==true and belt[i+1].dur >0){
                belt[i].human=false;
                belt[i+1].human=true;
                belt[i+1].dur--;
            }
        }

        if(belt[N-1].human==true) belt[N-1].human=false;

        if(belt[0].human == false and belt[0].dur>0){
            belt[0].human=true;
            belt[0].dur--;
        }
        int cnt=0;
        for(int i=0;i<2*N;i++){
            if(belt[i].dur==0)cnt++;
        }
        if(cnt>=K)break;

    }
    cout<<time<<endl;

}

하 오늘 청소년 어른 상어를 풀었다..... 그래도 어른상어는 난이도가 조금 낮았던것같다.

그래도 코드는 엄청 길어졌다는거.......

이건 조건이 많아서 헷갈릴수있다. 차근차근하면 되는것같다.

1만 남을때까지 하는것이기 때문에 반복문을 통해서 1만 남을때까지 반복한다.

그다음에 냄새를 뿌리고, 상어가 이동한다. 이때 우선순위에따라서 잘 이동시켜준다.

비어있을경우 한번, 비어있지 않을경우 한번 해준다.

여기서 배열을 복사해주는게 좋은게 유효성 검사를 할때 앞에서 바뀌게 되면 일관성이 없어진다.

그래서 카피를 만들어 줘야한다.

끝..

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

struct shark {
    int x;
    int y;
    int dir;//쳐다보고있는 방향
    bool move = false;
    int prior[4][4];
    bool out = false;
};
struct pos_info {
    int smell_cnt;
    int smell_num;
    int shark_num;
};



int main() {
    int N, M, K;
    int time = 0;
    pos_info board[20][20];
    pos_info c_board[20][20];
    shark s_list[400];
    cin >> N >> M >> K;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cin >> board[i][j].shark_num;
            board[i][j].smell_cnt = 0;
            board[i][j].smell_num = 0;
            if (board[i][j].shark_num != 0) {
                s_list[board[i][j].shark_num].x = i;
                s_list[board[i][j].shark_num].y = j;
            }
        }
    }
    for (int i = 1; i <= M; i++)cin >> s_list[i].dir; // 쳐다보고있는 방향
    for (int i = 1; i <= M; i++) {
        for (int j = 0; j < 4; j++) {
            for (int k = 0; k < 4; k++) {
                cin >> s_list[i].prior[j][k];
            }
        }
    }//입력받기

    while (1) {
        int s_cnt = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (board[i][j].shark_num != 0)s_cnt++;
            }
        }
        if (s_cnt == 1) {
            cout << time << endl;
            break;
        }

        for (int i = 1; i <= M; i++) { 
            if (s_list[i].out)continue;
            s_list[i].move = false; 
        }
        
        for (int i = 1; i <= M; i++) {
            shark temp = s_list[i];
            if (temp.out)continue;
            board[temp.x][temp.y].smell_cnt = K;
            board[temp.x][temp.y].smell_num = i;
        }//방구끼고

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                c_board[i][j] = board[i][j];
            }
        }

        for (int i = M; i >= 1; i--) {
            shark temp = s_list[i];
            if (temp.out)continue;
            int dir_prior;
            for (int j = 0; j < 4; j++) {
                dir_prior = temp.prior[temp.dir - 1][j];//우선순위 순서대로 간다
                if (dir_prior == 1) {
                    if (temp.x - 1 < 0)continue;
                    if (board[temp.x - 1][temp.y].smell_cnt == 0) { // 냄새가 비어있을때
                        if (c_board[temp.x - 1][temp.y].shark_num != 0) {
                            s_list[c_board[temp.x - 1][temp.y].shark_num].out = true;
                        }
                        c_board[temp.x - 1][temp.y].shark_num = i;
                        c_board[temp.x][temp.y].shark_num = 0;
                        s_list[i].x--;
                        s_list[i].move = true;
                        s_list[i].dir = 1;
                        break;
                    }
                }//상
                else if (dir_prior == 2) {
                    if (temp.x + 1 > N - 1)continue;
                    if (board[temp.x + 1][temp.y].smell_cnt == 0) {
                        if (c_board[temp.x + 1][temp.y].shark_num != 0) {
                            s_list[c_board[temp.x + 1][temp.y].shark_num].out = true;
                        }
                        c_board[temp.x + 1][temp.y].shark_num = i;
                        c_board[temp.x][temp.y].shark_num = 0;
                        s_list[i].x++;
                        s_list[i].move = true;
                        s_list[i].dir = 2;
                        break;
                    }
                }//하
                else if (dir_prior == 3) {
                    if (temp.y - 1 < 0)continue;
                    if (board[temp.x][temp.y - 1].smell_cnt == 0) {
                        if (c_board[temp.x][temp.y-1].shark_num != 0) {
                            s_list[c_board[temp.x][temp.y-1].shark_num].out = true;
                        }
                        c_board[temp.x][temp.y - 1].shark_num = i;
                        c_board[temp.x][temp.y].shark_num = 0;
                        s_list[i].y--;
                        s_list[i].move = true;
                        s_list[i].dir = 3;
                        break;
                    }
                }//왼
                else {
                    if (temp.y + 1 > N - 1)continue;
                    if (board[temp.x][temp.y + 1].smell_cnt == 0) {
                        if (c_board[temp.x][temp.y+1].shark_num != 0) {
                            s_list[c_board[temp.x][temp.y+1].shark_num].out = true;
                        }
                        c_board[temp.x][temp.y + 1].shark_num = i;
                        c_board[temp.x][temp.y].shark_num = 0;
                        s_list[i].y++;
                        s_list[i].move = true;
                        s_list[i].dir = 4;
                        break;
                    }
                }//오
            }
        }//비어있을때 이동

        for (int i = M; i >= 1; i--) {
            if (s_list[i].out)continue;
            if (!s_list[i].move) { //냄새가 다 차있어서 이동 못할때
                shark temp = s_list[i];
                int dir_prior;
                for (int j = 0; j < 4; j++) {
                    dir_prior = temp.prior[temp.dir - 1][j];
                    if (dir_prior == 1) {
                        if (temp.x - 1 < 0)continue;
                        if (board[temp.x - 1][temp.y].smell_num == i) {
                            if (c_board[temp.x-1][temp.y].shark_num != 0) {
                                s_list[c_board[temp.x-1][temp.y].shark_num].out = true;
                            }
                            c_board[temp.x - 1][temp.y].shark_num = i;
                            c_board[temp.x][temp.y].shark_num = 0;
                            s_list[i].x--;
                            s_list[i].move = true;
                            s_list[i].dir = 1;
                            break;
                        }
                    }
                    else if (dir_prior == 2) {
                        if (temp.x + 1 > N - 1)continue;
                        if (board[temp.x + 1][temp.y].smell_num == i) {
                            if (c_board[temp.x + 1][temp.y].shark_num != 0) {
                                s_list[c_board[temp.x + 1][temp.y].shark_num].out = true;
                            }
                            c_board[temp.x + 1][temp.y].shark_num = i;
                            c_board[temp.x][temp.y].shark_num = 0;
                            s_list[i].x++;
                            s_list[i].move = true;
                            s_list[i].dir = 2;
                            break;
                        }
                    }
                    else if (dir_prior == 3) {
                        if (temp.y - 1 < 0)continue;
                        if (board[temp.x][temp.y - 1].smell_num == i) {
                            if (c_board[temp.x][temp.y - 1].shark_num != 0) {
                                s_list[c_board[temp.x][temp.y - 1].shark_num].out = true;
                            }
                            c_board[temp.x][temp.y - 1].shark_num = i;
                            c_board[temp.x][temp.y].shark_num = 0;
                            s_list[i].y--;
                            s_list[i].move = true;
                            s_list[i].dir = 3;
                            break;
                        }
                    }
                    else {
                        if (temp.y + 1 > N - 1)continue;
                        if (board[temp.x][temp.y + 1].smell_num == i) {
                            if (c_board[temp.x][temp.y + 1].shark_num != 0) {
                                s_list[c_board[temp.x][temp.y + 1].shark_num].out = true;
                            }
                            c_board[temp.x][temp.y + 1].shark_num = i;
                            c_board[temp.x][temp.y].shark_num = 0;
                            s_list[i].y++;
                            s_list[i].move = true;
                            s_list[i].dir = 4;
                            break;
                        }
                    }
                }
            }
        }
        //이동

       

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                board[i][j] = c_board[i][j];
                if (board[i][j].shark_num == 0 and board[i][j].smell_cnt>0) {
                    board[i][j].smell_cnt--;
                    if (board[i][j].smell_cnt == 0)board[i][j].smell_num = 0;
                }
            }
        }//상어없는 모든칸에 냄새 하나줄이기

       

        time++;
        if (time > 1000) {
            cout << -1 << endl;
            return 0;
        }
    }
}

삼성 코딩테스트 준비하면서 푼 문제이다.

다른사람들은 다들 코드를 짧게 효율적으로 잘짜던데 나는 왜 안될까....

그래도 맞긴 맞았다.

dfs로 풀었는데, 트리구조에서 모든 노드 탐색하고 최소값 갱신해주는 형태로 풀었다.

 

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

struct pos {
    int x;
    int y;
};

int board[8][8];
int N, M;
int min_cnt = 100;

void count_zero(int p_board[8][8]) {
    int cnt = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (p_board[i][j] == 0)cnt++;
        }
    }
    if (min_cnt > cnt)min_cnt = cnt;
}


void dfs(int p_board[8][8], vector<pos> vec1, vector<pos> vec2, vector<pos> vec3, vector<pos> vec4, vector<pos> vec5) {
    int c_board[8][8];
    while (!vec5.empty()) {
        pos cur = vec5.back();
        vec5.pop_back();
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                c_board[i][j] = p_board[i][j];
            }
        }
        for (int i = cur.x; i < N; i++) {
            if (c_board[i][cur.y] == 6) break;
            else {
                c_board[i][cur.y] = 7;
            }
        }
        for (int i = cur.x; i >= 0; i--) {
            if (c_board[i][cur.y] == 6) break;
            else {
                c_board[i][cur.y] = 7;
            }
        }
        for (int i = cur.y; i < M; i++) {
            if (c_board[cur.x][i] == 6)break;
            else {
                c_board[cur.x][i] = 7;
            }
        }
        for (int i = cur.y; i >= 0; i--) {
            if (c_board[cur.x][i] == 6)break;
            else {
                c_board[cur.x][i] = 7;
            }
        }
        dfs(c_board,vec1,vec2,vec3,vec4,vec5);
    }

    while (!vec4.empty()) {
        pos cur = vec4.back();
        vec4.pop_back();
        for (int a = 0; a < 4; a++) {
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    c_board[i][j] = p_board[i][j];
                }
            }
            if (a == 0) {
                for (int i = cur.x; i >= 0; i--) {
                    if (c_board[i][cur.y] == 6)break;
                    c_board[i][cur.y] = 7;
                }
                for (int i = cur.x; i < N; i++) {
                    if (c_board[i][cur.y] == 6)break;
                    c_board[i][cur.y] = 7;
                }
                for (int i = cur.y; i >= 0; i--) {
                    if (c_board[cur.x][i] == 6)break;
                    c_board[cur.x][i] = 7;
                }
            }
            else if (a == 1) {
                for (int i = cur.x; i >= 0; i--) {
                    if (c_board[i][cur.y] == 6)break;
                    c_board[i][cur.y] = 7;
                }
                for (int i = cur.x; i < N; i++) {
                    if (c_board[i][cur.y] == 6)break;
                    c_board[i][cur.y] = 7;
                }
                for (int i = cur.y; i < M; i++) {
                    if (c_board[cur.x][i] == 6)break;
                    c_board[cur.x][i] = 7;
                }
            }
            else if (a == 2) {
                for (int i = cur.x; i < N; i++) {
                    if (c_board[i][cur.y] == 6)break;
                    c_board[i][cur.y] = 7;
                }
                for (int i = cur.y; i < M; i++) {
                    if (c_board[cur.x][i] == 6)break;
                    c_board[cur.x][i] = 7;
                }
                for (int i = cur.y; i >= 0; i--) {
                    if (c_board[cur.x][i] == 6)break;
                    c_board[cur.x][i] = 7;
                }
            }
            else if (a == 3) {
                for (int i = cur.x; i >= 0; i--) {
                    if (c_board[i][cur.y] == 6)break;
                    c_board[i][cur.y] = 7;
                }
                for (int i = cur.y; i < M; i++) {
                    if (c_board[cur.x][i] == 6)break;
                    c_board[cur.x][i] = 7;
                }
                for (int i = cur.y; i >= 0; i--) {
                    if (c_board[cur.x][i] == 6)break;
                    c_board[cur.x][i] = 7;
                }
            }
            dfs(c_board, vec1, vec2, vec3, vec4, vec5);
        }
    }

    while (!vec3.empty()) {
        pos cur = vec3.back();
        vec3.pop_back();
        for (int a = 0; a < 4; a++) {
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    c_board[i][j] = p_board[i][j];
                }
            }
            if (a == 0) {
                for (int i = cur.x; i < N; i++) {
                    if (c_board[i][cur.y] == 6)break;
                    c_board[i][cur.y] = 7;
                }
                for (int i = cur.y; i < M; i++) {
                    if (c_board[cur.x][i] == 6)break;
                    c_board[cur.x][i] = 7;
                }
            }
            else if (a == 1) {
                for (int i = cur.x; i >=0; i--) {
                    if (c_board[i][cur.y] == 6)break;
                    c_board[i][cur.y] = 7;
                }
                for (int i = cur.y; i < M; i++) {
                    if (c_board[cur.x][i] == 6)break;
                    c_board[cur.x][i] = 7;
                }
            }
            else if (a == 2) {
                for (int i = cur.x; i < N; i++) {
                    if (c_board[i][cur.y] == 6)break;
                    c_board[i][cur.y] = 7;
                }
                for (int i = cur.y; i >=0; i--) {
                    if (c_board[cur.x][i] == 6)break;
                    c_board[cur.x][i] = 7;
                }
            }
            else if (a == 3) {
                for (int i = cur.x; i >= 0; i--) {
                    if (c_board[i][cur.y] == 6)break;
                    c_board[i][cur.y] = 7;
                }
                for (int i = cur.y; i >= 0; i--) {
                    if (c_board[cur.x][i] == 6)break;
                    c_board[cur.x][i] = 7;
                }
            }
            dfs(c_board, vec1, vec2, vec3, vec4, vec5);
        }
    }

    while (!vec2.empty()) {
        pos cur = vec2.back();
        vec2.pop_back();
        for (int a = 0; a < 2; a++) {
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    c_board[i][j] = p_board[i][j];
                }
            }
            if (a == 0) {
                for (int i = cur.x; i < N; i++) {
                    if (c_board[i][cur.y] == 6)break;
                    else {
                        c_board[i][cur.y] = 7;
                    }
                }
                for (int i = cur.x; i >=0; i--) {
                    if (c_board[i][cur.y] == 6)break;
                    else {
                        c_board[i][cur.y] = 7;
                    }
                }
            }
            else if (a == 1) {
                for (int i = cur.y; i < M; i++) {
                    if (c_board[cur.x][i] == 6)break;
                    else {
                        c_board[cur.x][i] = 7;
                    }
                }
                for (int i = cur.y; i >= 0; i--) {
                    if (c_board[cur.x][i] == 6)break;
                    else {
                        c_board[cur.x][i] = 7;
                    }
                }
            }
            dfs(c_board, vec1, vec2, vec3, vec4, vec5);
        }
    }

    while (!vec1.empty()) {
        pos cur = vec1.back();
        vec1.pop_back();
        for (int a = 0; a < 4; a++) {
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    c_board[i][j] = p_board[i][j];
                }
            }
            if (a == 0) {
                for (int j = cur.x; j < N; j = j + 1) {
                    if (c_board[j][cur.y] == 6)break;
                    else {
                        c_board[j][cur.y] = 7;
                    }
                }
            }
            else if (a == 2) {
                for (int j = cur.x; j >= 0; j = j - 1) {
                    if (c_board[j][cur.y] == 6)break;
                    else {
                        c_board[j][cur.y] = 7;
                    }
                }
            }
            else if (a == 3) {
                for (int j = cur.y; j < M; j++) {
                    if (c_board[cur.x][j] == 6)break;
                    else {
                        c_board[cur.x][j] = 7;
                    }
                }
            }
            else {
                for (int j = cur.y; j >= 0; j--) {
                    if (c_board[cur.x][j] == 6)break;
                    else {
                        c_board[cur.x][j] = 7;
                    }
                }
            }
            dfs(c_board,vec1,vec2,vec3,vec4,vec5);
        }
    }
    count_zero(p_board);
}


int main() {
    vector<pos> vec1, vec2, vec3, vec4, vec5;
    cin >> N >> M;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> board[i][j];
            if (board[i][j] == 1) {
                vec1.push_back({ i,j,0 });
            }
            else if (board[i][j] == 2) {
                vec2.push_back({ i,j });
            }
            else if (board[i][j] == 3) {
                vec3.push_back({ i,j });
            }
            else if (board[i][j] == 4) {
                vec4.push_back({ i,j });
            }
            else if (board[i][j] == 5) {
                vec5.push_back({ i,j });
            }
        }
    }

    dfs(board,vec1,vec2,vec3,vec4,vec5);
    cout << min_cnt << endl;
}

이문제를 푸는데 정말 오랜시간이 걸린것같다. 혼자서 풀다가 힘들어서 다른사람의 블로그를 뒤져봤다.

 

정말 오랜만에 푸는거라 코드도 노가다가 정말 많았다.

 

이문제는 물고기의 이동이 첫번째 난관이고 상어가 먹는것을 DFS형태로 완전탐색을 해주면 된다.

트리구조로 이루어진다. 전역변수를 max_eat을 두고 큰값이 나오면 갱신해 주는 형태로 했다. 코드가 굉장히 비효율적으로 짜졌지만 직관적이라 이해하는데 도움은 될것같다. 다음에 다시 리팩토링해서 올리면 좋을것같다......

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

struct fish {
	int x;
	int dir;
};
struct pos {
	int x;
	int y;
};

int max_eat = 0;

int xdir[9] = {0,-1,-1,0,1,1,1,0,-1};
int ydir[9] = {0,0,-1,-1,-1,0,1,1,1};

void dfs(fish board[4][4], int eat_num, int ox, int oy, int nx, int ny) {
	eat_num += board[nx][ny].x;
	board[nx][ny].x = 17;
	if (ox != -1 and oy != -1) {
		board[ox][oy].x = 0;
		board[ox][oy].dir = 0;
	}
	fish temp;
	for (int k = 1; k <= 16; k++) {
		for (int i = 0; i < 4; i++) {
			for (int j = 0; j < 4; j++) {
				if (board[i][j].x == k) {
					//fish move
					while (1) {
						if (i + xdir[board[i][j].dir] < 0 or i + xdir[board[i][j].dir] >= 4 or j + ydir[board[i][j].dir] < 0 or j + ydir[board[i][j].dir] >= 4) {
							board[i][j].dir = board[i][j].dir+1;
							if (board[i][j].dir == 9)board[i][j].dir = 1;
							continue;
						}
						else if (board[i + xdir[board[i][j].dir]][j + ydir[board[i][j].dir]].x == 17) {
							board[i][j].dir = board[i][j].dir + 1;
							if (board[i][j].dir == 9)board[i][j].dir = 1;

							continue;
						}
						else {
							temp = board[i + xdir[board[i][j].dir]][j + ydir[board[i][j].dir]];
							board[i + xdir[board[i][j].dir]][j + ydir[board[i][j].dir]] = board[i][j];
							board[i][j] = temp;
							goto silver;
						}
					}
				}
			}
		}
	silver:;
	}

	//먹을거 결정
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 4; j++) {
			if (board[i][j].x == 17) {
				if (board[i][j].dir == 1) {
					vector<pos> vec;
					if (i - 1 < 0) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					int t_i = i - 1;
					while (1) {
						if (board[t_i][j].x != 0)vec.push_back({ t_i,j });
						t_i--;
						if (t_i < 0)break;
					}
					if (vec.empty()) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					while (!vec.empty()) {
						pos cur = vec.back();
						vec.pop_back();
						fish temp_board[4][4];
						for (int k = 0; k < 4; k++) {
							for (int t = 0; t < 4; t++) {
								temp_board[k][t] = board[k][t];
							}
						}
						dfs(temp_board, eat_num, i, j, cur.x, cur.y);
					}

				}
				else if (board[i][j].dir == 2) {
					vector<pos> vec;
					if (i - 1 < 0 or j - 1 < 0) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					int t_i = i - 1, t_j = j - 1;
					while (1) {
						if (board[t_i][t_j].x != 0)vec.push_back({ t_i,t_j });
						t_i--;
						t_j--;
						if (t_i < 0 or t_j < 0)break;
					}
					if (vec.empty()) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					while (!vec.empty()) {
						pos cur = vec.back();
						vec.pop_back();
						fish temp_board[4][4];
						for (int k = 0; k < 4; k++) {
							for (int t = 0; t < 4; t++) {
								temp_board[k][t] = board[k][t];
							}
						}
						dfs(temp_board, eat_num, i, j, cur.x, cur.y);
					}
				}
				else if (board[i][j].dir == 3) {
					vector<pos> vec;
					if (j - 1 < 0) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					int t_j = j - 1;
					while (1) {
						if (board[i][t_j].x != 0)vec.push_back({ i,t_j });
						t_j--;
						if (t_j < 0)break;
					}
					if (vec.empty()) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					while (!vec.empty()) {
						pos cur = vec.back();
						vec.pop_back();
						fish temp_board[4][4];
						for (int k = 0; k < 4; k++) {
							for (int t = 0; t < 4; t++) {
								temp_board[k][t] = board[k][t];
							}
						}
						dfs(temp_board, eat_num, i, j, cur.x, cur.y);
					}
				}
				else if (board[i][j].dir == 4) {
					vector<pos> vec;
					if (i + 1 >= 4 or j - 1 < 0) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					int t_i = i + 1, t_j = j - 1;
					while (1) {
						if (board[t_i][t_j].x != 0)vec.push_back({ t_i,t_j });
						t_i++;
						t_j--;
						if (t_i >= 4 or t_j < 0)break;
					}
					if (vec.empty()) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					while (!vec.empty()) {
						pos cur = vec.back();
						vec.pop_back();
						fish temp_board[4][4];
						for (int k = 0; k < 4; k++) {
							for (int t = 0; t < 4; t++) {
								temp_board[k][t] = board[k][t];
							}
						}
						dfs(temp_board, eat_num, i, j, cur.x, cur.y);
					}
				}
				else if (board[i][j].dir == 5) {
					vector<pos> vec;
					if (i + 1 >= 4) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					int t_i = i + 1;
					while (1) {
						if (board[t_i][j].x != 0)vec.push_back({ t_i, j });
						t_i++;
						if (t_i >= 4)break;
					}
					if (vec.empty()) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					while (!vec.empty()) {
						pos cur = vec.back();
						vec.pop_back();
						fish temp_board[4][4];
						for (int k = 0; k < 4; k++) {
							for (int t = 0; t < 4; t++) {
								temp_board[k][t] = board[k][t];
							}
						}
						dfs(temp_board, eat_num, i, j, cur.x, cur.y);
					}
				}
				else if (board[i][j].dir == 6) {
					vector<pos> vec;
					if (i + 1 >= 4 or j + 1 >= 4) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					int t_i = i + 1, t_j = j + 1;
					while (1) {
						if (board[t_i][t_j].x != 0)vec.push_back({ t_i,t_j });
						t_i++;
						t_j++;
						if (t_i >= 4 or t_j >= 4)break;
					}
					if (vec.empty()) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					while (!vec.empty()) {
						pos cur = vec.back();
						vec.pop_back();
						fish temp_board[4][4];
						for (int k = 0; k < 4; k++) {
							for (int t = 0; t < 4; t++) {
								temp_board[k][t] = board[k][t];
							}
						}
						dfs(temp_board, eat_num, i, j, cur.x, cur.y);
					}
				}
				else if (board[i][j].dir == 7) {
					vector<pos> vec;
					if (j + 1 >= 4) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					int t_j = j + 1;
					while (1) {
						if (board[i][t_j].x != 0)vec.push_back({ i,t_j });
						t_j++;
						if (t_j >= 4)break;
					}
					if (vec.empty()) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					while (!vec.empty()) {
						pos cur = vec.back();
						vec.pop_back();
						fish temp_board[4][4];
						for (int k = 0; k < 4; k++) {
							for (int t = 0; t < 4; t++) {
								temp_board[k][t] = board[k][t];
							}
						}
						dfs(temp_board, eat_num, i, j, cur.x, cur.y);
					}
				}
				else if (board[i][j].dir == 8) {
					vector<pos> vec;
					if (i - 1 < 0 or j + 1 >= 4) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					int t_i = i - 1, t_j = j + 1;
					while (1) {
						if (board[t_i][t_j].x != 0)vec.push_back({ t_i,t_j });
						t_i--;
						t_j++;
						if (t_i < 0 or t_j >= 4)break;
					}
					if (vec.empty()) {
						if (max_eat < eat_num)max_eat = eat_num;
						return;
					}
					while (!vec.empty()) {
						pos cur = vec.back();
						vec.pop_back();
						fish temp_board[4][4];
						for (int k = 0; k < 4; k++) {
							for (int t = 0; t < 4; t++) {
								temp_board[k][t] = board[k][t];
							}
						}
						dfs(temp_board, eat_num, i, j, cur.x, cur.y);
					}
				}
			}
		}
	}
}

int main() {
	fish arr[4][4];
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 4; j++) {
			cin >> arr[i][j].x >> arr[i][j].dir;
		}
	}//입력받기
	dfs(arr, 0, -1, -1, 0, 0);
	cout << max_eat << endl;
}

저번에 풀었는데, 런타임에러나서 질문을 올렸었다.

 

근데 리턴값 안줘서 그런것같다고 그랬다.... 그래서 리턴값 모두 설정해줬더니 됐다.....

그리고 다른사람들이 풀어놓은거 보니깐. 굉장히 sort함수 써서 잘했던데 나는 몰랐다. 

나는 멍청이다. 소팅함수를 구현했다고 보면된다......

#include<iostream>
#include<string>

using namespace std;

string arr[20001];

void initialize(int input) {
	for (int i = 0; i < input; i++) {
		arr[i] = "";
	}
}

void push_back(int start, int end) {
	for (int i = end-1; i >= start; i--) {
		arr[i + 1] = arr[i];
	}
}

bool insert_sort(string input, int num) {
	for (int i = 0; i < num; i++) {
		if (arr[i] == input) {
			return false;
		}
		if (arr[i].length() > input.length()) { //뒤로 미뤄줘야한다.
			push_back(i, num);
			arr[i] = input;
			return true;
		}
		else if (arr[i].length() == input.length()) { //길이가 같다면, 사전순으로 비교
			for (int j = 0; j < input.length(); j++) {
				if (int(arr[i][j]) > int(input[j])) { //입력이 앞설때
					push_back(i, num);
					arr[i] = input;
					return true;
				}
				else if (arr[i][j] < input[j]) {
					break;
				}
			}
		}
	}
	arr[num] = input;
    return true;
}

int main(void) {
	cin.tie(NULL);
	cout.tie(NULL);
	ios_base :: sync_with_stdio(false);
	int T;
	string str;
	cin >> T;
	initialize(T);
	cin >> str;
	arr[0] = str;
	for(int i=1;i<T;i++){
		cin >> str;
		if (insert_sort(str, i) == false) {
			i--;
			T--;
			continue;
		}
	}

	for (int j = 0; j < T; j++) {
		cout << arr[j] << "\n";
	}
    return 0;
}

카페에 왔는데 영어공부하기 시끄러워서 백준 한문제를 풀었다.

문제 링크 : https://www.acmicpc.net/problem/6588

 

6588번: 골드바흐의 추측

문제 1742년, 독일의 아마추어 수학가 크리스티안 골드바흐는 레온하르트 오일러에게 다음과 같은 추측을 제안하는 편지를 보냈다. 4보다 큰 모든 짝수는 두 홀수 소수의 합으로 나타낼 수 있다. 예를 들어 8은 3 + 5로 나타낼 수 있고, 3과 5는 모두 홀수인 소수이다. 또, 20 = 3 + 17 = 7 + 13, 42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23 이다. 이 추측은 아직도 해결되지 않은 문제이다. 백만 이하의 모

www.acmicpc.net

문제가 크게 어렵지는 않았다.

3부터 입력된 숫자까지 돌아가며 찾으면 된다. 

b-a가 가장 큰 값을 찾으라고했는데 그냥 루프 돌다가 찾은게 가장작은 것이기 때문에 찾으면 브레이크하면 끝이다.

지적은 언제나 환영입니다.

#include<iostream>
#include<cmath>

using namespace std;

bool prime_num_discriminator(int input) {
	for (int i = 2; i <= sqrt(input); i++) {
		if (input%i == 0)return false;
	}
	return true;
}

int main(void) {
	cin.tie(NULL);
	cout.tie(NULL);
	ios_base :: sync_with_stdio(false);
	int input = 1;
	int a, b;
	bool suc = false;
	
	while (input) {
		cin >> input;
		for (int i = 1; i < input / 2; i++) {
			a = 2 * i + 1; //홀수
			b = input - a;
			if (prime_num_discriminator(a) and prime_num_discriminator(b)) {
				cout << input << " = " << a << " + " << b << "\n";
				suc = true;
				break;
			}
		}
		if (!suc) cout << "Goldbach's conjecture is wrong\n";
	}
}

문제 링크 : https://www.acmicpc.net/problem/1182 <- 여기

오랜만에 문제를 풀어보았다.

부분 수열의 합인데, 완전탐색으로 할수있다. 하지만 겹치는건 카운팅하면 안된다.

그래서 들어갔던건 빼고 그 뒤에꺼부터 DFS에 넣어주면 된다.

코드를 확인하면 된다.

#include <iostream>

using namespace std;

int arr[20];
int n, s;
int cnt = 0;

void init_arr(int input) {
	for (int i = 0; i < input; i++) {
		arr[i] = 0;
	}
}

void dfs(int sum, int input) {
	
	if (sum == s and input !=0) {
		cnt++;
	}

	if (input == n) return;

	for (int i = input; i < n; i++) {
		dfs(sum + arr[i], i + 1);
	}
}

int main(void) {
	cin >> n >> s;
	init_arr(n);
	

	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}

	dfs(0, 0);
	cout << cnt << endl;
}

내가 어떻게 풀었는지 기록할려고 쓴다.

문제는 문자열을 받았을때, 문자열을 숫자로 변환하는게 문제다.

그럼 일단 문자열을 입력 받는게 우선이다.

문자열을 입력받고, 문자열을 반복문을 통해 하나하나 읽어 나간다.

경우의 수는 네가지이다. (,),[,] 이렇게 네가지로 나누어서 처리를 해준다.

근데 나는 처음에 ),] 이 닫아주는 문자열이 나올때 숫자를 업데이트 할려고했다.

예를 들면, (()[[]]) = 2*(2+3*(3)) = 22 이다. 그런데 분배법칙으로 풀면 2*2 + 2*3*3 이렇게 나온다.

내 생각이 짧았다. 분배법칙이 가능하기때문에 tmp 변수를 초기에 1로 두고, 괄호를 열어주는 문자가 나오면 곱해주면서 분배법칙이 잘적용될수있는 파라미터를 만든다. 그러다가 닫아주는 문자가 나오면 tmp를 결과값에 더해주고 나눠준다.

그리고 나머지 에러들을 처리해준다. 만약 잘못된물자열이라면 짝이 안맞을 것이다. 스택에서 나오는게 현재 문자와 짝이 안맞을 경우, 문자열이 끝나지 않았는데 스택이 비어버리는 경우, 문자열이 끝났는데 스택에 남아있는 경우가 있을것이다.

솔직히 이해는 되지만 말로 설명하기는 좀 힘들다.

알고리즘 문제는 많이 풀어보면서 외우는것도 좋은 방법인것같다.

#include <iostream>
#include<stack>
#include<string>

using namespace std;


int main()
{
	int tmp = 1, output = 0;
	string str;
	bool wrong = false;
	stack<char> st;
	cin >> str;
	for (int i = 0; i < str.length(); i++) {
		if (str[i] == '(') {
			st.push('(');
			tmp *= 2;
		}
		else if (str[i] == '[') {
			st.push('[');
			tmp *= 3;
		}

		else if (str[i] == ')') {
			if (st.empty()) {
				wrong = true;
				break;
			}
			if (st.top() == '(') {
				if (str[i - 1] == '(') output += tmp;
				st.pop();
				tmp /= 2;
			}
			else {
				wrong = true;
				break;
			}
		}
		else if (str[i] == ']') {
			if (st.empty()) {
				wrong = true;
				break;
			}
			if (st.top() == '[') {
				if(str[i-1]=='[') output += tmp;
				st.pop();
				tmp /= 3;
			}
			else {
				wrong = true;
				break;
			}
		}
	}

	if (wrong or !st.empty()) {
		cout << 0 << endl;
	}
	else {
		cout << output << endl;
	}
}
​

+ Recent posts