알고리즘/BOJ
[BOJ 9167, Python 3] 도발 봇
70825
2022. 5. 7. 03:55
반응형
https://www.acmicpc.net/problem/9167
풀이
지문에 나온대로 구현을 하면 됩니다.
1) 모든 것을 딕셔너리에 저장하고 시뮬레이션 돌리기 (재귀 O)
2) taunt, sentence, ..., past-rel은 함수로 구현하고, 나머지는 딕셔너리에 저장하기 (재귀 X)
풀이는 위처럼 크게 두 가지로 나뉠 것 같구요. 저는 두 가지 방법 모두로 풀었습니다..
2번 풀이 같은 경우엔 jinhan814님 블로그에서 보고 풀었습니다.
계속 틀렸습니다가 나와서 블로그 풀이 글을 보고 코드를 짠 후에 틀린 점을 비교해봤는데, 예시에 나온 Knight의 경우엔 입력값의 첫 알파벳이 모두 대문자라서 이것도 도발 봇과 같이 첫글자를 대문자로 출력하게 만든게 원인이였네요. 그냥 입력값 그대로 출력을 해야했습니다.
코드 1
공유 소스 링크: https://www.acmicpc.net/source/share/a239afba917f457f9898dd7b7856f0fe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
def go(sentence):
global taunt_count
new_sentence = []
for info in sentence:
if info not in rule:
new_sentence.append(info)
elif info == 'taunt' and taunt_count <= taunt_need_count:
taunt_count += 1
count[info] += 1
new_sentence += go(rule[info][count[info] % len(rule[info])])
elif info != 'taunt':
new_sentence += go(rule[info][count[info] % len(rule[info])])
count[info] += 1
return new_sentence
import sys
input = sys.stdin.readline
rule = {'taunt': [['sentence'], ['taunt', 'sentence'], ['noun', '!'], ['sentence']],
'sentence': [['past-rel', 'noun-phrase'], ['present-rel', 'noun-phrase'], ['past-rel','a', 'noun']],
'noun-phrase': [['a', 'modified-noun']],
'modified-noun': [['noun'], ['modifier', 'noun']],
'modifier': [['adjective'], ['adverb', 'adjective']],
'present-rel': [['your', 'present-person', 'present-verb']],
'past-rel': [['your', 'past-person', 'past-verb']],
'present-person': [['steed'], ['king'], ['first-born']],
'past-person': [['mother'], ['father'], ['grandmother'], ['grandfather'], ['godfather']],
'noun': [['hamster'], ['coconut'], ['duck'], ['herring'], ['newt'], ['peril'], ['chicken'], ['vole'], ['parrot'], ['mouse'], ['twit']],
'present-verb': [['is'], ['masquerades as']],
'past-verb': [['was'], ['personified']],
'adjective': [['silly'], ['wicked'], ['sordid'], ['naughty'], ['repulsive'], ['malodorous'], ['ill-tempered']],
'adverb': [['conspicuously'], ['categorically'], ['positively'], ['cruelly'], ['incontrovertibly']]
}
count = __import__('collections').defaultdict(lambda: 0)
exception_sentence = 'theholygrail'
array = [s.strip() for s in sys.stdin]
for _ in range(len(array)):
arr = array[_].split()
word = 0
for val in arr:
flag = False
for i in range(len(val)):
if 0 <= ord(val[i].lower()) - ord('a') <= ord('z') - ord('a'):
flag = True
if flag: word += 1
taunt_need_count = word // 3 + (1 if word % 3 else 0)
taunt_count = 0
answer = []
exception_count = 0
exception_rule = False
for i in range(len(array[_])):
if exception_rule: break
if array[_][i].lower() == exception_sentence[exception_count]:
exception_count += 1
if exception_count == len(exception_sentence):
exception_rule = True
if exception_rule:
taunt_count += 1
answer.append(['(A childish hand gesture)'])
while taunt_count < taunt_need_count:
taunt_count += 1
answer += [go(rule['taunt'][count['taunt'] % len(rule['taunt'])])]
count['taunt'] += 1
print('Knight:', ' '.join(arr))
for i in range(len(answer)):
print('Taunter: ', end='')
upper_flag = True
for j in range(len(answer[i])):
for k in range(len(answer[i][j])):
if answer[i][j][k] == '!':
print(answer[i][j][k], end='')
upper_flag = True
elif upper_flag:
print(answer[i][j][k].upper(), end='')
upper_flag = False
else: print(answer[i][j][k], end='')
if j + 1 != len(answer[i]) and answer[i][j + 1] == '!': print('', end='')
elif j != len(answer[i]) - 1: print(' ', end='')
else: print('', end='')
print('. ')
if _ != len(array) -1: print()
|
cs |
코드 2
http://boj.kr/418ba93a03cb4b11b22fd34ac86b27e3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
def sentence():
val = count['sentence'] % 3
count['sentence'] += 1
if val == 0: return past_rel() + ' ' + noun_phrase()
elif val == 1: return present_rel() + ' ' + noun_phrase()
else: return past_rel() + ' a ' + noun()
def noun_phrase():
return 'a ' + modified_noun()
def modified_noun():
val = count['modified-noun'] % 2
count['modified-noun'] += 1
if val == 0: return noun()
else: return modifier() + ' ' + noun()
def modifier():
val = count['modifier'] % 2
count['modifier'] += 1
if val == 0: return adjective()
else: return adverb() + ' ' + adjective()
def present_rel():
return 'your' + ' ' + present_person() + ' ' + present_verb()
def past_rel():
return 'your' + ' ' + past_person() + ' ' + past_verb()
def present_person():
val = count['present-person'] % 3
count['present-person'] += 1
return rule['present-person'][val]
def past_person():
val = count['past-person'] % 5
count['past-person'] += 1
return rule['past-person'][val]
def noun():
val = count['noun'] % 11
count['noun'] += 1
return rule['noun'][val]
def present_verb():
val = count['present-verb'] % 2
count['present-verb'] += 1
return rule['present-verb'][val]
def past_verb():
val = count['past-verb'] % 2
count['past-verb'] += 1
return rule['past-verb'][val]
def adjective():
val = count['adjective'] % 7
count['adjective'] += 1
return rule['adjective'][val]
def adverb():
val = count['adverb'] % 5
count['adverb'] += 1
return rule['adverb'][val]
import sys
input = sys.stdin.readline
rule = {'present-person': ['steed', 'king', 'first-born'],
'past-person': ['mother', 'father', 'grandmother', 'grandfather', 'godfather'],
'noun': ['hamster', 'coconut', 'duck', 'herring', 'newt', 'peril', 'chicken', 'vole', 'parrot', 'mouse', 'twit'],
'present-verb': ['is', 'masquerades as'],
'past-verb': ['was', 'personified'],
'adjective': ['silly', 'wicked', 'sordid', 'naughty', 'repulsive', 'malodorous', 'ill-tempered'],
'adverb': ['conspicuously', 'categorically', 'positively', 'cruelly', 'incontrovertibly']
}
count = __import__('collections').defaultdict(lambda: 0)
exception_sentence = 'theholygrail'
array = []
for s in sys.stdin:
array.append(s.strip())
for _ in range(len(array)):
arr = array[_].split()
word = 0
for val in arr:
flag = False
for i in range(len(val)):
if 0 <= ord(val[i].lower()) - ord('a') <= ord('z') - ord('a'):
flag = True
if flag: word += 1
taunt_need_count = word // 3 + (1 if word % 3 else 0)
taunt_count = 0
answer = []
# 예외 규칙 확인
exception_count = 0
exception_rule = False
for i in range(len(array[_])):
if exception_rule: break
if array[_][i].lower() == exception_sentence[exception_count]:
exception_count += 1
if exception_count == len(exception_sentence):
exception_rule = True
if exception_rule:
taunt_count += 1
answer.append('(A childish hand gesture)')
# 일반 도발봇
while taunt_count < taunt_need_count:
if count['taunt'] % 3 == 1:
taunt_count += 2
answer.append(noun() + '! ' + sentence())
else:
taunt_count += 1
answer.append(sentence())
count['taunt'] += 1
# 답 출력
print('Knight:', ' '.join(arr))
if len(answer) == 0: print('Taunter: ')
for i in range(len(answer)):
print('Taunter: ', end='')
if answer[i] == '(A childish hand gesture)': print(answer[i] + '.')
else:
upper_flag = True
for j in range(len(answer[i])):
if answer[i][j] == '!':
print(answer[i][j], end='')
upper_flag = True
elif answer[i][j] != ' ' and upper_flag:
print(answer[i][j].upper(), end='')
upper_flag = False
else: print(answer[i][j], end='')
print('. ')
if _ != len(array) -1: print()
|
cs |
반응형