반응형

먼저 아스키코드란 1963년 미국 ANSI에서 표준화한 정보교환용 7비트 부호체계이다.

https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C

알고리즘을 풀다가 주어진 알파벳이 있을때 이를 아스키코드로 변환하는 문제가 나와 알아보게 되었다.

1. 아스키코드 -> 문자열

SQL이나 C, C++ 에서는 문자열을 뜻하는 값으로 char (character) 를 사용한다. python에서는 아스키코드를 문자열로 변환하는데 내장함수 chr() 을 사용한다.

asc_code = 65
answer = chr(asc_code)
print(answer)
print(type(answer))
------------------------------------
>>> 'A'
>>> <class 'str'>

chr()을 통해 변환된 아스키코드는 string type의 문자열로 반환된다.

1-1) 문자로 변환할 수 없는 아스키코드

변환하고자 하는 값이 아스키코드가 아닌경우, 이를 chr() 함수 사용시 에러가 발생한다.

asc_code = 134583495739845
answer = chr(asc_code)
--------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: chr() arg not in range(256)

에러를 확인해 보면 chr() 내장함수 안의 값은 범위 0부터 256미만 까지만 입력이 가능하다고 한다.

b_code = 1.5
b = chr(b_code)
--------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: integer argument expected, got float

또한 python의 내장함수 chr()에는 int 타입의 수만 들어가야 한다.

1-2) 문자로 변환 가능 최소값, 최대값

# 아스키코드 0의 문자열 변환
zero_code = 0
zero_answer = chr(zero_code)
print(zero_answer)
print("---" + zero_answer + "---")
print(type(zero_answer))
------------------------------------------
>>>
>>> ------
>>> <class 'str'>
# 아스키코드 255의 문자열 변환
max_code = 255
max_answer = chr(max_code)
print(max_answer)
print(type(max_answer))
>>> ÿ
>>> <class 'str'>

이때 0의 코드값은 없는값 (공백도 아님) 으로 변환되고, 255은 특수문자로 변환된다.

2. 문자 -> 아스키코드

문자열을 해당하는 아스키코드로 변환하는데에는 python의 내장함수 ord() 가 사용된다. ord는 ordinal position을 뜻하며, 문자의 순서 위치 값 을 의미한다.

a = "A"
a_code = ord(a)
print(a_code)
print(type(a_code))
------------------------------------------
>>> 65
>>> <class 'int'>

이때 변환된 아스키코드값은 'int' 형이다.

2-1) 아스키코드로 변환할 수 없는 문자 : 문자열

a = 'AAAAA'
a_code = ord(a)
------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 5 found

에러를 확인해 보면 ord() 내장함수의 파라미터 값으로는 character 만 가능한데, 길이 5의 문자열이 사용되었다고 한다.
이를 통해 문자 와 문자열이 구분되야 하며, ord() 에는 문자열이 아닌 문자가 사용되어야 한다는걸 알 수 있다.

b = 'ㄱ'
b_code = ord(b)
------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 3 found

한글은 보이는것과 달리 영어처럼 단일 문자 취급되지 않는다.

2-2) 아스키코드로 변환할 수 없는 문자 : 0

위의 1-2 에서 확인한 문자 변환 내장함수 chr()의 범위를 통해 아스키코드 0과 255로 변환해보자

min_str = ''
min_code = ord(min_str)
------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 0 found

ㅜㅜ... 아스키코드 0을 문자로 변환했을때 없는값이 출력되어 똑같이 빈 string을 아스키코드로 변환하려 했더니 오류가 발생했다.
아스키코드 0은 없는값, 즉 Null 값을 반환하기 때문에 이를 구현할 수 없는 것이다.
혹시나 해서 None을 변환해 보려 했지만 실패!

min_str = None
min_code = ord(min_str)
------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected string of length 1, but NoneType found
반응형
반응형

last update : 2024.01.21

백준에서 알고리즘을 풀면서 입력받은 값을 사용하는 방식에 참 다양한 게 있다는걸 알게되었다.

다음은 알고리즘을 풀면서 알게된 python의 다양한 입력방식에 대한 것들이다.
이 외에도 알고리즘을 계속 풀면서 알게되는 방법들에 대한 내용을 추가할 계획이다!

1. input

# 입력받기
A = input()

# 입력받은 것에 type 명시하기
A_int = int(input()

# 띄어쓰기로 구분된 여러 값 입력받기
Mul_A = map(int, input().split())

# 줄바꿈으로 구분된 두가지 값 (두 줄 기준) 입력받기
first_line = input()
second_line = input()

가장먼저 알게된 것은 python의 input 이었다.

1-1) input의 입력 type

