인프런 커뮤니티 질문&답변

2ntro님의 프로필 이미지
2ntro

작성한 질문수

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

1-F

1-F, 11655번 소문자의 경우 출력값 깨짐

해결된 질문

작성

·

275

0

// 정답코드
else if(S[i]>='a' && S[i]<='z'){			
    if (S[i] + 13 > 'z'){
        S[i] = S[i]-26+13;
    }
    else{
        S[i] = S[i] + 13;
    }
}
// 입력: Baekjoon Online Judge
// 출력: Onrxwbba Bayvar Whqtr


// 오류 코드
else if(S[i]>='a' and S[i]<='z'){
	S[i] = S[i] + 13;
	if (S[i] > 'z'){
	    S[i] = S[i]-26;
	}
}
// 입력: Baekjoon Online Judge 
// 출력: Onrxwbba Bayvar W굌tr

문자를 if문에서 비교하기전에 13을 더하면 Judge의 ud부분이 깨지는데 정답코드와 왜 다른건지 궁금합니다.

 

 

답변 3

1

안녕하세요, 인프런 AI 인턴이에요.

입력된 문자열에서 소문자를 암호화하는 부분을 질문하신 것 같아요.

오류 코드의 경우, 문자에 13을 더하는 부분이 if문 밖에 있어서 암호화가 된 다음에 비교를 하게 됩니다. 그래서 암호화된 문자가 z보다 크면 암호화에 문제가 있어서 비교문이 실행되고, 이 때문에 문자가 깨지게 됩니다.

반면에 정답 코드는 문자에 13을 더한 뒤에 비교문을 실행합니다. 따라서 암호화된 문자가 z보다 크다면, 암호화 되기 전에 원래 문자가 ‘a’에서부터 ’m’까지 였으면 ‘n’에서부터 ‘z’까지 였을 것입니다. 그렇기 때문에 암호화를 할 때 문자를 ‘a’부터 시작하는 ‘n’부터 시작하도록 암호화를 해주는 것입니다.

정답 코드와 오류 코드의 차이는 암호화를 할 때 비교문을 실행하는 위치의 차이이며, 이렇게 위치를 바꾸는 것으로 인해 문자열이 깨지는 것을 방지할 수 있습니다.

정답을 찾는 과정에서 오류 코드를 작성하신 것처럼, 오류 코드와 비슷한 코드를 작성한다면 조금씩 수정하면서 오류를 해결해 나가시면 됩니다.

코드 수정에 도움이 되었길 바랍니다. 감사합니다.

0

저도 동일 증상 격었습니다.
인프런 AI 인턴님께서 좋은 글 남겨주셨네요.
그치만 바로 이해되진 않았는데요,
계속 살펴보니 아스키 코드 최대치를 넘어가서 그런것으로 이해했습니다. (맞나요?ㅎㅎ)
알고리즘 교안에 포함된 아스키 표를 보니 126 (~)를 끝으로 더이상 존재하지 않는것 같네요 (혹은 그 이상은 우주 어딘가로 날아가버리던가...)
126 이상으로 넘어갔다 돌아오는 과정에서 글자가 깨지는 것 같아요.

요약:
u(117) + 13 = 우주 저편 어딘가 문자. ( 다시 돌아올 수 없음)

큰돌님의 프로필 이미지
큰돌
지식공유자

계속 살펴보니 아스키 코드 최대치를 넘어가서 그런것으로 이해했습니다. (맞나요?ㅎㅎ)
>>

네 맞습니다.

참고로 해당 부분은 교안내에 다음과 같이 알려드리고 있습니다.

앞의 표에서 봤듯이 아스키코드는 0 ~ 127까지의 숫자를 지원합니다. 그렇기 때문에 아스키코드로 어떤 로직을 구축한다 했을 때 127이 넘어가는 숫자를 만들면 에러가 발생하니 조심해야 합니다.

 

감사합니다.

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 수강생님 ㅎㅎ

음 저코드 둘 다 맞는 코드에요. 제가 수강생님 처럼 짜봤는데요.

#include<bits/stdc++.h>
using namespace std;   
string s; 
int main(){
    getline(cin, s); 
    for(int i = 0; i < s.size(); i++){
        // 대문자인경우
        if(s[i] >= 65 && s[i] < 97){
        	s[i] += 13;
            if(s[i] > 90) s[i] = s[i] - 26;  
        }else if(s[i] >= 97 && s[i] <= 122){
            if(s[i] + 13 > 122)s[i] = s[i] + 13 - 26; 
            else s[i] = s[i] + 13;  
        }
        cout << s[i];  
    } 
    return 0; 
}

이 코드도 맞는 코드입니다.

혹시 확인해보시겠어요?

 

 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제가 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

2ntro님의 프로필 이미지
2ntro

작성한 질문수

질문하기