컴굥일지

[BOJ/백준 4583][C++] 거울상 본문

알고리즘/코테 문제

[BOJ/백준 4583][C++] 거울상

gyong 2022. 1. 18. 23:14
반응형

문제

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

 

문제 내용

입력받은 문자열이 거울상 문자열인지 확인하고, 맞으면 거울에 비춰지기 전 모습을, 그렇지 않으면 INVALID를 출력하는 문제이다.

 

문제 풀이

일단 거울상 문자에 해당하는 'b', 'd', 'p', 'q', 'i', 'o', 'v', 'w', 'x'를 미리 배열로 만들어둔다.

#이 입력될 때까지 문자열을 계속 입력받기 때문에, while 반복문 안에서 문자열을 입력받고 #인지 아닌지 확인하는 과정이 필요하다.

위 과정이 끝나면, 문자열의 각각의 문자에 대해서 거울상 문자인지 아닌지를 판단하는 과정을 거치면 된다.

find()를 통해 문자가 reflect 배열 안에 존재하지 않으면 결과는 INVALID가 된다.

문자가 거울상 문자라면, b, d, p, q는 자신의 짝에 해당하는 글자를, 나머지는 자기 자신을 result 문자열에 추가하면 된다. 이후 결과 출력 시 result 문자열을 역순으로 출력하면 문제에서 요구하는 대로 출력할 수 있다.

ex) 입력받은 문자열이 bidi 였다면 result 변수에 d i b i 를 순서대로 추가하면 된다. 그리고 이후에 출력 시 역순으로 출력하면 ibid 가 출력되므로, 입력받은 문자열 bidi가 거울에 비춰지기 전의 모습을 출력할 수 있다.

코드

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	char reflect[9] = { 'b', 'd', 'p', 'q', 'i','o','v','w','x'};

	while (true) {
    	//입력
		string str;
		cin >> str;
		if (str == "#") break; //확인
        
        //문제 해결
		int len = str.length();
		string result = "";
		for (int i = 0; i < len; i++) {
			if (*find(begin(reflect), end(reflect), str[i]) != str[i]) {
				result = "INVALID";
				break;
			}
			else {
				if (str[i] == 'b') result += 'd';
				else if (str[i] == 'd') result += 'b';
				else if (str[i] == 'p') result += 'q';
				else if (str[i] == 'q') result += 'p';
				else result += str[i];
			}
		}
        
        //결과 출력
		if (result != "INVALID") {
			for (int i = len - 1; i >= 0; i--) {
				cout << result[i];
			}
			cout << '\n';
		}
		else {
			cout << result << '\n';
		}

	}
}

 

문제 코드 설명

1) 입력

while 반복문 안에서 문자열을 입력받는다.
입력받은 문자열이 #이면 종료한다.

 

2) 문제 해결

for 반복문을 통해 문자열의 각 문자들이 거울상 문자인지 아닌지를 판단하는 과정이 필요하다.
거울상 문자가 아닌 것이 하나라도 있다면 result="INVALID"가 될 것이다.

 

3) 결과 출력

result 변수에 들어있는 것이 "INVALID"이면 그대로 출력하고, 아니라면 역순으로 출력한다.

반응형
Comments