ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 14226 (이모티콘)
    컴퓨터 공학 기초/알고리즘 (브루트포스) 2020. 8. 4. 18:49

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

     

    14226번: 이모티콘

    영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다. 영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만��

    www.acmicpc.net

    해당 문제는 영선이가 효빈에에게 이모티콘 S개를 보내려 할 때 조건에 따라 이모티콘의 수를 변경하며 최소 몇 초 만에 S개의 이모티콘을 보낼 수 있는지 구하는 문제이다.

    이모티콘의 수를 변경할 수 있는 방법은 다음과 같으며 각 방법을 시행시 1초가 소요된다.

    조건 

    1. 화면에 있는 이모티콘 전부를 클립보드에 복붙 하는경우 (따라서 화면에 이모티콘이 0이라면 수행 X)

    2. 화면에 있는 이모티콘 중 하나를 없애는 경우 (따라서 화면에 이모티콘이 0이라면 수행 X)

    3. 클립보드에 있는 이모티콘을 화면에 추가하는 경우 (따라서 클립보드에 이모티콘이 없다면 수행 X)

    위와 같은 조건에 맞게 이모티콘의 수를 조절할 수 있다.

     

    풀이 :

    해당 문제는 BFS를 이용한 각 조건에 맞는 경우의 수를 모두 탐색하며 최솟값을 구하면 된다. 이때 주의해야 할 점은 다음과 같다.

    1. 만약 화면에 있는 이모티콘 1개와 클립보드에 있는 이모티콘이 0개일 때 해당 경우의 조건을 수행 시 visit 배열에 체크해주어야 한다. EX -> visit [화면 이모티콘 개수][클립 보드 이모티콘 개수] == 0 일 때 즉 해당 경우를 방문한 적 없을 때 에만 수행

    2. 문제의 조건중 보내려는 최대 이모티콘의 개수는 1000개로 설정이 되어있다 따라서 클립보드에서 화면으로 복붙하는 경우 1000을 넘게 된다면 visit 배열에 체크 시 런타임 애러가 일어난다 따라서 항상 클립보드에서 화면으로 복사 및 붙여 넣기 수행 시 화면 이모티콘 + 클립보드 이모티콘 개수가 1000과 같거나 작은지 확인하여야 한다.

    #include <algorithm>
    #include <iostream>
    #include <string>
    #include <queue>
    
    using namespace std;
    
    int visit[1001][1001];
    int targetNUm;
    struct Node{
    	int mCnt, bCnt;
    	int cnt;
    };
    
    int bfs(int sm, int sb){
    	queue<Node> qu;
    	qu.push({ sm, sb });
    	visit[sm][sb] = 1;
    
    	while (!qu.empty()){
    		Node now = qu.front();
    		if (now.cnt > 1000) return 0;
    		if (now.mCnt == targetNUm) return now.cnt;
    		if (now.mCnt > 0){
    			// 화면에서 클립보드로 복붙
    			if (visit[now.mCnt][now.mCnt] == 0){
    				visit[now.mCnt][now.mCnt] = 1;
    				qu.push({ now.mCnt, now.mCnt, now.cnt + 1 });
    			}
    			// 화면의 이모티콘 1개 제거
    			if (visit[now.mCnt - 1][now.bCnt] == 0){
    				visit[now.mCnt - 1][now.bCnt] = 1;
    				qu.push({ now.mCnt - 1, now.bCnt, now.cnt + 1 });
    			}
    		}
    		if (now.bCnt > 0){
    			// 클립보드의 이모티콘 화면으로 복붙
    			if (now.mCnt + now.bCnt <= 1000 && visit[now.mCnt + now.bCnt][now.bCnt] == 0){
    				visit[now.mCnt + now.bCnt][now.bCnt] = 1;
    				qu.push({ now.mCnt + now.bCnt, now.bCnt, now.cnt + 1 });
    			}
    		}
    		qu.pop();
    	}
    
    }
    
    int main(){
    	//freopen_s(new FILE*, "tes.text", "r", stdin);
    	cin >> targetNUm;
    	cout << bfs(1, 0) << endl;
    
    }
    

    댓글

Designed by Tistory.