python의 내장함수 input은 입력받은 값을 string 타입으로 변환하여 입력받는다.
python에서는 모든 것을 객체 (object)로 입력받는데, input 함수로 입력받은 것은 string class 로써 받아들여진다.

def check():
    intInput = input("python 내장함수 input으로 입력받기! (숫자) : ")
    print(intInput)
    print(type(intInput))

    stringInput = input("python 내장함수 input으로 입력받기! (문자) : ")
    print(type(stringInput))
    print(stringInput)
------------------------------------------------------------------
python 내장함수 input으로 입력받기! (숫자) : 123
>>> 123
>>> <class 'str'>
python 내장함수 input으로 입력받기! (문자) : 123
>>> <class 'str'>
>>> 123

이때 input으로 입력받는 값은 "Enter" 가 입력되기 까지 입력 받는 숫자 전부이다.

1-2) input의 개행문자열

"Enter"로 입력받는 input은 마지막 Enter에 대한 개행문자열은 삭제처리 된다. 문자열의 개행문자 삭제 함수인 rstrip() 가 자동으로 적용된 것이다. 이는 두번째로 알게된 입력방식 sys 보다 시간효율이 떨어지는 방식임을 의미한다.

1-3) 입력 방식 커스텀

input 함수는 값을 입력받을때 별도로 prompt message를 설정할 수 있다. 1-1 에서 볼수 있듯 "python 내장함수 input으로 입력받기!" 를 input 함수에 함께 써 넣으면 파일이 실행 될 때 해당 문구가 함께 나타나며 값을 입력받게 된다. python으로 만드는 간단한 숫자야구게임과 같은 프로젝트에서 이를 많이 활용하는 모습이다.

1-4) 입력받은 값 변수에 저장하기

input을 통해 입력받은 값은 변수로 저장이 가능하다. 이때 입력받은 당시 사용된 prompt message는 변수로 저장에서 배제된다.

def check():
    student = input("안녕 학생들 : ")
    print("오늘 출석한 학생들 명단 :", student)
    print("출석 일등!", student.split(" ")[0])
---------------------------------------------------
안녕 학생들 : 바둑이 철수 영희
>>> 오늘 출석한 학생들 명단 : 바둑이 철수 영희
>>> 출석 일등! 바둑이

띄어쓰기로 구분된 여러값을 입력받은 input()저장 변수 student는 string 타입이므로 띄어쓰기를 기준으로 이를 list로 변환하기 위해 split 함수를 사용했다.
이중 첫번째 인자값을 사용하여 첫번째 출석 학생 이름을 출력하도록 했다.

1-5) 타입을 지정하여 입력받기

input을 통해 입력받는 값의 타입을 입력과 동시에 지정할 수 있다.

def check():
    origin_input = input()
    print(type(origin_input))
    int_change_input = int(input())
    print(type(int_change_input))
    no_int_change_input = int(input())
---------------------------------------------------
1004  # origin_input
>>> <class 'str'>
1004  # int_change_input
>>> <class 'int'>
천사  # no_int_change_input
Traceback (most recent call last):
  File "/Users/practice.py", line 32, in <module>
    check()
  File "/Users/practice.py", line 30, in check
    no_int_change_input = int(input())
                          ^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: '천사'

하지만 변환이 되지 않은 경우 바로 ValueError 가 발생하니 타입이 명확할 경우에만 사용하여야 한다.

1-6) 값 여러번 입력받기

한줄에 여러값을 입력받을 수 있고, 여러줄을 입력받을 수 있다.
먼저 한줄에 여러값을 입력받을때 해당 값을 각각 변수로 저장하기 위해서는 공통된 구분값이 필요하다. 그리고 공통 구분값을 split() 함수를 활용하여 저장하도록 한다.

def check():
    first_input, second_input = input().split(",")
    print(first_input)
    print(second_input)
--------------------------------------------------
apple,orange
>>> apple
>>> orange

위 예제에서 한줄에 구분값으로 여러값을 입력받으면서 동시에 타입을 지정하기 위해선 python의 map 함수를 활용한다.
python의 map 함수는 다수의 값을 동시에 타입변환할때 사용되는 내장함수이다.

def check():
    first_input, second_input = map(int, input().split(","))
    print(first_input)
    print(type(first_input))
    print(second_input)
    print(type(second_input))
--------------------------------------------------
123,456
>>> 123
>>> <class 'int'>
>>> 456
>>> <class 'int'>

이때에도 역시 입력받은 값이 타입변환이 불가능할 경우 ValueError가 발생한다

123,사과
Traceback (most recent call last):
  File "/Users/practice.py", line 31, in <module>
    check()
  File "/Users/practice.py", line 26, in check
    first_input, second_input = map(int, input().split(","))
    ^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: '사과'

반응형

+ Recent posts