문장이 주어지고 주어진 범위내에 특정한 글자가 몇개있는지 알아보는 문제이다
문제마다 사용글자가 주어지는것에대해 의아하게 생각했는데
왜냐면 모든문제에서 물어보는 글자가 같았기때문이다
그래서 나는 같은 글자만 나올수있는줄알았다 아래는 내가 첫번째로 제출한 코드이다
# import sys
# input=sys.stdin.readline
string=input()
q=int(input())
# 어떤 알파벳인지 알아야함
alpha=input().split()
alphabet=alpha[0]
# 누적합 계산 시작
sumed_num=[0]
alpha_num=0
for i in string:
if i==alphabet:
alpha_num+=1
sumed_num.append(alpha_num)
else:
sumed_num.append(alpha_num)
# print(sumed_num)
print(sumed_num[int(alpha[2])+1] - sumed_num[int(alpha[1])])
for i in range(q-1):
alpha=input().split()
print(sumed_num[int(alpha[2])+1] - sumed_num[int(alpha[1])])
틀렸습니다가 떳다
추측할수있는 이유는 두가지
첫번째는 a가 나오는것이 맞고 내가 틀린것
두번째는 다른 알파벳이 나올수있다는것
문제마다 다른 알파벳이 나온다면 뭐 문제하나 풀자고 계속 누적합 세트를 만들라는건가?
하면서 말도안된다고 생각했다 근데 생각해보니
알파벳 수는 26개? 밖에 되지않는다는 사실을 깨달았다
그리고 문제의 수는 20만개이다
그러니 할만하다는 결론이 나옴
하지만 계속해서
이렇게 단순하게 푸는 문제가 맞나?
라는 생각이 들었다
일단은 구현해보았다
많이 길다
import sys
input=sys.stdin.readline
string=input()
q=int(input())
used_alphabet=[]
for i in range(q):
question=input().split()
if question[0]=='a':
if question[0] in used_alphabet:
print(sumed_a[int(question[2])+1] - sumed_a[int(question[1])])
else:
sumed_a=[0]
a_num=0
for j in string:
if j=='a':
a_num+=1
sumed_a.append(a_num)
else:
sumed_a.append(a_num)
used_alphabet.append('a')
print(sumed_a[int(question[2])+1] - sumed_a[int(question[1])])
elif question[0]=='b':
if question[0] in used_alphabet:
print(sumed_b[int(question[2])+1] - sumed_b[int(question[1])])
else:
sumed_b=[0]
b_num=0
for j in string:
if j=='b':
b_num+=1
sumed_b.append(b_num)
else:
sumed_b.append(b_num)
used_alphabet.append('b')
print(sumed_b[int(question[2])+1] - sumed_b[int(question[1])])
elif question[0]=='c':
if question[0] in used_alphabet:
print(sumed_c[int(question[2])+1] - sumed_c[int(question[1])])
else:
sumed_c=[0]
c_num=0
for j in string:
if j=='c':
c_num+=1
sumed_c.append(c_num)
else:
sumed_c.append(c_num)
used_alphabet.append('c')
print(sumed_c[int(question[2])+1] - sumed_c[int(question[1])])
elif question[0]=='d':
if question[0] in used_alphabet:
print(sumed_d[int(question[2])+1] - sumed_d[int(question[1])])
else:
sumed_d=[0]
d_num=0
for j in string:
if j=='d':
d_num+=1
sumed_d.append(d_num)
else:
sumed_d.append(d_num)
used_alphabet.append('d')
print(sumed_d[int(question[2])+1] - sumed_d[int(question[1])])
elif question[0]=='e':
if question[0] in used_alphabet:
print(sumed_e[int(question[2])+1] - sumed_e[int(question[1])])
else:
sumed_e=[0]
e_num=0
for j in string:
if j=='e':
e_num+=1
sumed_e.append(e_num)
else:
sumed_e.append(e_num)
used_alphabet.append('e')
print(sumed_e[int(question[2])+1] - sumed_e[int(question[1])])
elif question[0]=='f':
if question[0] in used_alphabet:
print(sumed_f[int(question[2])+1] - sumed_f[int(question[1])])
else:
sumed_f=[0]
f_num=0
for j in string:
if j=='f':
f_num+=1
sumed_f.append(f_num)
else:
sumed_f.append(f_num)
used_alphabet.append('f')
print(sumed_f[int(question[2])+1] - sumed_f[int(question[1])])
elif question[0]=='g':
if question[0] in used_alphabet:
print(sumed_g[int(question[2])+1] - sumed_g[int(question[1])])
else:
sumed_g=[0]
g_num=0
for j in string:
if j=='g':
g_num+=1
sumed_g.append(g_num)
else:
sumed_g.append(g_num)
used_alphabet.append('g')
print(sumed_g[int(question[2])+1] - sumed_g[int(question[1])])
elif question[0]=='h':
if question[0] in used_alphabet:
print(sumed_h[int(question[2])+1] - sumed_h[int(question[1])])
else:
sumed_h=[0]
h_num=0
for j in string:
if j=='h':
h_num+=1
sumed_h.append(h_num)
else:
sumed_h.append(h_num)
used_alphabet.append('h')
print(sumed_h[int(question[2])+1] - sumed_h[int(question[1])])
elif question[0]=='i':
if question[0] in used_alphabet:
print(sumed_i[int(question[2])+1] - sumed_i[int(question[1])])
else:
sumed_i=[0]
i_num=0
for j in string:
if j=='i':
i_num+=1
sumed_i.append(i_num)
else:
sumed_i.append(i_num)
used_alphabet.append('i')
print(sumed_i[int(question[2])+1] - sumed_i[int(question[1])])
elif question[0]=='j':
if question[0] in used_alphabet:
print(sumed_j[int(question[2])+1] - sumed_j[int(question[1])])
else:
sumed_j=[0]
j_num=0
for j in string:
if j=='j':
j_num+=1
sumed_j.append(j_num)
else:
sumed_j.append(j_num)
used_alphabet.append('j')
print(sumed_j[int(question[2])+1] - sumed_j[int(question[1])])
elif question[0]=='k':
if question[0] in used_alphabet:
print(sumed_k[int(question[2])+1] - sumed_k[int(question[1])])
else:
sumed_k=[0]
k_num=0
for j in string:
if j=='k':
k_num+=1
sumed_k.append(k_num)
else:
sumed_k.append(k_num)
used_alphabet.append('k')
print(sumed_k[int(question[2])+1] - sumed_k[int(question[1])])
elif question[0]=='l':
if question[0] in used_alphabet:
print(sumed_l[int(question[2])+1] - sumed_l[int(question[1])])
else:
sumed_l=[0]
l_num=0
for j in string:
if j=='l':
l_num+=1
sumed_l.append(l_num)
else:
sumed_l.append(l_num)
used_alphabet.append('l')
print(sumed_l[int(question[2])+1] - sumed_l[int(question[1])])
elif question[0]=='m':
if question[0] in used_alphabet:
print(sumed_m[int(question[2])+1] - sumed_m[int(question[1])])
else:
sumed_m=[0]
m_num=0
for j in string:
if j=='m':
m_num+=1
sumed_m.append(m_num)
else:
sumed_m.append(m_num)
used_alphabet.append('m')
print(sumed_m[int(question[2])+1] - sumed_m[int(question[1])])
elif question[0]=='n':
if question[0] in used_alphabet:
print(sumed_n[int(question[2])+1] - sumed_n[int(question[1])])
else:
sumed_n=[0]
n_num=0
for j in string:
if j=='n':
n_num+=1
sumed_n.append(n_num)
else:
sumed_n.append(n_num)
used_alphabet.append('n')
print(sumed_n[int(question[2])+1] - sumed_n[int(question[1])])
elif question[0]=='o':
if question[0] in used_alphabet:
print(sumed_o[int(question[2])+1] - sumed_o[int(question[1])])
else:
sumed_o=[0]
o_num=0
for j in string:
if j=='o':
o_num+=1
sumed_o.append(o_num)
else:
sumed_o.append(o_num)
used_alphabet.append('o')
print(sumed_o[int(question[2])+1] - sumed_o[int(question[1])])
elif question[0]=='p':
if question[0] in used_alphabet:
print(sumed_p[int(question[2])+1] - sumed_p[int(question[1])])
else:
sumed_p=[0]
p_num=0
for j in string:
if j=='p':
p_num+=1
sumed_p.append(p_num)
else:
sumed_p.append(p_num)
used_alphabet.append('p')
print(sumed_p[int(question[2])+1] - sumed_p[int(question[1])])
elif question[0]=='q':
if question[0] in used_alphabet:
print(sumed_q[int(question[2])+1] - sumed_q[int(question[1])])
else:
sumed_q=[0]
q_num=0
for j in string:
if j=='q':
q_num+=1
sumed_q.append(q_num)
else:
sumed_q.append(q_num)
used_alphabet.append('q')
print(sumed_q[int(question[2])+1] - sumed_q[int(question[1])])
elif question[0]=='r':
if question[0] in used_alphabet:
print(sumed_r[int(question[2])+1] - sumed_r[int(question[1])])
else:
sumed_r=[0]
r_num=0
for j in string:
if j=='r':
r_num+=1
sumed_r.append(r_num)
else:
sumed_r.append(r_num)
used_alphabet.append('r')
print(sumed_r[int(question[2])+1] - sumed_r[int(question[1])])
elif question[0]=='s':
if question[0] in used_alphabet:
print(sumed_s[int(question[2])+1] - sumed_s[int(question[1])])
else:
sumed_s=[0]
s_num=0
for j in string:
if j=='s':
s_num+=1
sumed_s.append(s_num)
else:
sumed_s.append(s_num)
used_alphabet.append('s')
print(sumed_s[int(question[2])+1] - sumed_s[int(question[1])])
elif question[0]=='t':
if question[0] in used_alphabet:
print(sumed_t[int(question[2])+1] - sumed_t[int(question[1])])
else:
sumed_t=[0]
t_num=0
for j in string:
if j=='t':
t_num+=1
sumed_t.append(t_num)
else:
sumed_t.append(t_num)
used_alphabet.append('t')
print(sumed_t[int(question[2])+1] - sumed_t[int(question[1])])
elif question[0]=='u':
if question[0] in used_alphabet:
print(sumed_u[int(question[2])+1] - sumed_u[int(question[1])])
else:
sumed_u=[0]
u_num=0
for j in string:
if j=='u':
u_num+=1
sumed_u.append(u_num)
else:
sumed_u.append(u_num)
used_alphabet.append('u')
print(sumed_u[int(question[2])+1] - sumed_u[int(question[1])])
elif question[0]=='v':
if question[0] in used_alphabet:
print(sumed_v[int(question[2])+1] - sumed_v[int(question[1])])
else:
sumed_v=[0]
v_num=0
for j in string:
if j=='v':
v_num+=1
sumed_v.append(v_num)
else:
sumed_v.append(v_num)
used_alphabet.append('v')
print(sumed_v[int(question[2])+1] - sumed_v[int(question[1])])
elif question[0]=='w':
if question[0] in used_alphabet:
print(sumed_w[int(question[2])+1] - sumed_w[int(question[1])])
else:
sumed_w=[0]
w_num=0
for j in string:
if j=='w':
w_num+=1
sumed_w.append(w_num)
else:
sumed_w.append(w_num)
used_alphabet.append('w')
print(sumed_w[int(question[2])+1] - sumed_w[int(question[1])])
elif question[0]=='x':
if question[0] in used_alphabet:
print(sumed_x[int(question[2])+1] - sumed_x[int(question[1])])
else:
sumed_x=[0]
x_num=0
for j in string:
if j=='x':
x_num+=1
sumed_x.append(x_num)
else:
sumed_x.append(x_num)
used_alphabet.append('x')
print(sumed_x[int(question[2])+1] - sumed_x[int(question[1])])
elif question[0]=='y':
if question[0] in used_alphabet:
print(sumed_y[int(question[2])+1] - sumed_y[int(question[1])])
else:
sumed_y=[0]
y_num=0
for j in string:
if j=='y':
y_num+=1
sumed_y.append(y_num)
else:
sumed_y.append(y_num)
used_alphabet.append('y')
print(sumed_y[int(question[2])+1] - sumed_y[int(question[1])])
elif question[0]=='z':
if question[0] in used_alphabet:
print(sumed_z[int(question[2])+1] - sumed_z[int(question[1])])
else:
sumed_z=[0]
z_num=0
for j in string:
if j=='z':
z_num+=1
sumed_z.append(z_num)
else:
sumed_z.append(z_num)
used_alphabet.append('z')
print(sumed_z[int(question[2])+1] - sumed_z[int(question[1])])
파이썬으로 풀었을때는 70퍼센트정도에서 끊기며 50점
파이파이로 풀었을때는 100점을 맞을수있었다
긴이유는 새로운 알파벳이 들어올때마다 새로운 누적합 리스트를 만들어야하는데
반복문을 이용했을경우 반복문 인자를가지고 내가 원하는 리스트명을 만들수없었다
변수명으로 f스트링을이용할수있는것도 아니라 그냥 노가다로 해결했다
이것도 알파벳개수가 26개밖에 없었으니 한일이지 100개였으면 새로운방법을 찾았을것같다
간단하게 원리를 설명하자면 문제에서 새로운 문자를 찾으라고 하면 해당 문자에대한 누적합 리스트를 만들었고
이미 구했던 문자였으면 원래 있던 누적합 리스트를 이용했다
모든 알파벳에 대한 누적합리스트를 만들지않고 딱 필요할때만 만들어서 사용하였다
그리디 알고리즘의 이해 파이썬 (0) | 2022.08.13 |
---|---|
백준 나머지합 파이썬 (0) | 2022.08.09 |
백준 구간 합 구하기4 파이썬 (0) | 2022.08.04 |
백준 평범한 배낭 파이썬 (0) | 2022.08.03 |
백준 LCS 파이썬 (0) | 2022.08.02 |