brunch

You can make anything
by writing

C.S.Lewis

by 김지영입니다 Jan 29. 2024

외계어 배우기- 문제#3 WinningTeam:조건문1

Python을 배워봅시다

대부분의 프로그램은 실행 중 일어나는 일에 따라 다르게 동작한다. 이것은 우리의 일상과도 비슷하다. 예를 들면, 우리가 요즘 카페에 갔을 때 흔히 듣는 질문 중 하나가 “영수증 드릴까요?”이다. 이 질문에 대한 대답에 따라서 다음 행동이 달라진다. “예라고 대답했다면 영수증을 받을 것이고, “아니요”라고 대답한다면 영수증을 받지 않을 것이다. 이를 프로그램에 적용해 보자. 예를 들어 워드프로세서가 작업을 저장할 것인지 물을 때 라고 대답하면(를 선택하면) 저장할 것이고 “아니요”라고 대답하면 저장하지 않을 것이다.


프로그램에 이런 결정을 내리도록 하는 것이 조건문Conditional statement이다.


이제, 우리가 해결해야 할 문제 #3에 대해 알아보자. 이 문제는 사과 팀과 바나나 팀의 농구 경기 결과에 따라 메시지를 출력하는 것이다. 


도전 과제: 사과 팀과 바나나 팀의 농구 경기에서 각 팀의 3점, 2점, 1점 슛의
성공 횟수를 기록하여 어느 팀이 이겼는지, 혹은  비겼는지 표시한다.


알다시피 농구에서 점수를 얻는 방법은 총 3가지이며, 3점 슛과 2점 슛 그리고 1점 자유투이다. 경기 동안 두 팀이 얻은 점수를 읽어서 총점을 비교해 보고 더 높은 점수를 획득한 팀이 이길 것이고, 동점이 나온다면 비긴다. 그럼 점수는 어떻게 읽어 올 수 있을까? 제일 쉬운 방법은 팀이 득점할 때마다 총점에 득점한 점수를 더하는 것이다. 그런데 알다시피 우리는 지금 더 빠르고 편한 방법을 컴퓨터에게 시키기 위해 프로그램을 배우는 중이니... 

입력: 
사과 팀의 3점 슛 성공 횟수
사과 팀의 2점 슛 성공 횟수
사과 팀의 1점 슛 성공 횟수
바나나 팀의 3점 슛 성공 횟수
바나나 팀의 2점 슛 성공 횟수
바나나 팀의 1점 슛 성공 횟수


사과 팀이 이기면 A, 바나나 팀이 이기면 B, 동점이면 T를 출력한다.


조건부 실행

이 전에 배운 내용을 활용해 보자.  

input과 int 함수를 사용해 입력에서 6개의 정수를 각각 읽을 수 있다

변수를 사용해 입력된 값들을 보관할 수 있다.

3점 슛 성공 횟수에 3을, 2점 슛 성공 횟수에 2를 곱할 수 있다.

print 함수로 A나 B 또는 T라는 문자를 출력할 수 있다.


여기서 중요한 것은 두 결과를 비교할 수 있어야 한다는 점이다. 조건은 결과로 True(참) 또는 False(거짓)을 나타내는 표현식으로 파이썬에서는 if 문을 사용하여 이러한 종류의 결정을 내릴 수 있다. 즉, if 문은 조건에 따라 프로그램이 다르게 실행될 수 있도록 만든다.


Boolean 타입

파이썬에는 Boolean이라는 타입(유형)이 있는데, 다른 값을 갖는 문자열이나 정수 등과 다르게 Boolean 타입은 True 또는 False 값만 존재하고 대소문자를 구분하는 파이썬의 특성 때문에 대문자로 표기한다. 


