본문 바로가기

programming/문제 해결

[C언어, C++] 문자를 정수로 바꾸는 방법! (문자 정수 형변환)

반응형

1. 개요

 

 드디어 중간고사가 끝났다! 머리가 많이 복잡한 상황이지만, (군대, 성적, 자격증) 그래도 가장 먼저 이 글을 쓸 수 있어서 좋다! 이번 문제는 문자를 정수로 바꾸는 방법이다! 사실 문자열을 문자로 바꾸는 방법은 많다! 그러나 문자열이 아닌 하나의 '문자'를 정수로 바꾸는 함수는 아무래도 없는 것 같다! 다양한 방법을 사용할 수 있지만 나는 최대한 간단한 방법을 찾고자 하였다. 분명 아스키 코드를 사용할 수 있을 것 같았다...... C언어가 어려운 문자이긴 하지만 문자에 대한 계산에 있어서는 나름 편하다고 생각하기 때문이다(개인적인 의견으로). 자 그럼 다음은 문제 해결 과정이다.

 

2. 문제 해결과정

 

 사실 이 문제의 해결 필요성을 느낀 이유는 백준알고리즘 11720번 때문이었다. 문제를 보면 알겠지만, 숫자로된 문자열을 입력받고 문자 하나하나를 정수로 바꿔야 문제를 쉽게 해결할 수 있다. 혹시 문제가 궁금하신 분들은 아래의 링크로 들어가보길 바란다.

 

문제: https://apape1225.tistory.com/24

 

[백준 알고리즘] 11720번 - 숫자의 합

1. 문제, 예시 실행결과  이번 카테고리는 문자열! 가장 긴장하고 있는 부분이다. 사실 포인터나 배열같은 부분도 자잘한 문법들이 많고 틀리기 쉬운 부분이 많다고 생각한다. 나도 시험 보기 전

apape1225.tistory.com

 처음엔 다양한 해결방법을 생각하였다. atoi() 함수를 사용하여 정수형으로 바꾼 후, 나머지 연산자를 사용할까? 와 같은 방법도 시도해보았다. 그러나, 문제를 보면 알겠지만 몇몇 귀찮은 예외의 상황이 발생했다. 그래서 든 생각은 "아스키 코드를 사용" 하는 방법이었다.

 

 이유는 간단하다. C언어에서는 1과 '1'은 다르다. 1은 정수이고 '1'은 문자이다. 그리고 모든 문자는 해당하는 아스키코드를 가지고 있다고 배웠기 때문에 문자 '1'도 해당하는 아스키코드를 가지고 있을거라고 생각했다. 그래서 python으로 문자의 아스키 코드를 연속적으로 출력하는 간단한 코드를 작성해보았다. 다음은 코드와 실행결과 이다.

 

char = '0'

for i in range(10):
    result = ord(char) + i
    print(chr(result), ':', result)

0 : 48

1 : 49
2 : 50
3 : 51
4 : 52
5 : 53
6 : 54
7 : 55
8 : 56
9 : 57


 자 우리는 위의 프로그램으로 인해 두가지의 사실을 알 수 있다. 첫째는 문자 '1' 부터 문자 '9'까지에 해당하는 아스키코드는 존재하며, 정말 다행이도 해당하는 아스키코드의 값들은 연속한다는 것이다.

 

 고등학생때, 학원에 수학선생님이 1이아닌 다른 수를 시작으로 숫자를 셀 때 햇갈리지 않는 방법을 알려주셨다. 그 방법은 다음과 같다. 1부터 321까지 해당하는 숫자의 갯수를 세는 방법은 간단하다. 그냥 다음에 나오는 수가 답이기 때문이다. 예를 들어 1부터 321까지 몇개에 수가 존재하는지를 물어본다면 답은 간단하게 321이다. 다만, 23 부터 321까지의 숫자를 셀 때는 고등학생들도 실수를 한다고한다. 이때는 앞에 숫자를 1로 만들면 된다. 23에서 22를 빼면 1이되고, 321에서도 22를 빼면 299가 되니, 답은 299라는 것이다.

 

 글이 갑자기 길어진 것 같지만, 핵심은 간단하다. 결국 우리가 사용하는 숫자는 상대적이라는 것이다. 0을 기준으로 몇번 떨어져있는지가 지금 우리가 사용하는 숫자의 원리라고 할 수 있다. 결과적으로 말하면 아스키코드처럼 한 문자를 기준으로 일정한 간격을 연속으로 값들이 있을 때는 충분히 우리가 원하는 값으로 바꿔줄 수 있다는 뜻이다. 뭔가 거창한 것 같지만 간단하다. 결국 원하는 수가 0의 역할을 하는 수를 기준으로 몇칸 떨어져있는지를 알아야한다는 것은 원하는 수에 0의 역할을 하는 수를 빼주면 그만이다. 다음은 C언어로 구현하는 코드이다.

 

#include <stdio.h>

int main(void) {
	char zero = '0';
	for (int i = 0; i <= '9' - '0'; i++)
		printf("%c ", zero + i);
	return 0;
}

 

 항상 생각하는 내용이지만, 모르는 지식이 있을 때는 내가 알고있는 선에서, 그 지식을 대신할 방법을 찾아야한다. 이번 문제도 그렇다. 가끔가다가 아스키 코드를 외우려고하는 동기들이나 후배들을 보지만, 그럴필요는 없는 것 같다. 아스키코드이 고유한 값보다는 그것이 의미하는 바가 중요하다고 생각한다.

 

 추가적인 부분으로 왜 '9'까지만의 숫자를 다루는지 궁금해하시는 분들이 있겠지만 '10'은 문자가 아닌 문자열이다. 이미 1비트를 초과한 2비트로 취급되기 때문에, 해당하는 아스키코드는 존재하지 않을 것이다. 혹시몰라 pyhton으로는 ord()함수 C언어에서는 형식 지정저자를 %d로 정하여 출력해보았는데, python은 에러를 출력하고 C언어에서는 이상한 숫자가 나왔다. (아마 쓰레기값이 아닐지 싶다 ㅎㅎ) 다음은 한줄 정리이다.


 정수 하나인 문자를 정수형으로 바꾸고 싶을 때, 바꾸고 싶은 문자를 x라고 하자, 그럼 다음과 같은 식을 통해 구할 수 있다.

 

int result = x - '0';

 

이 방식을 사용하면 result에는 문자 x에 해당하는 정수형 숫자가 저장된다.


혹시 몰라 위와같은 방법을 사용하여 입력받은 문자를 정수형으로 바꿔주는 프로그램을 작성해보았다. 

 

#include <stdio.h>

int main(void) {
	char input;
	while (1) {
		printf("   exit = e: ");
		scanf("%c", &input);
		getchar();
		if (input == 'e')
			break;
		int result = input - '0';
		printf("changed num: %d\n\n", result);
	}
	return 0;
}

 

 위 코드의 실행결과는 다음과같다.


실행결과


3. 결어

 

 오랫동안 하고 싶었던 정리를 할 수 있어서 좋았다. 문제를 해결하는 과정이 중요하다고 모든 분들이 말씀하셨다. 그래서 시작한 블로그에 나름 하나 둘씩 정리한 글이 올라가는 모습을 보니 나름의 만족감을 느낀다. 시험이 끝나 아직 학교에서는 배우지 않은 알고리즘을 공부하려 책 한권을 샀다. 책을 정리하면서 이 블로그의 글들을 채웠으면 좋겠다.

반응형