[C++] 백준 11655 | ROT13

heige·2024년 6월 25일
0

BOJ

목록 보기
44/46
post-thumbnail

문제

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

풀이

⏰ 53m

#include <bits/stdc++.h>
using namespace std;

string input;
string output;
string alp = "abcdefghijklmnopqrstuvwxyz";
string ALP = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

int main(){ 
  getline(cin, input);
  output = input;

  for (int i = 0; i < input.length(); i++) {
    for (int j = 0; j < 26; j++) {
      if (input[i] == alp[j]) {
        if (j < 13)
          output[i] = alp[j+13];
        else 
          output[i] = alp[j-13];
      }
      else if (input[i] == ALP[j]) {
        if (j < 13)
          output[i] = ALP[j+13];
        else
          output[i] = ALP[j-13];
      }
    }
  }
  cout << output;

  return 0;
}

시간이 너무 오래 걸렸다. ㅠㅠ 그래도 어떻게 풀었다.

output 변수 만들기 전, 코드를 잘 적었다고 생각했는데 자꾸 결과가 틀리게 나와서 보니, input 변수 위에다 계속 덮어쓰며 변경을 해서 그런 것 같다. 근데 왜지...? 어차피 for 문에서 순차적으로 읽으면서 바꾸는 것이니까 괜찮지 않을까?
ouput 변수 만들어서 input을 복사 후에 했더니, 바른 결과가 나왔다.

➡️ input[i] == alp[j]일때 input[i]의 값이 alp[j+13]으로 바뀐 다음에도 게속 for문이 돌아, j = j+13의 경우에 또 바뀔 수 있습니다.
input의 글자가 b일 경우, j = 1일 때 o로 바꼈다가 j = 14일 때 다시 b로 바뀐다.

그리고, 알파벳을 문자열로 쭉 나열 후 하는 것이 가장 효율적인지 궁금하다.

개선

대문자 A : 아스키코드 65
소문자 a : 아스키코드 97

➡️ 이것만 외워라!

#include <bits/stdc++.h>
using namespace std;

int main() {
	getline(cin, s);
    for (int i = 0; i < s.size(); i++) {
    	//대문자
        if (s[i] >= 65 && s[i] < 97) {
        	if (s[i] + 13 > 90) 
            	s[i] = s[i] + 13 - 26;
            else s[i[ = s[i] + 13;
        } 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;
}
profile
웹 백엔드와 클라우드 정복을 위해 탄탄한 기반을 쌓아가고 있는 예비개발자입니다. 'IT You Up'은 'Eat You Up'이라는 표현에서 비롯되어, IT 지식을 끝까지 먹어치운다는 담고 있습니다.

0개의 댓글