Chatpy says,
수학자 George Boole의 이름을 딴 파이썬의 Boolean 타입은 두 가지 값 중 하나를 가질 수 있는 데이터 유형입니다: 참 또는 거짓. 부울은 특히 조건문과 논리 연산에서 표현식의 참 값을 나타내는 데 사용됩니다. 
덧, 값을 파이썬의 type 함수에 전달하면 값의 타입(유형)을 알려준다. 값의 타입을 잘 모를 때 유용하다.


이 Boolean 타입의 값으로 무언가를 할 수 있는 연산자가 필요할 텐데, 이를 관계 연산자라고 한다.


관계 연산자

이름에서 알 수 있듯이 이 연산자는 값의 관계를 나타내는 연산자이다. 

== (같다)

!= (같지 않다)

> (~보다 크다)

< (~보다 작다)

>= (~보다 크거나 같다)

<= (~보다 작거나 같다)

덧, >=, <=에서 =가 뒤에 오는 점에 유의하자.

이는 두 개의 피연산자를 비교하여 연산자의 의미와 맞으면 True, 틀리면 False를 반환한다.


그런데 가만히 보면 대부분이 값을 비교하는 연산자인데, 왜 비교 연산자라고 하지 않고 관계 연산자라고 했을까?

Chatpy says,
프로그래밍 용어에서 '비교 연산자'와 '관계 연산자'라는 용어는 종종 같은 의미로 사용되지만, 문맥이나 논의되는 프로그래밍 언어에 따라 약간씩 다른 의미를 가질 수 있습니다.
비교 연산자
- '비교 연산자'라는 용어는 일반적으로 두 값을 비교하는 데 사용되는 연산자를 의미하고, 관계 연산자는 일반적으로 동일한 연산자 집합을 지칭하는 용어입니다.
- 파이썬에서는 ==(같음), !=(같지 않음), >(보다 큼), <(보다 작음), >=(보다 크거나 같음), <=(보다 작거나 같음) 등이 여기에 포함됩니다.
- '비교' 대신 '관계'라고 부르는 이유는 두 개체 간의 관계를 정의하는 데 사용되기 때문입니다. 예를 들어 >를 사용하면 한 값이 다른 값보다 큰지 확인하여 관계형 컨텍스트를 설정합니다. 
- 한 용어가 다른 용어보다 선호되는 것은 프로그래밍 언어, 교육적 맥락 또는 특정 컴퓨터 과학 텍스트에 따라 달라질 수 있습니다.
- Python 문서와 대부분의 최신 프로그래밍 튜토리얼에서는 '비교 연산자'라는 용어가 일반적으로 사용됩니다. 
덧, 모두 이해가 가는 것은 아니지만, 여하튼 '비교' 연산자 또는 '관계' 연산자라고 부르든, 중요한 것은 이 연산자의 기능과 코드에서 어떻게 사용되는지 이해하는 것이다. 내가 공부하는 책에서는 관계 연산자라고 표현하고 있다.


연산자의 의미는 외우자. 우리가 수학 연사자의 의미를 외우고 이해하고 있는 것처럼... 파이썬은 대소문자 구분이 중요하니 참고하자.

덧, 아직 입력이 느려서 좀 빠르게 수정하여 저장했음.

 

아래 영상에서 알 수 있듯이 파이썬에서 문자열을 비교할 때는 규칙이 있다.

1. Python의 문자열 비교는 사전 순서와 같이 사전순으로 수행된다. : 문자열의 각 문자는 유니코드 코드 포인트 값을 기준으로 비교된다. 예를 들어, 'a' < 'b'는 'a'의 유니코드 값이 'b'의 유니코드 값보다 작기 때문에 True를 반환한다.

2. 비교는 대소문자를 구분한다. : 대문자는 소문자와 다른 유니코드 값을 가지며, 일반적으로 대문자의 유니코드 값이 더 작습니다. 예를 들어 'A' < 'a'는 True를 반환한다.

