ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Codeforces Round #534 (Div. 2) A ~ C
    알고리즘/Codeforces 2021. 1. 12. 21:27
    반응형

    codeforces.com/contest/1104

     

    Dashboard - Codeforces Round #534 (Div. 2) - Codeforces

     

    codeforces.com

     

    풀은 문제: A, B, C

    못 풀은 문제: D, E

     

    난이도

    A - 800

    B - 1200

    C - 1400

    D - 2000

    E - 2700

     

     

     

     

     

     

    대화형 문제가 하나 있던데 이 부분은 나중에 공부를 해야할 것 같다.

    그리고 이번엔 풀은 문제들을 전부 최소 한 번씩 틀리고 제출해서 아쉬웠다.

     

     

     

     

     

     

    A. Splitting into digits

     

    n이 어떤 수 k로 나누어 떨어지고, 1<= d_k <= 9 일 때 출력하는 문제이다.

    이거는 그냥 브루트포스로 n을 i로 나누면 나누어떨어지는지 확인하고, d_i가 1이상 9이하의 수로 출력할 수 있는지 확인하면 된다.

    아니면 그냥 n으로 나누어서 1을 n번 출력하면 된다.

    def main():
        n = int(input())
        for i in range(1,n+1):
            if n % i == 0 and len(str(n//i)) == 1:
                print(i)
                print(*[n//i]*i)
                break

     

     

     

    B. Game with string

     

    두 플레이어가 문자열 가지고 게임을 하는데, 연속되는 두 문자가 있을 때마다 계속 삭제하여 상대 플레이어가 연속되는 두 문자를 더 이상 찾지 못하면 승리하는 게임이다.

     

    이 문제는 변수 i와 while문을 이용해서 연속되는 두 문자가 있으면 삭제하고, 삭제한 상태에서 또 연속되는 두 문자가 있는지 확인하는 것을 반복해주면 된다.

     

    def main():
        s = input()
        ans = 0
        i = 1
        while 1:
            if i >= len(s):break
            if s[i] == s[i-1]:
                ans += 1
                s = s[:i-1] +s[i+1:]
                if i>1: i-=1
            else: i+=1
        if ans % 2 == 1:print('Yes')
        else:print('No')

     

    if i > 1: i -= 1이 있는 이유는 예제에 있는 입력인 abba를 입력받으면 i=2에서 bb가 삭제되는데, 그럼 남은 문자열은 aa로 원래 i값에서 1을 뺀 i=1에서 탐색해야한다. 이걸 일반화시키면 다른 입력에서도 연속되는 두 문자가 나타나면 문자를 빼주고 i-=1을 해야하므로 if문을 추가하였다.

     

     

     

     

     

     

    C. Grid game

     

    이런 4 x 4 격자에 가로로 2칸을 차지하는 1x2 타일, 세로로 2칸을 차지하는 2x1 타일을 붙이는데, 세로로 한 줄이 나오거나 가로로 한줄이 나오면 해당 줄을 삭제할 수 있는 기능이 추가된 문제이다.

     

    이걸 잘 생각해보면

    빨간줄은 2x1 타일, 파란줄은 1x2 타일로 저 구역에만 할당시켜서 세로타일은 2개, 가로타일은 4개만 있으면 구역을 초기화 시킬 수 있다.

     

     

    아니면 이렇게 세로타일은 4개, 가로타일은 2개만 있으면 해당 구역을 계속 초기화 시키면서 새로 채워 넣을 수 있다.

     

    이 아이디어만 생각해냈다면 이제 구현만 하면 된다.

    코드는 첫번째 사진을 가지고 만들었다.

     

    def main():
        def clear(x):
            if D[0][x]+D[1][x]+D[2][x]+D[3][x] == 4:
                for i in range(4):D[i][x] = 0
     
        s = input()
        D = [[0]*4 for _ in range(4)]
        for i in range(len(s)):
            if s[i] == '0':
                for j,k in [[0,0],[2,0]]:
                    if D[j][k] + D[j+1][k] == 0:
                        D[j][k],D[j+1][k] = 1,1
                        print(j+1,k+1)
                        clear(0)
                        break
            else:
                for j,k in [[0,2],[1,2],[2,2],[3,2]]:
                    if D[j][k] + D[j][k+1] == 0:
                        D[j][k],D[j][k+1]=1,1
                        print(j+1,k+1)
                        clear(2);clear(3)
                        break

     

    반응형

    댓글

Designed by Tistory.