inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

1-D 팰린드롬 문제 질문드립니다

265

토끼씨

작성한 질문수 1

0

큰돌님 코드보기전에 교안보고 배운대로 코드 짜봤습니다. 

devc++   예제를 바꿔봐도 잘돌아가고 런타임 에러는 안뜨던데 백준에 제출하니 런타임 세그폴트 오류가 뜨네요

몇가지 궁금한 점이 있어서 질문드립니다

1. 누더기 코드지만 왜 안돌아가는지 알아야 발전이 있을거같아서... 아래 코드의 어디가 왜 문제인지 여쭤봅니다

2. 또한 강의영상보면 입력 범위 설정조건에 대해서는 거의 코드에 안쓰시던데 

더 넓은 범위가 와도 적용가능한 코드로 짜셔서 그런건가요? 보통 아래처럼 코드에 입력 범위 제한 등을 적을 필요는 없나요?

3. 이렇게 IDE결과에는 찾지 못하고 백준에서 제출 후 문제가 생기는 경우를 예방하기 위한 방법이 있을까요?

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

#include <bits/stdc++.h>

using namespace std;
string s;
string ori;
int chk =1;

int main() {
	ios_base::sync_with_stdio(false); 	
	cin.tie(NULL);
	cout.tie(NULL);
	1<=s.size()<=100;
	cin >> s;
	for(int i=0; i<s.size(); i++)   	        // 불필요한 코드 
		ori[i] = s[i];			        // ori = s 로 해도 같은 의미이다   << 문자열은 동적 할당 배열이니 저렇게 받아서 할당해보았습니다
	reverse(s.begin(), s.end());		
	
	for(int i = 0; i<s.size(); i++)		//  불필요한 코드2 
		if(s[i]!=ori[i])				//  if(ori == s) 로 판단해도 된다  
			chk = 0;		
			
	cout << chk << "\n";			
	return 0;
}

코딩테스트 제출전에도 시간 및 메모리 제한, 런타임 오류 등을 확인할 방법이 있나 여쭤봅니다

입력범위설정 런타임에러 C++ 코테 준비 같이 해요!

답변 1

1

큰돌

음.

1. 클린코드 : 필요없는건 지우고. 

2. 로직상 맞는지 확인

3. 반례 스스로 생각하면서 확인

 

이렇게 하시면 됩니다. 그저 IDE에서 했는데 된다. 라고 해서 제출하는것보다는 저 3가지의 과정을 하신다음에 하는 걸 추천드립니다. 주신 코드에 주석 다 달았습니다. 

#include <bits/stdc++.h>

using namespace std;
string s;
string ori;
int chk =1;

int main() {
    ios_base::sync_with_stdio(false);  
    cin.tie(NULL);
    cout.tie(NULL);
    //왜 이런게 있죠?
    1<=s.size()<=100;
    cin >> s;
  // 뭐죠?
    for(int i=0; i<s.size(); i++)               // 불필요한 코드
        ori[i] = s[i];                  // ori = s 로 해도 같은 의미이다   << 문자열은 동적 할당 배열이니 저렇게 받아서 할당해보았습니다
    reverse(s.begin(), s.end());        
   
    // 불필요한 코드가 아니라... 괜찮은 코드에요. ori == s로 한번에 해도 되지만
    // for문도 된답니다.
    for(int i = 0; i<s.size(); i++)     //  불필요한 코드2
        if(s[i]!=ori[i])                //  if(ori == s) 로 판단해도 된다  
            chk = 0;        
           
    cout << chk << "\n";            
    return 0;
}

#include <bits/stdc++.h> // --- (1)
using namespace std;     // --- (2)
string a;                // --- (3)
int main()
{
    a[4] = 'a';            // --- (4)
    cout << a << "\n";   // --- (5)
    return 0;            // --- (6)
}

예를 들어 위의 코드가 나올 것이라 생각하시나요?
문자열은 문자열을 "할당" 하고 그리고 그걸 기반으로 요소에 대한 참조가 일어납니다.
빈문자열이든 뭐든..
문자열의 크기조차 결정되지 않았는데 어떻게 ori 의 i번째 요소에 대한 참조에 대한 코드를 작성하시나요?
예를 들어 배열의 크기가 설정되지 않은 vector<int> v라고 해놓고 v[10]이렇게 하는 것과 똑같은 코드에요.

 

0

토끼씨

감사합니다!

아하! 제가 문자열에 대해 잘못 이해하고 있었네요 

문자열은 동적인데 제가 크기를 미리 정하는 것도 말이 안되겠네요

아래와 같이 수정후 제출하니 잘 돌아갔습니다! 감사합니다! 

for(int i=0; i<s.length(); i++)   
ori.push_back(s[i]);

 ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ

ios_base::sync_with_stdio(false);  
    cin.tie(NULL);
    cout.tie(NULL);
  //왜 이런게 있죠?

입출력 속도를 빠르게 해주는 코드라고 알아서 빠르면 좋겠지 생각하고 넣었습니다.  입력이 이미 초기에 주어지고 출력 양도 적어서 불필요할까요?

그럼 어떤 상황에서 위 코드를 써야 할까요? 연산내에서 입출력이 많은 상황에서만 쓰면 될까요? 위 동기화를 풀면 c의 scanf printf 등의 함수들과 같이 쓰면 안된다고는 알고있습니다

 ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ 

1<=s.size()<=100;
cin >> s;
  // 뭐죠?
 
위 코드에 대해서는 생각해보니 입력 범위는 문제 출제쪽에서 신경쓸일이지 제가 입력하는게 아니니 범위를 코드로 쓸 이유가 없었던거였군요!

0

큰돌

음.. cin, cout으로 했는데 시간초과? > 저걸 써보는 방식으로 진행하시면 됩니다. 

그리고 해당 부분은 교안에 설명이 되어있어요 ㅎㅎ 교안 다시 보시는 것을 추천드립니다. 

0

토끼씨

넵 감사합니다!

1-E질문입니다!

0

533

2

3-L 틀린 부분 피드백 부탁드립니다.

0

837

2

1-A문제 순열재귀함수 질문입니다.

0

396

1

1-A 일곱난쟁이문제입니다

0

471

1

문제 풀 때 방향성에 대해

0

811

1

맥에서 vs code로 실행 관련 질문입니다

0

530

1

17071번 메모리 초과

0

390

1

1-C질문입니다!

0

428

2

2-B BFS 시간초과질문

0

638

2

1-O 13번 라인

0

447

1

6-J 놀이공원 문제 질문

0

390

1

구현관련 질문

0

492

1

강의 교안

0

322

1

실력을 더 올리고나서 강의를 보는 것이 맞을까요?

0

550

1

안녕하세요! 재귀함수에 관해서 질문드립니다

0

540

1

1-K

0

481

2

3-G번 질문있습니다.

1

482

3

3-C 실행 시간 질문드립니다.

0

504

1

4-A 문제 풀이 질문있습니다.

0

602

2

비트마스킹 연산자 "1의 보수" 영문 표기법

0

442

1

격자탐색 문제에서 BFS 시간복잡도 질문드립니다.

0

351

1

3-O go 함수 질문 드립니다.

1

453

2

4-A 출력 질문

0

308

1

1주차 1-O 질문드립니다

0

266

1