#선언
d = dict()
d = {}
#값을 미리 넣을 때 선언
d = {key1 : value1, key2 : value2, key3 : value3, .... }
#값을 추가할 때
d[key1] = value1
d[key2] = value2
이제 기본 내용을 이해했으니 바로 문제를 풀어봅시다.
두 개의 입력 값을 받아서 본문과 같은 출력을 하라고 합니다. 이걸 딕셔너리로 풀어봅시다.
딕셔너리에 넣을 내용은 본문에 있는 내용을 드래그해서 긁어오면 편합니다.
p1 = {1 : "Yakk", 2 : "Doh", 3 : "Seh",
4 : "Ghar", 5 : "Bang", 6 : "Sheesh"}
p2 = {1 : "Habb Yakk", 2 : "Dobara", 3 : "Dousa",
4 : "Dorgy", 5 : "Dabash", 6 : "Dosh"}
t = int(input())
for i in range(t):
a, b = map(int,input().split())
p1은 a와 b의 값이 서로 다를 때 사용할 딕셔너리이고, p2는 a와 b의 값이 서로 같을 때 사용할 딕셔너리 입니다.
이제 for문 안에 a와 b의 값이 같은지 다른지 if / else문을 사용해서 a == b인 경우 출력을 해줍니다.
p1 = {1 : "Yakk", 2 : "Doh", 3 : "Seh",
4 : "Ghar", 5 : "Bang", 6 : "Sheesh"}
p2 = {1 : "Habb Yakk", 2 : "Dobara", 3 : "Dousa",
4 : "Dorgy", 5 : "Dabash", 6 : "Dosh"}
t = int(input())
for i in range(t):
a, b = map(int,input().split())
if a == b: print('Case {}: {}'.format(i+1, p2[a]))
else: ...
그리고 문제에서 a와 b중 큰 수부터 부르라고 했으니 이것도 마찬가지로 if / else 문을 통해 출력문을 작성할 수 있습니다. 거기다가 a = 5, b = 6 또는 a = 6, b = 5일 경우 Sheesh Bang이 아닌 Sheesh Beesh를 출력하라고 하였으므로 if / elif / else 문을 통해 나머지를 출력할 수 있게 됩니다.
p1 = {1 : "Yakk", 2 : "Doh", 3 : "Seh",
4 : "Ghar", 5 : "Bang", 6 : "Sheesh"}
p2 = {1 : "Habb Yakk", 2 : "Dobara", 3 : "Dousa",
4 : "Dorgy", 5 : "Dabash", 6 : "Dosh"}
t = int(input())
for i in range(t):
a, b = map(int,input().split())
if a == b: print('Case {}: {}'.format(i+1, p2[a]))
else:
if min(a, b) == 5 and max(a, b) == 6: print('Case {}: {}'.format(i + 1, "Sheesh Beesh"))
elif b > a: print('Case {}: {} {}'.format(i+1, p1[b], p1[a]))
else: print('Case {}: {} {}'.format(i+1, p1[a], p1[b]))
이 기능들 중에 가장 많이 쓰이는 것은 dict_keys이고, 나머지는 문제를 풀 때 거의 쓰이지 않습니다. values와 items 메소드를 이용해서 풀은 문제는 없던 것으로 기억해요.
그래서 문제들은 전부 key 값을 구하는 문제들밖에 없습니다. key값을 이용한 문제들은 보통 다른 지식과 함께 사용하여 문제를 푸는 편입니다. 그래서 코드 양이 이전보다 많아서 다른 문제들에 비해 좀 어려울 수도 있어요.
문제를 풀어보겠습니다.
모든 소문자 알파벳을 사용해서 문장을 만들었는지 물어보는 문제입니다.
일단 *를 입력받아야 종료를 하고 있으므로 while문이 필요할 것이고, dict를 이용하여 모든 소문자 알파벳이 나타나는 개수를 저장해야 합니다. key 값은 소문자 알파벳, value 값은 0으로 저장을 합시다.
참고로 여기서는 알파벳을 일일이 적는 것보다 아스키 코드를 이용해서 저장하는 것이 편합니다. 알파벳 소문자의 아스키코드는 a = 97부터 z = 122까지 있습니다.
아스키코드는 외울 필요가 없고, 문자를 아스키코드로 출력하는 함수 ord()와 아스키코드를 문자로 출력하는 함수 chr()만 알고 있으면 됩니다. 나중에 쓸 일이 있으면 ord('a'), ord('z'), ord('A'), ord('Z')로 찾으면 되는 것이니까요.
while True:
s = input()
if s == '*': break
D = {}
for i in range(26):
D[chr(97+i)] = 0
이제 for문을 이용해서 문자열 s를 하나하나 확인해봐야 하는데, D[s[i]] += 1을 하면 코드가 잘 작동할까요?
while True:
s = input()
if s == '*': break
D = {}
for i in range(26):
D[chr(97+i)] = 0
for i in range(len(s)):
D[s[i]] += 1
s[i]의 값이 공백일 때, 1을 더해주면 D에 없는 key값이기 때문에 아래와 같이 오류가 나오게 됩니다.
그러므로 if문과 아스키코드를 이용하여 s[i]가 알파벳 소문자인지 확인하고 개수를 세어 주어야 합니다.
while True:
s = input()
if s == '*': break
D = {}
for i in range(26):
D[chr(97+i)] = 0
for i in range(len(s)):
# ord('a') <= ord(s[i]) <= ord('z')도 가능
if 97 <= ord(s[i]) <= 122:
D[s[i]] += 1
문장 안에 들어있는 알파벳의 개수를 모두 세었으면 이제 dict_keys를 이용하여 모든 알파벳을 사용하였는지 확인해주면 됩니다. 알파벳을 사용하지 않았으면 D[s[i]] += 1을 해주지 않았으니 값이 0이 나오게 됩니다.
while True:
s = input()
if s == '*': break
D = {}
for i in range(26):
D[chr(97+i)] = 0
for i in range(len(s)):
# ord('a') <= ord(s[i]) <= ord('z')도 가능
if 97 <= ord(s[i]) <= 122:
D[s[i]] += 1
#처음엔 알파벳이 모두 있다고 가정하고 나중에 False로 변경
flag = True
key = list(D.keys())
for i in range(len(key)):
if D[key[i]] == 0:
flag = False
if flag == True: print('Y')
else: print('N')
다른 문제도 풀어봅시다.
문자열을 줄마다 값을 2개씩 입력받아 현재 회사원들이 회사에 있는지 없는지 확인하여 회사에 남은 회사원의 이름을 출력하라는 문제입니다.
일단 입력값을 받는 코드와 회사원의 상태를 저장할 딕셔너리를 만들어 딕셔너리에 저장해봅시다. key 값은 사원의 이름이고, value 값은 enter나 leave가 되겠네요.
company = dict() # d = {}
n = int(input())
for i in range(n):
x, y = input().split()
company[x] = y
입력을 다 받았으면 회사를 퇴근한 사람은 leave라는 value값을 가질 것이고, 아직 회사에 남아 있다면 enter라는 value 값을 가지고 있다는 것을 알 수 있습니다. 이제 dict_keys를 이용하여 value값이 enter인 회사원들을 리스트에 따로 저장해줍니다.
company = dict() # d = {}
n = int(input())
for i in range(n):
x, y = input().split()
company[x] = y
key = list(company.keys())
ans = []
for i in range(len(key)):
if company[key[i]] == 'enter':
ans.append(key[i])
이제 다 저장을 했으면 출력을 해야 하는데, 사전 순의 역순으로 출력하라고 하였으니 sort안에 reverse인자를 추가하거나, sort만 사용하고 [::-1]을 이용하여 리스트를 뒤집어주면 됩니다. 총 세 가지 방법을 아래에 적어 놨는데 마음에 드는 것을 사용하시면 됩니다.
그리고 출력을 할 때는 for문이나 '\n'.join(ans)를 이용하면 됩니다.
company = dict() # d = {}
n = int(input())
for i in range(n):
x, y = input().split()
company[x] = y
key = list(company.keys())
ans = []
for i in range(len(key)):
if company[key[i]] == 'enter':
ans.append(key[i])
# ans = sorted(ans)[::-1] 또는 ans = sorted(ans, reverse= True)
ans.sort(reverse = True)
for i in range(len(ans)):
print(ans[i])