명령 프롬프트 문제는 주어진 문자열들을 비교하여 불일치가 발생한 문자에 대해 ?로 표현하여 출력하는 문제이다.
하나의 문자열이라도 불일치가 발생한 경우 불일치가 발생한 위치의 문자는 ?로 출력되므로 비교할 기준이 되는 문자열 하나만을 저장하여 다른 문자열들과 비교하고 불일치가 발생한 위치의 문자를 ?로 변경한다면 공간적인 낭비를 줄일 수 있다.
또한 문자열의 길이 최대 값은 50이지만 그보다 작은 길이의 문자열 입력이 발생할 수 있다.
scanf 함수를 통해서 입력 받은 문자열의 마지막 문자는 NULL(‘\0’)이 입력되므로 (i<51 && arr[i] != NULL) 혹은 (i<51 && arr[i])의 조건문을 수행한다면 &&연산에 의하여 i<51을 만족하지 않는다면 뒤의 연산을 수행하지 않기 때문에 문자열 길이 내의 검사를 수행할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#include<iostream> usingnamespacestd; #define MAXSIZE 51 int N; char arr[MAXSIZE], temp[MAXSIZE];
DFS란 깊이 우선 탐색(Depth-First Search), BFS란 너비 우선 탐색(Breadth-First Search)으로서 모든 정점을 한 번씩만 방문하여 모든 노드를 탐색하는 그래프 탐색 알고리즘이다.
명칭에서도 알 수 있듯이, DFS는 깊이 우선 탐색으로 더 이상 이동할 수 있는 노드가 없을 때까지 연결된 노드를 지속적으로 방문한 후 이전 노드로 돌아가 연결된 다른 노드를 방문하는 backtracking 방식을 사용하며 BFS는 너비 우선 탐색으로 노드에 가까운 노드들을 모두 방문한 후에 해당 노드들에 연결된 노드를 방문하는 방식으로 구현되어있다.
DFS의 경우 깊이를 우선시 하기 위해 LIFO인 stack을 사용하거나 재귀함수를 사용하여 탐색할 수 있으며, BFS의 경우 너비를 우선시 하기 위해 FIFO인 queue를 사용한다.
유기농 배추 문제는 배추가 심어져 있는 땅의 위치 X와 Y를 입력으로 받는다. 입력받은 배추들을 확인할 예정에 두고 인접한 위치에 배추가 존재하지 않을 때까지 방문하지 않은 인접 배추들을 확인하도록 하여 그룹을 체크할 수 있다.
#include<iostream> usingnamespacestd; #define MAXSIZE 51 #define CHESSSIZE 8 int N,M,result=64;//8x8이므로 아무리 색을 다시칠해도 64의 결과가 나올 수 없음 char arr[MAXSIZE][MAXSIZE];
intcheck(int n,int m){ //8x8에서 인접한 위치와 충돌이 일어나는 수 int result1=0, result2=0; for(int i=0;i<CHESSSIZE;i++){ for(int j=0;j<CHESSSIZE;j++){ if(i%2==j%2){//0,0 || 1,1 if(arr[n+i][m+j]!='W') result1++; if(arr[n+i][m+j]!='B') result2++; }else{//0,1 || 1,0 if(arr[n+i][m+j]!='B') result1++; if(arr[n+i][m+j]!='W') result2++; } } } return (result1<result2)?result1:result2; }
intmain(){ scanf("%d %d",&N,&M); for(int i=0;i<N;i++) scanf("%s",&arr[i]); //풀이 1: 가장 간단한 방법, N-8, M-8의 경우의 수를 전부 조사하여 최소값 구하기 for(int i=0;i<=N-8;i++){//시작점 세팅 for(int j=0;j<=M-8;j++){ int temp = check(i,j); result = (result>temp)?temp:result; } } printf("%d\n",result); }