33일 차입니다. 제가 이틀뒤에 대만여행을 가는데요.. 오늘 하루 대만여행 계획 짠다고 집중을 너무 많이 했더니 피곤해서 문제 풀기가 너무 귀찮더라고요. 그래도 할 건 해야지 하면서 노트북을 켰습니다.. 오늘도 파이팅 해볼게요.
문제 설명
우리가 흔히 알던 탕수육 게임에 관한 문제였어요. 두 명에서 탕수육 게임을 하는데 각 사람이 말하면 되는 반복되는 문자열 속 최소 길이의 반복문자열을 구하라는 문제였습니다.
생각 흐름
우선 단순한 게임이니만큼 어렵게 생각을 안 했던 것 같아요.
문제는 혹시 탕수육 게임을 뭔지 모르는 사람을 위해 길게 적은 것 같아서 가뿐하게 패스하고 바로 코드 작성에 들어갔습니다.
탕수육 게임은 주어지는 문자가 짝수냐 홀수냐에 따라 봐줘야 하는 조건이 달라진다는 것을 알고 있었기 때문에 먼저 짝수, 홀수인지를 가르는 조건문을 써주며 시작했어요.
s문자열이 홀수라면 결국 문자열을 2번 돌려서 새로 문자열에 저장해줘야므로 s.length()만큼 돌려서 first에는 홀수번째를 second에는 짝수번째를 저장해 주고 또 한 번 바꿔서 저장해 주었습니다.
s문자열이 짝수일 때는 그냥 단순히 홀수, 짝수번째 요소를 차례대로 저장해 주었고 이를 출력하며 마무리했습니다.
#include <iostream>
using namespace std;
int main () {
ios_base::sync_with_stdio();
cin.tie(); cout.tie();
int t; // 테스트 개수 t
cin >> t;
while (t--) {
string s; // 반복하는 문자열 s를 받아옴
cin >> s;
string first = "";
string second = "";
if (s.size() % 2 == 1) { // s 문자열이 홀수라면
for (int i = 0; i < int(s.length()); i+=2) {
first+=s[i];
second+=s[i+1];
}
for (int j = 0; j < int(s.length()); j+=2) {
second+=s[j];
first+=s[j+1];
}
}
else {
for (int i = 0; i < int(s.length()); i+=2) {
first += s[i];
second += s[i+1];
}
}
cout << first << "\n" << second << "\n";
}
return 0;
}
근데 백준에 제출해 보니까 '틀렸습니다'가 뜨는 것이었습니다.
Main.cc:27:31: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::__cxx11::basic_string<char>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
27 | for (int i = 0; i < s.size(); i+=2) {
| ~~^~~~~~~~~~
오류에 관해 구글링을 해보니 경고 - 부호 있는 정수 표현식과 부호 없는 정수 표현식의 비교라는 오류라는 것을 알게 되었습니다.
이해가 안돼서 코딩 잘하는 친구에게 물어보니 부호 있는 정수를 부호 없는 친구와 비교를 시켜놓은 것이 잠재적으로 오류를 불러일으킬 수 있어서 경고를 띄웠다는 얘기를 해주더라고요.
뒤에 +=2를 써준 것이 그러한 오류를 발생한 것 같다는 얘기를 해줬어요.
친구를 잘 뒀어 ㅠ,.,.
근데 결국은 코드 로직이 잘못됐다는 생각에 다시 갈아엎었습니다.
아무튼 오류가 떠서 다시 코드를 작성해 보았습니다.
#include <iostream>
using namespace std;
int main () {
ios_base::sync_with_stdio();
cin.tie(); cout.tie();
int t; // 테스트 개수 t
cin >> t;
while (t--) {
string s; // 반복하는 문자열 s를 받아옴
cin >> s;
string first = "";
string second = "";
for (int i = 0; i < s.size(); i++) {
if (i % 2 == 0) {
first += s[i];
}
else {
second += s[i];
}
}
if (s.size() % 2 == 1) { // s가 홀수 문자로 이루어진 문자열이였다면
string copy(first); // 한번 붙여주기 위해 first를 그대로 가져온 copy string 선언
first += second;
second += copy;
}
cout << first << "\n" << second << "\n";
}
return 0;
}
그냥 새로 문자열 copy를 정의해서 이를 다시 넣어주는 식으로 풀었더니 되더라고요. 사실 코드를 좀 참고를 했습니다. 머리가 너무 아파서,,
공부한 내용 정리
unsigned int <-> int 비교?
C++ STRING 내부에서 length() 함수의 리턴 타입은 int가 아니라고 합니다.
Warning 메시지대로
‘std::__cxx11::basic_string<char>::size_type’ {aka ‘long unsigned int’}
인데, int 타입과 해당 타입을 비교하려고 하니 경고 메시지를 띄워주지만
일반적으로 string의 길이가 int 범위를 벗어날 일이 없으므로 long unsigned int 타입을 int로 캐스팅해도 문제가 생기지 않는다고 합니다.
error는 발생 시 컴파일이 불가하고 warning은 경고문이 출력되지만 컴파일은 가능하다는 차이점이 있습니다.
결국, warning이었지만 실패가 뜬 걸 보니 로직이 잘못되었다는 것이었죠.
'코테 > 항해99' 카테고리의 다른 글
[99클럽 코테 스터디 32일차 TIL] #정렬7 (2) | 2024.11.28 |
---|---|
[99클럽 코테 스터디 31일차 TIL] #정렬6 (0) | 2024.11.28 |
[99클럽 코테 스터디 30일차 TIL] #정렬5 (1) | 2024.11.26 |
[99클럽 코테 스터디 29일차 TIL] #정렬4 (5) | 2024.11.25 |
[99클럽 코테 스터디 28일차 TIL] #정렬3 (0) | 2024.11.25 |