3. 비교는 각 문자열의 첫 문자부터 시작한다. : 첫 번째 문자가 같으면 두 번째 문자를 비교하는 식으로 비교한다. 같지 않은 문자 쌍이 발견되거나 한 문자열에 문자가 부족할 때까지 이 작업이 계속된다. 예를 들어, 'abc' < 'abd'는 세 번째 문자, 즉 'c' < 'd'까지 동일하므로 True를 반환한다.

4. 모든 문자가 같지만 문자열의 길이가 다른 경우 짧은 문자열이 긴 문자열보다 작은 것으로 간주한다. 예를 들어, 'ab' < 'abc'는 'abc'의 접두사이므로 True를 반환한다.

5. 특수 문자(예: 공백, 구두점)도 유니코드 값을 가지며 비교에 포함된다. 예를 들어, 'a' < 'a '('a'에 공백이 있음)는 공백이 문자열의 끝보다 유니코드 값이 더 높기 때문에 True를 반환한다.


정확히 말해서 문자열의 비교는 올림픽 메달 시스템을 적용한다고 배웠다.

Chatpy says,
올림픽 메달 시스템을 문자열 비교에 적용하면 올림픽에서 금메달, 은메달, 동메달의 우선순위를 정하는 방식과 유사하게 여러 기준에 따라 문자열을 비교하는 계층적 접근 방식이 필요합니다. 문자열의 경우, 이는 문자열의 순서나 등가를 결정할 때 문자열의 특정 측면이나 특성에 우선순위를 두는 것을 의미할 수 있습니다.

다음은 개념적으로 어떻게 작동하는지에 대한 개요입니다.
1. 기본 기준(금메달 등가): 문자열의 길이, 첫 번째 문자의 알파벳 순서 또는 가장 중요하다고 판단되는 기타 주요 특성이 될 수 있습니다. 예를 들어, 'apple'와 'apricot' 길이를 기준으로 비교하는 경우, 'apple'(5자)보다 'apricot'(7자)가 먼저 나옵니다.
2. 보조 기준(은메달 등가): 기본 기준이 동일한 경우(예: 길이가 같은 두 문자열), 비교는 보조 기준으로 이동합니다. 이 기준은 각 문자열의 두 번째 문자, 모음 수 또는 기타 다른 측면일 수 있습니다. 예시를 계속 이어서, 둘 다 5자인 "apple"과 "ample"을 비교하는 경우, 알파벳 순서를 고려하여 "apple" 앞에 "ample"이 올 수 있습니다.
3. 3차 기준(동메달 등가): 1차 기준과 2차 기준이 동일한 경우 세 번째 기준이 사용됩니다. 이는 세 번째 문자, 특정 문자의 빈도 등이 될 수 있습니다.
4. 추가 기준: 필요에 따라 더 많은 기준을 추가할 수 있으며, 각 기준은 이전 기준보다 우선순위가 낮습니다.

실제 문자열 비교 시나리오에서 선택되는 기준은 작업의 특정 요구 사항에 따라 달라집니다. 예를 들어, 일부 프로그래밍 또는 데이터 정렬 작업에서는 문자열을 먼저 길이로 비교한 다음, 알파벳 순서로 비교하고, 마지막으로 다른 텍스트 특성으로 비교할 수 있습니다.

이 접근 방식은 올림픽 메달 시스템을 문자열 비교에 개념적으로 확장한 것으로, 표준 프로그래밍 작업에는 직접 적용되지 않을 수 있다는 점에 유의해야 합니다. 하지만 다양한 맥락에서 다중 기준 비교 및 정렬에 대해 생각해 볼 수 있는 흥미로운 방법입니다.


아, 파이썬에는 contain 연산자도 존재한다. 이는 문자열에서만 동작하고 숫자에서는 동작하지 않는 연산자이며, 연속된 문자열에 대해서만 동작한다.

>>> 'ppl' in 'apple'

True

>>> 'ale' in 'apple'

False



매거진의 이전글 외계어 배우기 - 문제#2 ConeVolume
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari