본문 바로가기
개발/SWEA (D2) 문제 풀이

SW Expert Academy - 1946. 간단한 압축 풀기(D2)

by v너굴이v 2022. 11. 14.

출처 - https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PmkDKAOMDFAUq&categoryId=AV5PmkDKAOMDFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=2&pageSize=10&pageIndex=2

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

<나의 풀이>

입력되는 각 알파벳 수를 통해 문자열들을 출력하는 문제라고 생각한다.

주어지는 알파벳이 대문자 A - Z이고, 최대 개수는 20개이다.

또한 친절하게 문자열의 길이를 10으로 정해줬다.

 

각 첫번째 줄은 테스트 케이스의 번호, 그리고 그다음 줄은 입력되는 알파벳 종류의 수로 보인다.

입력값을 먼저 세팅해보자.

T = int(input())
for i in range(1,T+1):
    N = int(input())
    print('#{}'.format(i))

이때 입력값이 (알파벳 숫자) 형식으로 N개 들어오기 때문에, 새로운 반복문으로 입력을 받아야 한다.

T = int(input())
for i in range(1,T+1):
    N = int(input())
    print('#{}'.format(i))
    for j in range(N):
        a , b = input().split()

이때 들어오는 값 a b는 모두 문자 타입이다.

우리가 출력할 것이 문자열이기 때문에 단순하게 생각하면 a를 b개 출력하면 된다.

따라서 다음과 같이 적을 수 있다.

L = a * int(b)

이것을 새로운 문자열 L에 저장하는데, 우리는 문자열이 10자리까지 가능하다.

따라서 10자리보다 크게 입력이 된다면,

혹은 10자리보다 적게 입력되고 다른 문자와 같이 작성해야 하는 등 여러 케이스들에 대해서 생각해봐야 한다.

따라서 조건문을 활용하자.

그런데 L = a * int(b)로 작성하면 문제가 생긴다.

이는 리스트 L이 반복문이 진행될 때마다 갱신되어 마지막 반복문 실행 입력값이 들어가는 것이다.

따라서 L에 추가를 하는 형식으로 바꿔야 한다.

L += a * int(b)

이러면 각 알파벳들이 입력된 수만큼 한 줄로 출력되는 것을 알 수 있다.

이제 여기서 우리는 길이를 활용하여 잘라주면 되겠다.

for j in range(len(L)):
    if (j) % 10 != 0:
        print(L[j],end='')

j가 0부터 입력되는데 길이 10을 기준으로 잘라야 하므로,

10으로 나눴을 때 나머지가 0인 경우는 다음 줄로 줄 바꿈 해야 한다.(잘라야 한다)

즉 다시 말하면 나머지가 0이 아닌 경우는 계속 이어서 쓰는 것이다.

줄 바꿈 없이 이어서 출력하려면 end=''를 사용하면 된다.

 

그런데 나눗셈에서 0이 분모가 될 수 없다.

출력은 L[0]부터하되 나누기 10은 길이 자체니깐 j+1로 시작 문자열의 자리를 1이라고 생각하면 된다.

따라서 이를 반영한 코드는 다음과 같다.

for j in range(len(L)):
    if (j+1) % 10 != 0:
        print(L[j],end='')
    else :
        print(L[j])

하지만 여기서 끝이 아닌 것이, 우리가 사용한 end=''때문에 각 케이스 별로 줄 바꿈 하는 것이 엉킨다.

따라서 for문 밖에서 print()를 통해 줄 바꿈 해주면 케이스를 구분할 수 있다.

이들을 모두 반영한 코드는 다음과 같다.

T = int(input())
for i in range(1,T+1):
    N = int(input())
    L = ''
    print('#{}'.format(i))
    for j in range(N):
        a , b = input().split()
        L += a * int(b)

    for j in range(len(L)):
        if (j+1) % 10 != 0:
            print(L[j],end='')
        else :
            print(L[j])
    print()

풀고 나니 쉬운 느낌이지만 시험에서 등장하면 헤맬 것 같은 문제였다.

이 문제뿐만 아니라 D2 문제들은 공부할 내용도 많고 마냥 쉽지는 않은 것 같다.

댓글