티스토리 뷰
안녕하세요 감자 코딩 & 감자 개발자 입니다.
이번에 살펴볼 문제는 전에 포스팅했던 문제들을 종합적으로 생각할 수 있었던 문제입니다.
ROT13문제인데요. ASCII 코드와 입력에 있어서 복합적인 문제라고 생각하시면 될 것같습니다.
문제 링크
https://www.acmicpc.net/problem/11655
문제
ROT13은 카이사르 암호의 일종으로 영어 알파벳을 13글자씩 밀어서 만든다.
예를 들어, "Baekjoon Online Judge"를 ROT13으로 암호화하면 "Onrxwbba Bayvar Whqtr"가 된다. ROT13으로 암호화한 내용을 원래 내용으로 바꾸려면 암호화한 문자열을 다시 ROT13하면 된다. 앞에서 암호화한 문자열 "Onrxwbba Bayvar Whqtr"에 다시 ROT13을 적용하면 "Baekjoon Online Judge"가 된다.
ROT13은 알파벳 대문자와 소문자에만 적용할 수 있다. 알파벳이 아닌 글자는 원래 글자 그대로 남아 있어야 한다. 예를 들어, "One is 1"을 ROT13으로 암호화하면 "Bar vf 1"이 된다.
문자열이 주어졌을 때, "ROT13"으로 암호화한 다음 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 알파벳 대문자, 소문자, 공백, 숫자로만 이루어진 문자열 S가 주어진다. S의 길이는 100을 넘지 않는다.
출력
첫째 줄에 S를 ROT13으로 암호화한 내용을 출력한다.
예제 입력 1
Baekjoon Online Judge
예제 출력 1
Onrxwbba Bayvar Whqtr
네 이번에 살펴볼 문제에 대한 해결방법을 한번 알아보도록 하죠
문제 해결 방법
1) 문자열을 입력받습니다. 다만 공백, 숫자 , 소문자, 대문자로 이루어진 문자열입니다.
2) 이 문자열중에서"Baekjoon Online Judge"를 ROT13으로 암호화하면 "Onrxwbba Bayvar Whqtr" 된다는 말이 있습니다.
알파벳 순서는 어떻게 될까요 ?
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z.
과연 이것이 의미하는바는 무엇일까요?
(Baekjoon Onrxwbba B -> O) /(Online Bayvar O-> B)를 예를 들어보겠습니다.
B가 O로 바뀌게 되면 총 인덱스가 13개의 차이가 + 변하는것을 알 수있습니다.
하지만 O-> B의 경우는 어떨까요? 13개의 차이가 변하기는 하나 원래의 인덱스에서 - 되는것을 확인 하실 수 있습니다.
이것을 확인하면 문제를 쉽게 풀 수 있겠죠?
아직도 이해가 안가시는분이 있다면, 지금 알파벳이 어떻게 변화하고 있는지를 확인해보시면 될것같습니다. 대문자로 예를 들었으나, 소문자도 대문자와 같은 원리로 인덱스가 변화하면서 알파벳이 변화는것을 알 수 있습니다.
이 알파벳이 왜 변하는것일까요?
위에서 말씀드렸다시피, ASCII 코드 인코딩에 따른 값이 변하는것입니다.
전에 포스팅에서도 말씀드렸지만 다시 말씀 드리겠습니다.
알파벳 대문자 'A' ~ 'Z' 까지는 아스키 코드로 65 ~ 90까지로 , 소문자는 'a' ~ 'z', 97 ~ 122 까지로 정의되어 있습니다.
이제 이렇게 해서 문제를 한번 풀어보겠습니다.
하지만 주의할점이 있습니다.
바로 그것은 c++ String 으로 입력을 받을때 string str; 이런형식으로 입력을 받게됩니다. 하지만 string으로 입력을 받게 될 경우 공백을 만나게 될경우 공백이전까지의 값이 저장이 됩니다. 간단히 말해 스페이스바를 만나게 되면 스페이스바 전까지만 문자열이 저장하게 됩니다.
이것을 해결하기 위해서는 getline()을 사용하여 입력을 받거나 str.get()으로 입력을 받을 수 있습니다.
getline()은 '\n'까지 입력으로 받아 들인다는것과 getline()안에 쓰이는 cin은 '\n'이전까지만 입력을 받는다는것이다. 이게 아무것도 아닌것 같지만, 상당히 중요한 요소이고 '\n'이 메모리 버퍼에 남아있는경우가 있어서 원하는 지점이 아닌곳에서 자동으로 줄바꿈이 되거나, 되지 않을 수 있기때문입니다. 제가 맨처음에 string값으로만 입력을 받았다가 공백이 있는곳을 만나면 그전까지만 입력을 받게되어서 제가 원하는값을 얻지 못했습니다. 주의하세요!
코드 리뷰
//
// 11655(ROT13).cpp
// beakjoon_algorithm
//
// Created by kgh on 22/12/2018.
// Copyright © 2018 kgh. All rights reserved.
//
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
int main(void){
string str;
// 공백을 만났을경우 바로바로 읽어 들이기 위해서 while문으로 getline()을 사용하여 입력을 받음.
while(getline(cin,str)){
for(int i=0; i<str.size(); i++){
// 아스키코드 13개의 값의 차이가 나는것을 조건으로 처리함
if(str[i] >= 'A' && str[i] <= 'M'){
str[i] = str[i]+13;
}else if(str[i] >='N' && str[i] <='Z'){
str[i] = str[i]-13;
}else if(str[i] >='a' && str[i] <='m'){
str[i] = str[i]+13;
}else if(str[i] >= 'n' && str[i] <= 'z'){
str[i] = str[i]-13;
}
}
cout << str << endl;
}
return 0;
}
이상 백준알고리즘 11655번 ROT13번 문제 해결방법 및 코드 리뷰를 마치겠습니다.
감자 코딩 & 감자개발자 였습니다. 감사합니다 :)
'Algorithm' 카테고리의 다른 글
[알고리즘] 백준알고리즘 11656번 접미사 배열 (0) | 2018.12.22 |
---|---|
[알고리즘] 백준알고리즘 10824번 네 수 (0) | 2018.12.22 |
[알고리즘] 백준 알고리즘 2743 단어 길이 재기 (0) | 2018.12.22 |
[알고리즘] 백준알고리즘 10820 문자열 분석 (0) | 2018.12.20 |
[알고리즘] 백준알고리즘 10809 알파벳찾기 (0) | 2018.12.19 |
- Total
- Today
- Yesterday
- 알고리즘
- 리버싱
- 학교
- MVC
- C언어
- programming
- 안드로이드
- 프로그래밍
- node
- TensorFlow
- 초보자를 위한 C언어 300제
- 개발하는 관광이
- Algorigm
- db
- Android
- 백준
- 머신러닝
- Spring
- Controller
- 감자개발자
- 감자코딩
- 코드엔진
- C langauge
- 복습
- 백준알고리즘
- 노드
- node.js
- BFS
- 스프링
- 텐서플로우
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |