본문 바로가기
공부

BOJ 11365 3가지 풀이와 고찰

by 뜨응 2022. 1. 10.
나는 이 문제를 세 방법으로 풀어봤다. 
처음엔 배열 두개만들어서 하면 되지 않을까 했지만 라이브러리가 있을 것 같아서 바로 찾아봤다.
역시 라이브러리가 있어 바로 라이브러리를 사용했다.
하지만 reverse를 사용하지 않고는 어떻게 풀 수 있을까 라는 이야기를 듣고 두번째는 stack라이브러리를 사용해서 구현하였다. 라이브러리를 아예 사용하지 않으면 어떻게 풀 수 있겠냐는 이야기를 듣고 마지막으로 배열만을 이용해 구현해보았다.
1. 알고리즘 라이브러리를 사용
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

string a;

int main() {
	
	while(1) {
		
		getline(cin, a);
		if (a == "END")
			break;
		reverse(a.begin(), a.end());
		cout << a << "\n";
				
	}

	}
  • reverse 함수 구현법을 알게되었다.
  • 처음에는 cin 으로 string을 받으려고 했는데 공백 문자를 포함하지 않는 것이었다..
  • 처음 코드는 getline코드와 if문의 순서를 바꿔써서 출력이 되지 않았다..
2. reverse를 쓰지 않고 stack으로 구현
#include<iostream>
#include<string>
#include<stack>
using namespace std;

string reverse(string str)
{
	stack<char>st;
	int a = 0;
	
		string temp = "";
		for (int i = 0; i < str.size(); i++) {
			st.push(str[i]);
		}
		a = st.size();
		for (int i = 0; i < a; i++) {
			temp += st.top();
			st.pop();
		}
		return temp;
	
}
string a;

int main() {
	
	while(1) {
		getline(cin, a);
		if (a == "END")
			break;
		cout<<reverse(a)<<"\n";
        }
}
  • string의 초기값은 비어있기때문에 index를 사용할 수 없다라는 것을 모르고 처음엔 temp[i] = st.top을 썼다. 
  • 두번째 for문을 보면 원래 a 대신 st.size를 사용했었다. 하지만 이걸 사용하니 stack사이즈가 점점 줄어 제대로 반복문이 돌지 않았다.
  • temp에 더하기 연산을 해서 값을 넣을 수 있다는 사실 temp += st.top(); 이게 제일 신기했다.
  • 하지만 반복문 하나에 해결할 수 있을 거라는 이야기를 듣고 다시 고쳐보았다.
#include<iostream>
#include<string>

using namespace std;

string reverse(string str)
{	
	    int a = 0;
		string temp = "";
		a = str.size();
		for (int i = (a-1); i >= 0; i--) {
			temp += str[i];
		}
		return temp;	
}
string a;

int main() {
	
	while(1) {
		getline(cin, a);
		if (a == "END")
			break;
		cout<<reverse(a)<<"\n";
	}
}
  • 처음에 for문이 제대로 작동되지 않았다. for(int i = a; i<0;i--)이렇게 썼었다. 안 되는게 당연한건데.. 범위를 고쳐서 for(int i = a; i > 0; i--)했더니 첫 문자가 제대로 출력되지 않았다. 
K I N G
0 1 2 3

 

  • 위의 글자는 size가 4이다. 하지만 index 번호는 3번까지 밖에 없기때문에 str[4]는 아무것도 참조할 수 없다. for(int i= (a-1); i>=0; i--)로 고치고 제출하니 정답이었다!

 

처음으로 한 문제를 여러 방법으로 풀어본 것 같다. 재미있는 경험이었다...! 내일은 실버 한 문제를 풀어야하는데.. 어려울 것 같아서 풀기 싫다.

'공부' 카테고리의 다른 글

BOJ 11004 해결, 시간 초과  (0) 2022.01.13
BOJ 9012 해결과 고찰.....(최악)  (0) 2022.01.12
BOJ 1475 해결과 고찰  (9) 2022.01.07
BOJ 10808  (0) 2022.01.06
BOJ 1181, 10828 문제 해결과 고찰  (0) 2022.01.06