백준 10871번: X보다 작은 수

2023. 8. 17. 11:43개인활동/코테

i = input
n, x = i().split()

num_list = list(i().split())

for i in num_list:
    if int(x) > int(i): print(i, end=' ')

정수형으로 변환을 안해주니 10도 포함이 되었다. 그래서 if문에서 정수형으로 사용을 해주었는데...

아니 왜 10이 포함되는거지? 이해가 안된다.

a = str(10)
b = str(5)

if b > a:
    print(b)
else:
    print(a)

심지어 이렇게 테스트를 해보았다. 문자열로 넣으면 뭐가 달라지나 싶어서...

근데 결과가 이게 나옴...

뭘까?

i = input
n, x = i().split()

num_list = list(i().split())

for i in num_list:
    if x > i: print(i, end=' ')

왜 이렇게 했을 때는 예시를 아래 이미지처럼 넣으면 10이 포함이 되는걸까...?

왜?!?!?!?!?! if문에서 x와 i를 int형으로 변환해주지 않으면 10이 왜 포함되는 것인가?

 

일단 문자열을 비교연산하게되면 아스키코드로 변환하여 본다고 한다. 그렇다면 '5'와 '10'의 아스키코드를 확인해보자.

https://ko.rakko.tools/tools/74/

 

이진 번역기 / 변환기 : 이진, 십진, 헥사, 아스키 코드 및 일반 텍스트 | RAKKOTOOLS🔧

이진수, 10 진수, 16 진수, ASCII 숫자 및 텍스트 간 변환

ko.rakko.tools

이 사이트를 이용해 확인해보았다.

10을 10으로 보는게 아니라 1과 0으로 보았기 때문에 이런 결과가 나온 듯 하다.

이런 멍청한 자식!

 

 

그러면 이제 숏코드 분석을 시작해보자.

n,x,*a=map(int,open(0).read().split())
for i in a:i<x!=print(i)

가장 짧은 파이썬 코드를 가지고 왔다.

 

일단 궁금한 것부터 정리해본다.

1. open(0)은 무엇인가?

2. open(0).read()를 하면 어떻게 되는 것인가?

3. *a 와 a의 차이는 무엇인가?

4. i < x != print(i)는 무엇인가?

 

1. open(0)은 무엇인가?

https://stackoverflow.com/questions/53898231/integer-file-descriptor-0-in-open

 

Integer File Descriptor "0" in open()

In Python 3, it is possible to open a file object using an "integer file descriptor" with the format: stdout = open(1, "w") stdout.write("Hello World") # Prints Hello World stdout.close() Though,

stackoverflow.com

구글링을 해보던 중 백준에서 어떤분이 질문을 올린 것이 있었다. 그 답글로 이 링크가 함께 첨부되서 참고해보았다.

 

읽다보니 file descriptor가 뭔지 모르겠어서 이것부터 집고 넘어간다.

File Descriptor란?
- 리눅스, 유닉스 계열 시스템에서 프로세스가 파일을 다룰 때 사용하는 개념
- 일반적으로 0이 아닌 정수값을 가짐
- 프로세스 실행 중 파일을 열면 해당 프로세스의 FD 숫자 중 사용하지 않는 가장 작은 값 할당
- 이후 프로세스가 열려있는 파일에 시스템 콜을 이용해 접근할 때 FD값을 이용해 파일을 지칭
- 0은 Standard Input(stdin), 1은 Standard Output(stdout) 2는 Standard Error(stderr)

(https://twofootdog.tistory.com/51)

음.. 뭔가 알듯 말듯 하다.

 

여튼 파일 경로 대신 open(FD) 이렇게 들어갈 수 있다는 것이고, input을 받는 0을 넣어준 것이다.

 

 

2. open(0).read()를 하면 어떻게 되는 것인가?

오픈한 파일을 바로 읽어들이고 split()하여 각 변수에 할당해준다.

 

3. *a 와 a의 차이는 무엇인가?

*a는 입력값이 여러개인 경우 사용하는 방식이였다.

a는 split()된 값 하나를 입력받지만 *a를 사용하면 split()된 남은 입력값들을 모두 받는 것이다.

 

구체적인 용어로는 packing이라고 한다고 한다.

입력받은 여러개의 값을 하나의 객체로 합쳐서 받도록 하는 것이다.

 

https://wikidocs.net/22801

https://www.acmicpc.net/board/view/90354

4. i < x != print(i)는 무엇인가?

조건식 뒤에 !=는 왜 붙는걸까?

내가 아는 !=의 의미는 다르다의 의미였는데 다른 의미가 있는지 먼저 찾아본다.

 

다른 의미가 없는 것 같은데...

 

도대체 무슨 의미인거지?!?!?!?!

 

pycharm으로 코드를 돌려보면 출력이 안되어서 결과를 보지 못하는 상황

 

제발 아는 사람은 저에게 힌트를 주고 가셨으면 좋겠습니다.

 

백준에 물어보고 싶은데 아직 질문을 못쓰는 것 같음...

 


마지막 질문을 해결하지 못한 것이 너무 슬프지만...

좀더 고민해봐야겠다.

'개인활동 > 코테' 카테고리의 다른 글

백준 10813번: 공바꾸기  (0) 2023.08.20
백준 10810번: 공넣기  (0) 2023.08.20
백준 2562번: 최댓값  (0) 2023.08.19
백준 10818번: 최소, 최대  (0) 2023.08.18
백준 10807번 : 개수세기  (0) 2023.08.16