'1', '0'은 각각 검은돌과 흰돌을 의미하고 '.'은 공백을 의미한다. '1', '0', '.'으로 이루어진 문자열을 입력받고 규칙에 의해 1과 0이 따먹은 돌의 양을 출력하라.
<<<규칙은 다음과 같다.>>>
1. 같은 색의 돌들을 다른 색의 돌이 둘러싸고 있을 때 둘러싸인 돌은 따먹힌다.
2. 상대편의 돌을 둘러 쌌을 때 상대편 돌안에 공백이 한군데 있고 공백이 3칸 이내일 경우 그돌들을 따먹을 수 있다.
다음과 같은 과정을 거쳐서 따먹은 돌을 카운트 할 수 있다.
1. i번째 문자열이 0인지 확인한다.
1-1 참이면, 1)이전에 0이 있었는지 확인한다.
1-1-1 참이면, 이전 0 뒤에 1이 있고 지금 0 앞에 1이 있는지 확인한다.
1-1-1-1 참이면,
1)이전 0 다음 칸부터 지금 0 전칸 까지 1의 갯수를 센다.
2)그 구간의 공백 구간의 수를 샌다.
3) 그 구간의 연속된 공백의 갯수를 센다.
4)공백구간이 1이하이며 연속된 공백이 3이하이면, 1의 갯수를 따먹은 1 갯수에 더해준다.
1-1 2)이전 0의 위치를 지금 0의 위치로 갱신한다.
2. 1과정을 '1'에 대해서도 행한다.
3. 1과 2를 문자열의 처음부터 끝까지 반복진행한다.
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
int main(){
int i,j,num_w=0,num_b=0,c,pre=-1,num_s,ser_s;
string str;
cin >> str;
for(i = 0; i<str.length();i++){
if(str[i] == '0'){
if(pre!=-1){
if(str[pre+1]=='1'&&str[i-1]=='1'){
c=0;
num_s=0;
ser_s=0;
for(j=pre+1;j<i;j++){
if(str[j]=='1')c++;
else if(str[j-1]=='.'&&str[j]=='.')ser_s++;
else if(str[j-1]!='.'&&str[j]=='.')num_s++;
}
if(ser_s<3&&num_s<2) num_b+=c;
}
}
pre=i;
}
}
for(i=0;i<str.length();i++){
if(str[i] == '1'){
if(pre!=-1){
if(str[pre+1]=='0'&&str[i-1]=='0'){
c=0;
num_s=0;
ser_s=0;
for(j=pre+1;j<i;j++){
if(str[j]=='0')c++;
else if(str[j-1]=='.'&&str[j]=='.')ser_s++;
else if(str[j-1]!='.'&&str[j]=='.')num_s++;
}
if(ser_s<3&&num_s<2) num_w+=c;
}
}
pre=i;
}
}
cout<<"0 : "<<num_b<<endl;
cout<<"1 : "<<num_w<<endl;
system("PAUSE");
return 0;
}
실행결과
101010001...10010011100.11.111010011.01.00111
0 : 9
1 : 12
Press any key to continue . . .
<<<규칙은 다음과 같다.>>>
1. 같은 색의 돌들을 다른 색의 돌이 둘러싸고 있을 때 둘러싸인 돌은 따먹힌다.
2. 상대편의 돌을 둘러 쌌을 때 상대편 돌안에 공백이 한군데 있고 공백이 3칸 이내일 경우 그돌들을 따먹을 수 있다.
다음과 같은 과정을 거쳐서 따먹은 돌을 카운트 할 수 있다.
1. i번째 문자열이 0인지 확인한다.
1-1 참이면, 1)이전에 0이 있었는지 확인한다.
1-1-1 참이면, 이전 0 뒤에 1이 있고 지금 0 앞에 1이 있는지 확인한다.
1-1-1-1 참이면,
1)이전 0 다음 칸부터 지금 0 전칸 까지 1의 갯수를 센다.
2)그 구간의 공백 구간의 수를 샌다.
3) 그 구간의 연속된 공백의 갯수를 센다.
4)공백구간이 1이하이며 연속된 공백이 3이하이면, 1의 갯수를 따먹은 1 갯수에 더해준다.
1-1 2)이전 0의 위치를 지금 0의 위치로 갱신한다.
2. 1과정을 '1'에 대해서도 행한다.
3. 1과 2를 문자열의 처음부터 끝까지 반복진행한다.
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
int main(){
int i,j,num_w=0,num_b=0,c,pre=-1,num_s,ser_s;
string str;
cin >> str;
for(i = 0; i<str.length();i++){
if(str[i] == '0'){
if(pre!=-1){
if(str[pre+1]=='1'&&str[i-1]=='1'){
c=0;
num_s=0;
ser_s=0;
for(j=pre+1;j<i;j++){
if(str[j]=='1')c++;
else if(str[j-1]=='.'&&str[j]=='.')ser_s++;
else if(str[j-1]!='.'&&str[j]=='.')num_s++;
}
if(ser_s<3&&num_s<2) num_b+=c;
}
}
pre=i;
}
}
for(i=0;i<str.length();i++){
if(str[i] == '1'){
if(pre!=-1){
if(str[pre+1]=='0'&&str[i-1]=='0'){
c=0;
num_s=0;
ser_s=0;
for(j=pre+1;j<i;j++){
if(str[j]=='0')c++;
else if(str[j-1]=='.'&&str[j]=='.')ser_s++;
else if(str[j-1]!='.'&&str[j]=='.')num_s++;
}
if(ser_s<3&&num_s<2) num_w+=c;
}
}
pre=i;
}
}
cout<<"0 : "<<num_b<<endl;
cout<<"1 : "<<num_w<<endl;
system("PAUSE");
return 0;
}
실행결과
101010001...10010011100.11.111010011.01.00111
0 : 9
1 : 12
Press any key to continue . . .
댓글
댓글 쓰기