boj 11656번 문제를 통해 접하게된, st.length() 값을 곧바로 사용하는 것이 굉장히 잘못된 방법이 될 수 있는 경우에 대해서.

boj 11656번 문제를 풀때, 처음에 작성한 코드의 형태는

#include <bits/stdc++.h>
using namespace std;

vector<string> stArr;

int main() {
	ios::sync_with_stdio(0); 
	cin.tie(0); 
	string st;
	cin >> st;
	int cnt = 0;
	//int len_st = st.length();
	for (int i = 0; i <st.length(); i++) {
		cout << st.length();
		st.erase(0,1);
		stArr.push_back(st);
		cnt++;
	}
	for (auto i : stArr)
		cout << i << '\n';
	cout << cnt;
}

 

이런 형태였다. 

이때에 출력을 해보면, 

이런식으로 joon까지만 시행되고 그 뒤로는 시행이 되지 않았다.

 왜 이런가 곰곰이 생각해보다가, 코드를  

 

#include <bits/stdc++.h>
using namespace std;

vector<string> stArr;

int main() {
	ios::sync_with_stdio(0); 
	cin.tie(0); 
	string st;
	cin >> st;
	int cnt = 0;
	int len_st = st.length();
	for (int i = 0; i <len_st; i++) {
		cout << st.length();
		st.erase(0,1);
		stArr.push_back(st);
		cnt++;
	}
	for (auto i : stArr)
		cout << i << '\n';
	cout << cnt;
}

이렇게 수정해서, 처음 받아들인 baekjoon이라는 글자의 갯수만큼의 값을 int len_st에 복사해서 넣어주고, 

그 복사한 값인 len_st를 for문에 넣었을때의 시행 결과를 보면, 

이렇게 내가 원하는 시행 결과를 나타내주는걸 볼 수 있다. 

계속해서 for문의 범위를 st.length() 보다 작게 설정하고, 함수 내에서 erase를 통해서 st의 길이를 줄이다 보니까

한번 for문이 돌고 다음번째가 되었을때 st.length의 길이가 달라지기 때문에 4에 도달했을때 for문이 종료되었다.

 i가 순차적으로 

i=0 일때, 8보다 작은 경우까지,

i=1 일때, <7보다 작은 경우까지, (6까지)

i=2 일때, <6 보다 작은 경우까지(5까지)

i=3일때, <5보다 작은 경우까지(4까지)

i=4일때, <4보다 작은 경우까지(3까지)

형태로 바뀌어 가기 때문에,

이때 시행되는 연산의 횟수는 4회가 되고, 그래서 아래 확인하려고 둔 cnt 변수의 값이 4로 최종 출력 되는것이었다.

이번 문제를 풀때 생각없이 st.length(); 값을 바로 사용하였는데, 

다음부터는 이 값을 int 변수에 복사한뒤에 그 복사된 값을 사용하여서 이 st.length()값이 줄어들 수 있는 경우의 영향을 받지 않도록 하자. 

 

  Comments,     Trackbacks