멤버 연산자

in / not in

멤버 연산자

멤버 연산자(membership operators)란 자료구조 안에 찾고자 하는 값이 있는지(혹은 없는지) 확인하는 연산자입니다.

이 연산자는 in과 not in이 있으며 자주 사용하는 방법은 두 가지로 in만 사용하는 방법과 for문에서 사용하는 방법이 있습니다.

멤버 연산자만 사용하기

멤버 연산자만 사용한다면 True 혹은 False만을 반환할 수 있습니다.

  • in을 사용한다면 자료구조 안에 값이 있을 때 True, 없으면 False를 반환

  • not in을 사용한다면 자료구조 안에 값이 있을 때 False, 없으면 True를 반환

사용 방법

연산자

예시

in

x in y (y 안에 x가 있는가?)

not in

x not in y (y 안에 x가 없는가?)

문자열에서 쓰는 방법은 아래와 같습니다.

in을 사용할 때, 글자가 문자열 안에 포함되어 있으면 True를 반환하고, 없으면 False를 반환합니다. not in은 그 반대입니다.

s = 'apple'

print('app' in s) # True를 반환
print('ppe' in s) # False를 반환

print('apples' not in s) # True를 반환
print('a' not in s) # False를 반환

리스트와 튜플, 세트와 같은 자료구조에서는 요소에 값이 있는지 없는지에 따라 True, False를 반환합니다. 참고로 딕셔너리의 경우에는 key값이 있는지 없는지 확인합니다.

arr = [123, 314, 119, [3, 4, 5]]

print(314 in arr) # True를 반
print(1 in arr) # False를 반환

print(315 not in arr) # True를 반환
print([3, 4, 5] not in arr) # False를 반환
t = ('항공우주 및 기계공학부', '항공전자정보공학부',
'소프트웨어학과', '신소재공학과', '스마트드론공학과')

print('소프트웨어학과' in t) # True를 반환
print('경영학과' in t) # False를 반환

print('자유전공학부' not in t) # True를 반환
print('항공전자정보공학부' not in t) # False를 반환
s = {1, 2, 3, 4, 5}

print(3 in s) # True를 반환
print('q' in s) # False를 반환

print({1, 2, 5} not in s) # True를 반환
print(5 not in s) # False를 반환
D = {(3,7): 'hi', 555: [4, 7, 8]}

print((3,7) in D) # True를 반환
print([4, 7, 8] in D) # False를 반환

print('hi' not in D) # True를 반환
print(555 not in D) # False를 반환

for ... in ...

그동안 우리는 for문을 사용할 때 for ... in range(...)과 같은 형식으로 코딩을 했는데요. range대신 자료구조를 넣어주면 변수의 값을 요소의 값으로 설정할 수 있습니다.

arr = [123, 314, 119, 157]

for i in arr:
    print(i)

위와 같은 코드가 있으면 반복문은 총 4번 돌아가고, 그동안 i의 값은 123, 314, 119, 157로 설정됩니다.

세트와 튜플도 마찬가지로 리스트와 똑같습니다.

s = 'abcdefg'

for x in s:
    print(x)

문자열의 경우에는 한글자씩 변수에 추가됩니다.

D = {(1, 2, 3) : 'hi', 'asdf': 1234}
D[0] = (5, 6)

for key in D:
    print(key)

딕셔너리의 경우에는 key값을 제공합니다.

연습문제

두 문제를 같이 풀어봅시다. 하나는 멤버 연산자만 사용하는 것이고, 다른 하나는 위에서 배운 두 가지를 전부를 활용하는 문제입니다.

BOJ 9226

입력 받은 문자열의 맨 앞 글자가 모음이 나오기 전까지 글자를 뒤로 보내고 끝에 ay를 붙여서 출력하라고 합니다. 우리는 글자를 뒤로 보내기보다는 for문을 이용하여 처음 모음이 나오는 index값을 구하여 슬라이싱을 이용해 출력을 합시다.

일단 입력값을 받는 코딩부터 해봅시다.

while True:
    s = input()
    if s == '#': break

그리고 이제 s[i]의 값이 모음인 ['a', 'e', 'i', 'o', 'u']에 속하는 값을 찾으므로 in을 이용하여 값을 찾아줍니다.

while True:
    s = input()
    if s == '#': break
    
    x = -1
    for i in range(len(s)):
        if s[i] in ['a', 'e', 'i', 'o', 'u']:
            x = i
            break

첫 모음이 나오는 index를 구해주었으면 이제 문자열의 슬라이싱 기능을 이용하여 출력을 해주면 됩니다. s[x:] + s[:x] + ay가 되겠네요.

주의할 점은 단어에 모음이 없으면 그냥 s + 'ay'를 출력해야 한다는 점입니다. 우리가 x = -1로 설정하였으니 for문을 돌린 후에도 x의 값이 -1이면 s + 'ay'를 출력하면 되겠네요.

while True:
    s = input()
    if s == '#': break

    x = -1
    for i in range(len(s)):
        if s[i] in ['a', 'e', 'i', 'o', 'u']:
            x = i
            break
    
    if x != -1:print(s[x:] + s[:x] + 'ay')
    else: print(s + 'ay')

BOJ 1159

각 선수의 이름이 주어지는데, 같은 성이 5명 이상이어야 경기를 진행할 수 있다고 합니다.

일단 입력 값을 받는 코드를 만들어줍시다.

n = int(input())
D = {}
for i in range(n):
    s = input()

우리는 딕셔너리를 사용하니까 같은 성을 입력 받으면 1을 더해주는 것으로 만들어줍시다.

n = int(input())
D = {}
for i in range(n):
    s = input()
    if s[0] in D: D[s[0]] += 1
    else: D[s[0]] = 1

주의할 점은 그냥 D[s[0]] += 1만 해주면 아직 딕셔너리에 key값이 저장되지 않았기 때문에 오류를 출력합니다. 그러므로 in이나 not in을 사용하여 문제를 풀어야합니다.

딕셔너리 안에 이미 key값 s가 있으면 D[s[0]] += 1을 해주고, 없으면 D[s[0]] = 1로 해주고 그 이후에 같은 값이 나올 때 D[s[0]] += 1을 해줄 수 있습니다.

이제 for ... in ... 을 이용하여 같은 성을 가진 선수가 5명 이상인지 확인하면 됩니다.

문제에서 같은 성을 가진 선수가 5명 이상이면 성의 첫 글자를 사전순으로 출력하라고 했으므로 일단 리스트를 하나 만들어서 성의 첫 글자를 저장해야겠네요.

n = int(input())
D = {}
for i in range(n):
    s = input()
    if s[0] in D: D[s[0]] += 1
    else: D[s[0]] = 1

ans = []
for x in D.keys(): # for x in D: 도 가능
    if D[x] >= 5: ans.append(x)

그리고 len을 이용하여 ans에 요소가 없으면 PREDAJA를 출력하고, 요소가 있으면 ans를 정렬하여 join을 이용해 출력하면 됩니다.

n = int(input())
D = {}
for i in range(n):
    s = input()
    if s[0] in D: D[s[0]] += 1
    else: D[s[0]] = 1

ans = []
for x in D.keys(): # for x in D: 도 가능
    if D[x] >= 5: ans.append(x)

if len(ans) == 0: print('PREDAJA')
else:
    ans.sort()
    print(''.join(ans))

풀어볼 문제

Last updated