상세 컨텐츠

본문 제목

백준 인간-컴퓨터 상호작용 파이썬

프로그래밍/백준풀이

by 아싸호랑나비 2022. 8. 7. 18:35

본문

문장이 주어지고 주어진 범위내에 특정한 글자가 몇개있는지 알아보는 문제이다

문제마다 사용글자가 주어지는것에대해 의아하게 생각했는데

왜냐면 모든문제에서 물어보는 글자가 같았기때문이다

그래서 나는 같은 글자만 나올수있는줄알았다 아래는 내가 첫번째로 제출한 코드이다

# 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

관련글 더보기