본문 바로가기
Problem Solving

[C++] [백준 5598] 카이사르 암호 (pps 3-3)

by tls1107 2021. 7. 13.
728x90
반응형


문제 풀기 전 생각 :
평소의 나였으면 문자열을 입력받은후
반복문으로 쪼개 아스키코드 를 활용해 풀었을테지만
3-2 문제를 풀고 난 후 scanf()을 한개씩 받고 바로바로 판별해서 출력하기로 했다.


#include <iostream> using namespace std; int main(){ string s; cin >> s; for (size_t i = 0; i < s.length(); i++) { if(s[i] == 'A') s[i] = 'X'; else if(s[i] == 'B') s[i] = 'Y'; else if(s[i] == 'C') s[i] = 'Z'; else s[i] = s[i] - 3; } cout << s; return 0; }

https://www.acmicpc.net/problem/5598

 

5598번: 카이사르 암호

가이우스 율리우스 카이사르(Gaius Julius Caesar)는 고대 로마 군인이자 정치가였다. 카이사르는 비밀스럽게 편지를 쓸 때, 'A'를 'D로', 'B'를 'E'로, 'C'를 'F'로... 이런 식으로 알파벳 문자를 3개씩 건

www.acmicpc.net


풀 때 어려웠던 점 또는 느낀점 :
아래 개선 방안에서 사용한 방법과 같은 방법을 사용하려고 했지만
예상치 못하게 틀렸습니다 가 나와서
일단 처음 생각했던 방법대로 풀었습니다.


개선방안 :

#include<cstdio> 
char c; 

int main() { 
  while (~scanf(" %c", &c))
  	printf("%c", (c+10)%26+65); 
  return 0; 
}

개선 방안을 보니 scanf() 함수 사용에서 차이가 있었습니다.
scans("%c",&c);
scans(" %c",&c);
위의 두 경우는 차이가 있다는 사실을 간과하고 있었습니다
scanf(" %c",&c); 는 공백을 제외한 문자를 입력받는 것입니다.
아마 문자열 입력이 끝났는데도 스캔에프 함수는 계속해서
입력받으려 하기 때문에 생긴 실수라고 생각했고

#include<cstdio> 
char c; 

int main() { 
  while (~scanf(" %c", &c)){ 
    if(c == 'A') 
    	c = 'X'; 
    else if(c == 'B') 
    	c = 'Y'; 
    else if(c == 'C') 
    	c = 'Z'; 
    else 
    	c = c - 3; 
    putc(c,stdout); 
  } 
  return 0; 
}

코드를 수정하니 정상적으로 작동했습니다.
아직 scans()함수를 깊게 공부하지 못해 생긴
실수라고 생각합니다.
이번 실수 기억하자!!

 

728x90
반응형

댓글