아래와 같은 내용은 오늘 풀려고 시도했던 문제와 관련된 개념 정리 내용이다.
이와 연관지어서 오늘 보게된 코드의 형태에 대해서 기록해두고 이것을 지속적으로 보면서 이러한 형태에 대해서 익숙해져 보도록 하자.
==========
boj 16120번 문제를 주단위 시험에서 시험 문제로 제시받았는데, 분명 머리속에서는 어떤 식으로 풀어야 하는지 파악을 했는데, 이걸 string으로 받았을때 과연 원소별 접근을 위해서 어떻게 표현하고, 그리고 전체 글자에 대한 반복문을 사용하기 위해 끝자리를 어떻게 결정할지에 대해서 명확하게 시험 시간에 생각이 나지 않아서 문제를 풀지 못하였다.
그렇지만 그래도 그동안 보아왔던게 있어서 머리속에서 어떠한 형태로 코드를 구성하면 되겠다는 생각이 들어서 현재까지의 공부 방법이 잘못된건 아니라는 생각이 들었다. 그러니까 이제부터 다시 차근차근 현재 방법으로 밀어붙여보도록 하자.
일단 gpt를 활용하여서 알게 된 접근 방법에는 string으로 받아서 그걸 str.size(); 함수를 활용하여서 사이즈가 몇인지를 알아내고, 그리고 그걸 활용해서 for문에서 반복횟수를 설정하는 방법을 알게 되었고, 이게 내가 시험 시간 내에서 필요로 하던 부분이었다.
이런식으로, .string으로 받게 되고 그리고 반복문이나 혹은 원소별로 접근하는데 있어서 사용할 수 있는건
string.size(); 사이즈 함수 라는걸 이런 문제를 다시 만나게 되면 꼭 떠올려보도록 하자.
위와 같은 내용은 gpt상에 물어본 size()함수에 대한 내용이다.
usigned int를 반환한다는걸 명심하고, 컨테이너에 저장된 원소의 개수를 반환한다는걸 주의하자.
개수다 개수.
+++++++++++++++++++++++++
추가적으로 다른 사람의 코드를 확인해보다가 string.legnth(); 를 활용하는 것에 대해서 보게 되었다.
그래서 이에 관해서 gpt에 질문을 하여서 차이점에 대해서 알아보았다.
결국에는 내가 주로 제출하게 될 gcc 컴파일러에서는 차이가 없다.
이런식으로, string.size(); 위치에 똑같이 string.length(); 를 넣어서 코드를 작성하면 모두 똑같이 동작한다.
두가지 방법에 대해서 기억을 하기 위해서 노력해보자.
string 형태로 입력을 받아서 각각의 원소에 접근할것인데, 개별원소를 순차적으로 증가시키면서, for문을 돌아야 한다면
string.length(); 혹은 string.size();
일단은 기본적으로 size();가 혹시나 모를 컴파일러상의 차이점에 대비해서 확실하게 들어맞는 방법일테니까
string.size();를 활용하도록 하자.
===================================
위와 관련된 문제의 해답 코드인데 이 코드에 대해서 충분히 내것으로 만들 필요가 있을것 같다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
string s;
cin >> s;
int cnt = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] == 'P') { //p라면 개수 증가
cnt++;
continue;
}
//'P'일때 continue;로 나머지 부분 넘겨버리기 때문에,
//여기에 도달했다는건 P가 아니라는 얘기이고, 그런 경우 무조건 A라는 얘기
if (cnt >= 2 && s[i + 1] == 'P')
{
//PPAP를 P로 치환 한 뒤 cnt--;
//이건 관념적으로 PPAP를 P로 치환했다고 생각하고 하는 방식으로 보여진다.
//실질적으로 PPAP를 P로 바꾸었다기 보다는, cnt--을 해줘서 앞에 두개이던
//PP를 AP를 합쳐서 PPAP로 만들고, 그리고 나서 그걸 P 하나로 바꾼다
//라고 생각해주는 과정이다.
cnt--;
i++; //이렇게 해주면서 s[i+1]에서 P를 확인한 과정을 거쳤으니
//그 다음 과정을 봐줄 필요가 없어서 그 과정을 넘어가기 위해서 i++을 해준다.
}
else {
cout << "NP" << "\n";
return 0;
}
}
if (cnt == 1)
cout << "PPAP" << "\n";
else
cout << "NP" << "\n";
return 0;
}
이 코드의 구조가 꽤나 간결하면서도 필요한게 다 들어있는 형태이다.
그중에서도
if(s[i]=='P'){
cnt++;
continue;
}
부분이 재미있는 부분인것 같다.
continue; 를 넣음으로써 만약 P라면, 뒤에 있는 부분을 모두 볼필요없게 만들고,
위에를 그냥 지나쳐서 들어온 경우 무조건 A이기 때문에 바로 A와 관련된 if문을 간결하게 작성할 수 있게 만들어주는 부분이다.
아주 배울점이 많은 코드인듯 하다.
이 코드를 많이 따라해보면서 익숙해지도록 노력해보자.
'크래프톤 정글' 카테고리의 다른 글
TIL 23.4.22// 오늘 하루도 C++ 알고리즘 풀이. 재귀를 조금 더 빨리 끝내야 하는데 그러지 못해서 아쉬운 하루. (0) | 2023.04.22 |
---|---|
TIL 23.4.21// 알고리즘 3주차 c++ 문제풀이 지속중. (0) | 2023.04.21 |
TIL 23.4.18// c++ 알고리즘 공부 지속중. (0) | 2023.04.18 |
TIL 23.4.16// 주로 코딩테스트용 c++과 관련된 기초적인 사항들을 공부한 하루. (0) | 2023.04.16 |
TIL 23.4.15// 스택 관련 문제들을 집중적으로 본 하루. (0) | 2023.04.15 |