알고리즘

뚝딱뚝딱·2024년 3월 16일
0

SWEA

  • 파리 퇴치(2001)
  • sol
    T = int(input())
    
    for tc in range(1, T+1):
        N, M = map(int, input().split())
        flies = [list(map(int, input().split()))for _ in range(N)]
    
        max_die = 0
    
        for i in range(N-M+1):
            for j in range(N-M+1):
                result = 0
                for k in range(i, i+M):
                    for l in range(j, j+M):
                        result += flies[k][l]
                if max_die < result:
                    max_die = result
        print(f'#{tc} {max_die}')  # 이거 출력할 때 자꾸 result출력하려구 함 max_die 출력해야지!!
    -----------------------------------------------------------------
    T = int(input())
    
    for tc in range(1, T+1):
        N, M = map(int, input().split())  # N = 배열 / M = 파리채크기
        arr = [list(map(int, input().split())) for _ in range(N)]
    
        arr_2 = []
    
        for i in range(N-M+1):
            for j in range(N-M+1):
                paris = 0
    
                for k in range(M):
                    for l in range(M):
                        paris += arr[i+k][j+l]
    
                arr_2.append(paris) # 리스트에 어펜드해서 
    
        print(f'#{tc} {max(arr_2)}')  # 최대값 출력하기 
  • min max(4828)
  • sol
    T = int(input())
    for tc in range(1, T+1):
        N = int(input())
        numbers = list(map(int, input().split()))
        max_num = numbers[0]
        min_num = numbers[0]
        for i in numbers:
            if max_num <= i:
                max_num = i
            if min_num >= i:
                min_num = i
        chi = max_num - min_num
        print(f'#{tc} {chi}')
  • 숫자 카드(4834)
  • sol
    '''
    가장 많은 카드의 숫자와 장 수를 차례로 출력
    '''
    T = int(input())
    
    for tc in range(1, T+1):
        N = int(input())
        cards = map(int, input())
        # print(cards)
        tmp = [0] * 10 # 카드 개수 체크할 배열
        for card in cards:
            tmp[card] += 1
    
        max_card = tmp[0]  # 초기값 설정
        for index in range(len(tmp)):
            if max_card <= tmp[index]:
                max_card = tmp[index]
                card_count = index
        print(f'#{tc} {card_count} {max_card}')
  • 구간합(4835) ⇒ 최소값 설정하기
  • sol
    T = int(input())
    
    for tc in range(1, T+1):
        N,M = map(int, input().split())
        numbers = list(input().split())
        # print(numbers)
    
        # max_sums = 0
        # min_sums =
    
        for i in range(N-M+1):   # i위치에서 M개의 원소를 더해서 비교해야하기 때문에 범위 -M 해주기
            sums = 0
            for j in range(M):   # 구간합 구하기위한 범위
                sums += int(numbers[i+j])  # i에서 시작하는 구간의 각 원소 sums에 더해서 구간 합 구하기
    
            if i == 0:
                max_sums,min_sums = sums, sums
            else:
                if max_sums < sums:   # 구간합이 최대값으로 설정해 둔 것보다 크면
                    max_sums = sums     # 구간합으로 최대값 변경 반복
                if min_sums > sums:   # 구간합이 최소값으로 설정해 둔 것보다 작으면
                    min_sums = sums     # 구간합으로 최소값 변경 반복
    
        result = max_sums - min_sums
        print(f'#{tc} {result}')
  • 쉬운 거스름돈(1970)
  • sol
    money = [50000, 10000, 5000, 1000, 500, 100, 50, 10]
    money_cnt = [0] * 8
    
    T = int(input())
    for tc in range(1, T+1):
        N = int(input())
        for i in range(8):
            # money의 각 금액으로 나눈 몫이
            # 그 돈을 사용할 개수가 되고
            # 나머지로 다시 또 다른 금액이 몇개 필요한지 반복해야한다
            money_cnt[i] = N // money[i]
            N %= money[i]
        print(f'#{tc}')
        print(*money_cnt)
  • 두 개의 숫자열(1959)
  • 색칠하기(4836)
  • sol
    '''
    color = 1(빨강)
    color = 2(파랑)
    '''
    T = int(input())
    for tc in range(1, T+1):
        N = int(input())
        arr = [list(map(int, input().split())) for _ in range(N)]
    
        tmp = [[0] * 10 for _ in range(10)]  # 색칠할 범위 카운트해서 입력해 둘 배열 만들기
        # print(tmp)
        # print(arr)
        for i in arr:  # 배열에서 리스트 하나씩 꺼내와진다.
            for j in range(i[0], i[2] + 1):
                for k in range(i[1], i[3] + 1):
                    if i[4] == 1:
                        tmp[j][k] += 1
                    # elif i[4] == 2:
                    #     tmp[j][k] += 2
                    else:
                        tmp[j][k] += 2
        purple = 0
        for x in range(10):
            for y in range(10):
                if tmp[x][y] == 3:
                    purple += 1
    
        print(f'#{tc} {purple}')
  • 스도쿠검증(1974)
  • sol
    T = int(input())
    N = 9
    
    # 3*3 확인할 때 쓸 델타
    di = [0,0,1,1,1,2,2,2]
    dj = [1,2,0,1,2,0,1,2]
    
    for tc in range(1, T+1):
        arr = [list(map(int, input().split())) for _ in range(N)]
    
        garo = arr # 가로는 그대로 받아와주고
    
        # 세로
     ## 참고 transpose = [list(i) for i in zip(*lst)]
    ### tmp2 = list(zip(*tmp))  # 전치행렬 # 튜플형태로 행렬이 전치됨
        # sero = list(map(list, zip(*arr))) # 전치행렬하는 방법
        sero = []
        for i in range(N):
            col = []
            for j in range(N):
                col.append(arr[j][i])
            sero.append(col)
    
        result = 1 # 조건에 안맞는일 없으면 1 출력할거다
        # 3*3 9칸 안에서
        for i in range(0, N, 3):
            for j in range(0, N, 3):
                point = arr[i][j] # 3*3 행렬의 0,0 위치를 point로 잡아주고
                for k in range(8):
                    ni = i + di[k]
                    nj = j + dj[k]
                    # if 0 <= ni < N and 0 <= nj < N:
                    point += arr[ni][nj] # 나머지 8칸을 더해준다.
    
                # point하나 정해졌을 때마다 검사하기
                for ga, se in zip(garo, sero): # 가로와 세로 배열에서 원소 하나씩 가져와서
                    # print(ga)
                    # 1-9까지의 총합이 45라서
                    if sum(ga) == sum(se) == point == 45: # 원소 내의 숫자들의 합이 45이고
                                                        # 다 더해져있는 point도 45이면
                        continue # 계속 진행시키기
                    else:  # 합이 45가 안되면
                        result = 0  # result 값을 0으로 변환시켜주기
    
        print(f'#{tc} {result}')
  • 숫자 배열 회전(1961) ⇒ 다시 풀기
  • sol
    def rotation_90(arr):
        matrix = [[0]*N for _ in range(N)]
        for i in range(N):
            for j in range(N):
                matrix[i][j] = arr[N-1-j][i]
        return matrix
    
    T = int(input())
    for tc in range(1, T+1):
        N = int(input())
        arr = [list(map(int, input().split())) for _ in range(N)]
        result = rotation_90(arr)
        result2 = rotation_90(result)
        result3 = rotation_90(result2)
        # print(result)
    
        print(f'#{tc}')
        for k in range(N):
            a = map(str, result[k])
            b = map(str, result2[k])
            c = map(str, result3[k])
            print(''.join(a), ''.join(b), ''.join(c))
  • 어디에 단어가 들어갈 수 있을까(1979)
  • sol
    '''
    흰색 부분 = 1 (단어 들어갈 수 있는 곳)
    검은색 부분 = 0  (단어 들어갈 수 없는 곳)
    
    '''
    T = int(input())
    
    # 가로 단어 먼저 탐색하기
    for tc in range(1, T+1):
        N, K = map(int, input().split()) # 퍼즐가로세로길이 / 단어의 길이
        puzzle = [list(map(int, input().split())) for _ in range(N)]
        # print(puzzle)
        words = 0  # 들어갈수 있는 단어의 개수
        # 가로로 순회하면서 흰색부분이 나오면 cnt +1 하고
        for i in range(N):
            cnt = 0  # 단어의 길이
            for j in range(N):
                if puzzle[i][j] == 1:
                    cnt += 1
                    # print(cnt)
                    # 하다가 0을 만나거나 퍼즐의 끝이나오면 멈추고
                if puzzle[i][j] == 0 or j == N-1:
                    # 그 때의 길이를 단어의 길이 K와 비교해서
                    if cnt == K:
                        # 길이가 같으면 들어갈 수 있는 단어 +1 해주기
                        words += 1
                    cnt = 0  # 카운트 다한다음에 다시 다음 단어 길이 세려면
                    #         # 초기화 다시 해줘야 하는데 자꾸 까뮤금
        # print(words,'words')
    
        for a in range(N):
            cnt2 = 0
            for b in range(N):
                if puzzle[b][a] == 1:
                    cnt2 += 1
                if puzzle[b][a] == 0 or b == N-1:
                    if cnt2 == K:
                        words += 1
                    cnt2 = 0
        print(f'#{tc} {words}')
  • View(1206) ★
  • view
    # sol_1
    for tc in range(1, T+1):
        N = int(input())  # 건물의 개수 N
        h = list(map(int, input().split())) # N개의 건물의 높이
        cnt = 0 # 세대의 수 카운트
        for i in range(2, N-1):
            max_h = h[i]  # 가운데를 기준으로 얘가 최대조망권 초기설정값이됨
            for j in range(i-2, i+3): # 양쪽 2칸씩 비교해야함
                if i == j: # 나와 나자신을 비교할 필요는 없다
                    continue # 지나가쟈
                if h[i] > h[j] and max_h > h[i]-h[j]:
                    max_h = h[i]-h[j]
                if h[i] <= h[j]:
                    break
            else:
                cnt += max_h
        print(f'#{tc} {cnt}')
    
    # sol_2
    T = 10                      # TC 10개 고정
    for tc in range(1, T+1):    # 10번 돌면서
        N = int(input())        # 가로 길이(N개의 건물)
        height = list(map(int, input().split()))   # 건물 높이 노나서 받아오기
    
        view = 0    # 초기값 설정
        for i in range(2, N-2):
            # 2 이상의 공간이 확보 되어야하니까 i-2부터 비교하기 위해서 설정
            max_v = height[i-2]
            # max_v = 0
            if max_v < height[i-1]:   # i-1과 비교
                max_v = height[i-1]
            if max_v < height[i+1]:  # i+1과 비교
                max_v = height[i+1]
            if max_v < height[i+2]:  # i+2과 비교
                max_v = height[i+2]
            # if max_v < height[i-2]:  # i-2과 비교
            #     max_v = height[i-2]       # 얘는 제거해도 됨
            if height[i] > max_v:  # i가 주변 보다 높으면
                view += height[i] - max_v
    
        print(f'#{tc} {view}')
    
    # sol_3
    T = 10
    for tc in range(1, T+1):
        N = int(input())
        lst = list(map(int, input().split()))
    
        res = 0
        for i in range(2, N-2):
            d2 = lst[i] - lst[i+1]
            d1 = lst[i] - lst[i+2]
            d_1 = lst[i] - lst[i-1]
            d_2 = lst[i] - lst[i-2]
            if d2 > 0 and d_1 > 0 and d1 > 0 and d_2 >0:
                res += min(d_2, d_1,d1,d2)
        print(f'#{tc} {res}')
  • Flatten(1208)⇒ 한번만 더
  • Flatten
    T = 10
    for tc in range(1, T+1):
        dump = int(input())
        lst = list(map(int, input().split()))
    
        for i in range(dump):
            lst.sort()
            if lst[-1] - lst[0] <= 1:
                break
            lst[0] += 1
            lst[-1] -= 1
    
        res = max(lst) - min(lst)
        print(f'#{tc} {res}')
    ---------------------------------------------------------------
    for tc in range(1, 11):
      res = 0
      dump = int(input())
      ct = list(map(int, input().split()))
      for _ in range(dump):
        max_1 = max(ct)
        min_1 = min(ct)
        # 최대, 최소 값 인덱스 받아오기
        maxIdx = ct.index(max_1)
        minIdx = ct.index(min_1)
        ct[maxIdx] -= 1
        ct[minIdx] += 1
      res = max(ct) - min(ct)
      print(f'#{tc} {res}')
    ---------------------------------------------------------------
    T = 10
    W = 100 # 가로는항상 100으로 주어짐
    
    for tc in range(1, T+1):
        dump_ = int(input()) # 덤프 횟수 제한
        boxes = list(map(int, input().split())) # 각 상자의 높이
        result = 0
        while dump_ > 0: # 덤프횟수가 소진될 때까지
            dump_ -= 1 # 한번 반복할 때마다 덤프횟수 -1
            max_idx = 0
            min_idx = 0
            # 범위설정 1부터 하는 이유는 이미 max_idx 값 초기화를 0으로 해뒀기 때문에
            # 굳이 0부터 비교하면 똑같은거끼리 비교하는거라서 1부터 하면 되는 거!!
            for i in range(1, W):
                # boxes의 몇번째인덱스위치가 최고점일까
                if boxes[max_idx] <= boxes[i]:
                    max_idx = i
                # boxes의 몇번째인덱스위치가 최저점일까
                if boxes[min_idx] >= boxes[i]:
                    min_idx = i
            # 최고점 최저점을 찾은 다음에
            if boxes[max_idx] - boxes[min_idx] <= 1:
                # 최고점과 최저점의 간격이 1보다 작거나 같아지면(평탄화 완료)
                # 최고점과 최저점의 차이를 반환하고 끝낸다.
                result = boxes[max_idx] - boxes[min_idx]
                break
            else: # 평탄화가 완료되지 않으면(아직 진행중이면)
                boxes[max_idx] -= 1 # 가장 높은 상자에서 하나 빼서
                boxes[min_idx] += 1 # 가장 낮은 상자에 하나 더해주기
    
        if dump_ == 0: # 아직 평탄화 다 못했는데 평탄화제한 횟수 다 써버리면
            min_idx = 0
            max_idx = 0
            for j in range(W): # 범위 돌면서 최고점, 최저점 찾기
                # boxes의 몇번째인덱스위치가 최고점일까
                if boxes[min_idx] > boxes[j]:
                    min_idx = j
                # boxes의 몇번째인덱스위치가 최저점일까
                if boxes[max_idx] <= boxes[j]:
                    max_idx = j
            result = boxes[max_idx] - boxes[min_idx] # 그때의 차이 출력
    
        print(f'#{tc} {result}')
    ------------------------------------------------------------------------------------T = 10
    W = 100
    
    for tc in range(1, T+1):
        dump_cnt = int(input())
        boxes = list(map(int, input().split()))
        boxes.sort()
        while dump_cnt > 0:
            dump_cnt -= 1
            boxes[-1] -= 1
            boxes[0] += 1
            boxes.sort()
    
        result = max(boxes) - min(boxes)
        print(f'#{tc} {result}')
  • 민석이의 과제 체크하기
  • Sumㅌ
  • 특별한 정렬(4843)
  • sol
    T = int(input())
    for tc in range(1, T+1):
        N = int(input())
        numbers = list(map(int, input().split()))
        # print(numbers)
        result = []
        numbers.sort()
        # print(numbers)
        while numbers:
            result.append(numbers.pop())
            result.append(numbers.pop(0))
    
        case = result[:10]
    
        print(f'#{tc}',*case)
  • Magnetic(1220) - if/elif
  • 자석
    T = 10
    
    for tc in range(1, T+1):
        N = int(input()) # 테이블의 한 변의 길이
        table = [list(map(int, input().split())) for _ in range(N)]
        # print(table)
        cnt = 0
        for i in range(N):
            flag = 0
            for j in range(N):
                if table[j][i] == 1:
                    flag = 1
                elif table[j][i] == 2 and flag == 1:
                    cnt += 1
                    flag = 0 # 다시 아무것도 안움직이는 상태로 되돌려주기
        print(f'#{tc} {cnt}')
  • 최대 성적표 만들기(4466)
  • sol
    T = int(input())
    
    for tc in range(1, T+1):
        N, K = map(int, input().split())
        scores = list(map(int, input().split()))
        # print(N,K)
        # print(scores)
        scores.sort()  # 정렬 해주고
        sum_ls = []  # 최대값 K개 넣을 리스트 만들고
        for i in range(K):
            sum_ls.append(scores.pop()) # 정렬해둿으니까 뒤에서부터 큰 수 K개
                                # pop해서 리스트에 넣어주고
        # print(sum_ls)
    
        result = 0 # 결과값 변수
        for j in range(len(sum_ls)): # 리스트에 넣은 개수만큼 반복하면서
            result += sum_ls.pop() # 결과값에 누적해서 더해주기
    
        print(f'#{tc} {result}')
  • 농작물 수확하기(2805) ⇒ 범위 문제
  • sol
    T = int(input())
    for tc in range(1, T+1):
        N = int(input())
        arr = [list(map(int, input())) for _ in range(N)]
        benefit = 0
    
        G = N//2
        for i in range(N):
            if i <= G:
                for j in range(G-i, G+i+1):
                    benefit += arr[i][j]
            else:
                for j in range(i-G, N-i+G):
                    benefit += arr[i][j]
        print(f'#{tc} {benefit}')
  • 정곤이의 단조 증가하는 수(6190)
  • 정곤이
    # sol 1
    T = int(input())
    for tc in range(1, T+1):
        N = int(input())
        numbers = list(map(int, input().split()))
        multis = []
        for i in range(N):
            for j in range(i+1, N):
                multi = numbers[i]*numbers[j]
                multis.append(str(multi))
    
        danjo = []
        for k in multis:
            LEN = len(k)
            if LEN < 2:
                continue
    
            check = True # 단조 증가하는지 체크
            for a in range(LEN-1):
                if k[a] > k[a+1]: # 앞의 자리가 뒤 자리 보다 크게 되면
                    check = False # check 변환 그러면서
                    break # 바로위 for문 탈출
            if check: # 방금 포문 아무 이상없이 한바꾸 돌았네 ?
                danjo.append(int(k)) # 그럼 dan 리스트에 i이놈 정수로 바까서 ean에 넣어줘
    
        if danjo:
            result = max(danjo)  # max doesn't work in empty list
            print(f'#{tc} {result}')
        else:
            print(f'#{tc} -1')
    ------------------------------------------------------------------------------------
    
    # sol2
    T = int(input())
    for tc in range(1, T+1):
        N = int(input())
        numbers = list(map(int, input().split()))
        multis = []
        for i in range(len(numbers)-1):
            for j in range(i+1, len(numbers)):
                multi = numbers[i]*numbers[j]
                multi_list = list(map(int, str(multi)))
                multi_len = len(multi_list)
                # print(multi_list)  # [8] / [1, 4] / [2, 0] / [2, 8] / [4, 0] / [7, 0]
                check = True
                for a in range(multi_len - 1):
                    if multi_list[a] > multi_list[a+1]:
                        check = False
                        break
                else:
                    multis.append(multi)
    
        result = int(max(multis))
        if multis:
            print(f'#{tc} {result}')
        else:
            print(f'#{tc} -1')
  • GNS(1221)
  • GNS
    numbers = ['ZRO', 'ONE', 'TWO', 'THR', 'FOR', 'FIV', 'SIX', 'SVN', 'EGT', 'NIN']
    
    T = int(input())
    for _ in range(1, T+1):
        tc, L = input().split()
        num_ls = list(input().split())
        # sort_ls = sorted(num_ls, reverse=True)
        ls = []
        N = len(num_ls)
        for i in range(N):
            ls.append(numbers.index(num_ls[i]))
    
        ls.sort()
    
        for j in range(N):
            ls[j] = numbers[ls[j]]
    
        print(tc)
        print(*ls)
  • 회문1(1215) = 외우기
  • 회문1
    T = 10
    for tc in range(1, T+1):
        K = int(input())
        N = 8
        arr = [input() for _ in range(N)]
        # print(arr)
        cnt = 0  # 회문개수 세려고
        for i in range(N):
            for j in range(N - K + 1): # 회문의 길이가 K라서
                for p in range(K // 2):# 찾아야 하는 회문길의의 절반만큼 기준잡아서
                    if arr[i][j + p] != arr[i][j + K - 1 - p]: #  가로
                        break  # for p, j부터 시작하는 구간은 회문이 아님
                else:   # for이 끝나고 실행되는 행
                        # 근데 만약 break가 실행된 상태면 이거 실행 안됨
                    cnt += 1
                for p in range(K // 2):
                    if arr[j + p][i] != arr[j + K - 1 - p][i]: # 세로
                        break  # for p, j부터 시작하는 구간은 회문이 아님
                else:
                    cnt += 1
        print(f'#{tc} {cnt}')
  • 회문2(1216)
  • 회문2
    T = 10
    N = 100
    for _ in range(1, T+1):
        tc = int(input())
        matrix = [input() for _ in range(N)]
        length = 0
        # 회문의 길이 긴것부터 가져와서 l로
        for l in range(N, 0, -1):
            for i in range(N):
                for j in range(N-l+1):
                    for k in range(l//2):
                        if matrix[i][j+k] != matrix[i][j+l-1-k]:
                            break
                    else:
                        length = max(l, length)
                    for p in range(l//2):
                        if matrix[j+p][i] != matrix[j+l-1-p][i]:
                            break
                    else:
                        length = max(l, length)
        print(f'#{tc} {length}')
    
    ====================================================================================
    T = 10
    N = 100
    
    for _ in range(1, T+1):
        tc = int(input())
        pallin = [input() for _ in range(N)]
        # print(pallin)
        long = 1
    
        for K in range(N, 0, -1): # K의 길이를 긴 것부터 뽑아와서 설정해주고
            for i in range(N):
                for j in range(N-K+1):
                    for k in range(K//2):
                        check = True
                        if pallin[i][j+k] != pallin[i][j+K-1-k]:
                            check = False
                            break
                    if check:
                        # 설정해둔 K랑 long이랑 비교해서 가장 긴 회문길이 구하기
                        long = max(long, K) 
    
                    for p in range(K//2):
                        check = True
                        if pallin[j+p][i] != pallin[j+K-1-p][i]:
                            check = False
                            break
                    if check:
                        long = max(long, K)
        print(f'#{tc} {long}')
  • 진기의 최고급 붕어빵(1860)
  • 붕어빵
    '''
    제공할 수 있으면 'Possible'
    아니라면 'Impossible'
    '''
    
    T = int(input())
    for tc in range(1, T+1):
        # N손님수, M초마다 K개 생산
        N, M, K = map(int, input().split())
        # print(N, M, K)
    
        # N명이 각각 도착하는 시간
        visited_time = list(map(int, input().split()))
        visited_time.sort()  # 도착시간 순으로 정렬
        result = 'Possible'
        for i in range(N):
            # 1초에 K//M씩 생산하니까
            # i+1 번째 손님이 방문한 시간이
            # i 번째 손님이 방문한 시간까지의 붕어빵 생산량보다 커버리면
            # 붕어빵이 없어서 제공할 수가 없으니까
            # 아래와 같이 조건문을 달아준다.
            if i+1 > visited_time[i]//M*K:
                result = 'Impossible'
                break
        print(f'#{tc} {result}')
  • 기차사이의 파리(6019)
  • sol
    T = int(input())
    for tc in range(1, T+1):
        D, A, B, F = map(int, input().split())
        # A와 B는 D/(A+B)시간이면 만난다
        time = D/(A+B)
    
        # 파리의 이동거리은 D/(A+B)를 파리의 속력이랑 곱하면 된다
        result = time*F
        print(f'#{tc} {result}')
  • Ladder1(1210)
  • ladder1 ⇒ 다시 한번 보자
    # 하, 좌, 우
    dx = [1, 0, 0]
    dy = [0, -1, 1]
    
    def search(x,y):
        #들린 지점은 1로 표시해서 다시 돌아가지 않게 만들기 위함
        visited = [[0]*100 for _ in range(100)]
        original_y = y  # 출발지점의 x좌표
        visited[x][y] = 1
    
        while x != 99:  # 마지막 행까지 갈 동안
            for k in range(3):  # 하, 좌, 우 방향 조사하면서
                ni = x + dx[k]
                nj = y + dy[k]
                # ni,nj가 범위 안에 있고 갈 수 있는 길이며, 들린적이 없으면 가야지
                if 0 <= ni < N and 0 <= nj < N and ladder[ni][nj] and visited[ni][nj] == 0:
                    x, y = ni, nj  # 그리고 거기를 기점으로 또 serch 해야함
                    visited[ni][nj] = 1   # 들렀음을 표시해주자
    
        if ladder[x][y] == 2: # 2가 적혀있는 도착점에 다다르면
            return original_y    # 출발위치의 x좌표인 y를 반환
        else:
            return "실패"
    
    T = 10
    N = 100
    for _ in range(1, T+1):
        tc = int(input())
        ladder = [list(map(int, input().split())) for _ in range(N)]
        # print(ladder)
        for i in range(N):
            if ladder[0][i] == 1:
                result = search(0, i)
            if result != "실패":
                break
    
        print(f'#{tc} {result}')
  • Ladder2(1211)
  • ladder2 ⇒ 다시 한번 보자
    # sol_1
        # 하, 좌, 우
    dx = [0, 0, 1]
    dy = [1, -1, 0]
    
    def check(x, y):
        visited = [[0] * 100 for _ in range(100)]
        original = y
        visited[x][y] = 1
        cnt = 0
        while x != 99:
            for k in range(3):
                ni = x + dx[k]
                nj = y + dy[k]
                if 0 <= ni < N and 0 <= nj < N and ladder[ni][nj] and visited[ni][nj] == 0:
                    x, y = ni, nj
                    visited[ni][nj] = 1
                    cnt += 1
                    break
        return [cnt, original]
    
    T = 10
    N = 100
    for _ in range(1, T+1):
        tc = int(input())
        ladder = [list(map(int, input().split())) for _ in range(N)]
        distance = 987654321  # 가장 짧은 이동거리를 구하기 위해 비교할 초기값 설정
        ans_y = 0   # 시작점인 x좌표 구하기 위해 비교할 초기값 설정
    
        for i in range(N):
            if ladder[0][i] == 1:  # 첫번째 행의 값이 1이면 시작지점
                dis, y_cordi = check(0, i)  # 이동거리와, 그때의 x 좌표를 반환한다
                # print(dis, y_cordi)
                if distance > dis:  # 가장 짧은 이동거리를 찾는다
                    distance = dis  # 그 때의 거리와
                    ans_y = y_cordi # 그 때의 시작점 x좌표를 구한다.
        print(f'#{tc} {ans_y}')
    ----------------------------------------------------------------------------------
    # sol_2
    # 하, 좌, 우
    dx = [0, 0, 1]
    dy = [1, -1, 0]
    
    def check(x, y):
        visited = [[0] * 100 for _ in range(100)]
        original = y
        visited[x][y] = 1
        cnt = 0
        while x != 99:
            for k in range(3):
                ni = x + dx[k]
                nj = y + dy[k]
                if 0 <= ni < N and 0 <= nj < N and ladder[ni][nj] and visited[ni][nj] == 0:
                    x, y = ni, nj
                    visited[ni][nj] = 1
                    cnt += 1
                    break
    
        return [cnt, original]  # 이동거리와,  좌표값을 리스트에 넣어서 반환한다.
    
    T = 10
    N = 100
    for _ in range(1, T + 1):
        tc = int(input())
        ladder = [list(map(int, input().split())) for _ in range(N)]
        cnt_list = []  # check 함수에서 반환되는 리스트 넣을 리스트 만들어두기
    
        for i in range(N): # N크기의 사다리라서 그 길이만큼 순회하면서
            if ladder[0][i] == 1:  # 첫번째 행의 값이 1이면 시작지점이다
                # 그때의 이동거리와, 좌표값리스트를 구하기 위한 check함수 호출 및 cnt_list에 담기
                cnt_list.append(check(0, i))
    
        cnt_list.sort()  # 기본정렬은 리스트의 리스트 첫번째 값을 기준으로 오름차순 정렬된다.
        result = cnt_list[0][1] # 정렬해뒀으니까 제일 앞에 있는 것의 이동거리가 제일 작을 것이고
                                # 그때의 x좌표를 result에 할당한다.
        print(f'#{tc} {result}')
    ----------------------------------------------------------------------------------
    # sol_3
    for tc in range(1, 11):
        input()
        MAP = [list(map(int, input().split())) for _ in range(100)]
    
        MIN = float('inf')
        res = -1
        for start in range(100):
            if MAP[0][start] == 1:
                col = start
                row = 0
                cnt = 0
    
                while row < 99:
                    cnt += 1
    
                    # 오른쪽으로 이동
                    if col < 99 and MAP[row][col+1] == 1:
                        while col < 99 and MAP[row][col+1] == 1:
                            col += 1
                            cnt += 1
                    # 왼쪽으로 이동
                    elif col > 0 and MAP[row][col-1] == 1:
                        while col > 0 and MAP[row][col-1] == 1:
                            col -= 1
                            cnt += 1
                    row += 1
                if MIN > cnt:
                    MIN = cnt
                    res = start
        print(f'#{tc} {res}')
  • 행렬찾기(1258)
  • sol
    T = int(input())
    for tc in range(1, T+1):
        n = int(input())
        arr = [list(map(int, input().split())) for _ in range(n)]
        ls = []
        for i in range(n):
            for j in range(n):
                if arr[i][j] != 0:
                    x, y = j, i
    
                    while x < n and arr[i][x] != 0:
                        x += 1
    
                    while y < n and arr[y][j] != 0:
                        y += 1
    
                    if arr[i][j] != 0:  # 요조건은 위에 이미 있어서 안해두 댐
                        ls.append((y-i, x-j))
    
                    for a in range(i, y):
                        for b in range(j, x):
                            arr[a][b] = 0
    
            ls.sort(key=lambda a: (a[0]*a[1], a[0]))
    
        print(f'#{tc}', len(ls), end=' ')
        for x,y in ls:
            print(x, y, end=' ')
        print()
  • 러시아 국기 같은 깃발(4613)
  • 러시아
    T = int(input())
    for tc in range(1, T+1):
        N, M = map(int, input().split())
        arr = [input() for _ in range(N)]
    
        mx = 0
        for i in range(N-2):
            for j in range(i+1, N-1):
                cnt = 0
                for s in range(i+1):
                    cnt += arr[s].count('W')
                for s in range(i+1, j+1):
                    cnt += arr[s].count('B')
                for s in range(j+1, N):
                    cnt += arr[s].count('R')
                mx = max(mx, cnt)
        print(f'#{tc} {N*M-mx}')


  • 상호의 배틀필드(1873)
  • 배틀필드
    import sys
    # sys.stdin = open('input.txt')
    
    T = int(input())
    
    for tc in range(1, T + 1):
        H, W = map(int, input().split())
        MAP = [list(input()) for _ in range(H)]
        N = int(input())
        comm = input()
    
        for i in range(H):
            for j in range(W):
                if MAP[i][j] in '<>^v':
                    row = i
                    col = j
                    break
    
        for i in range(len(comm)):
            t_row = row
            t_col = col
    
            if comm[i] == 'U':
                MAP[t_row][t_col] = '^'
                if t_row-1 >= 0 and MAP[t_row-1][t_col] == '.':
                    MAP[t_row-1][t_col] = '^'
                    MAP[t_row][t_col] = '.'
                    row -= 1
    
            elif comm[i] == 'R':
                MAP[t_row][t_col] = '>'
                if t_col+1 < W and MAP[t_row][t_col+1] == '.':
                    MAP[t_row][t_col+1] = '>'
                    MAP[t_row][t_col] = '.'
                    col += 1
    
            elif comm[i] == 'L':
                MAP[t_row][t_col] = '<'
                if t_col -1 >= 0 and MAP[t_row][t_col-1] == '.':
                    MAP[t_row][t_col-1] = '<'
                    MAP[t_row][t_col] = '.'
                    col -= 1
    
            elif comm[i] == 'D':
                MAP[t_row][t_col] = 'v'
                if t_row+1 < H and MAP[t_row+1][t_col] == '.':
                    MAP[t_row+1][t_col] = 'v'
                    MAP[t_row][t_col] = '.'
                    row += 1
    
            elif comm[i] == 'S':
                if MAP[t_row][t_col] == '^':
                    if t_row -1 >= 0:
                        for u in range(t_row-1, -1, -1):
                            if MAP[u][t_col] == '*':
                                MAP[u][t_col] = '.'
                                break
                            elif MAP[u][t_col] == '#':
                                break
    
                elif MAP[t_row][t_col] == '>':
                    if t_col + 1 < W:
                        for r in range(t_col + 1, W):
                            if MAP[t_row][r] == '*':
                                MAP[t_row][r] = '.'
                                break
                            elif MAP[t_row][r] == '#':
                                break
    
                elif MAP[t_row][t_col] == 'v':
                    if t_row + 1 < H:
                        for d in range(t_row +1, H):
                            if MAP[d][t_col] == '*':
                                MAP[d][t_col] = '.'
                                break
                            elif MAP[d][t_col] == '#':
                                break
    
                elif MAP[t_row][t_col] == '<':
                    if t_col - 1 >= 0:
                        for l in range(t_col - 1, -1, -1):
                            if MAP[t_row][l] == '*':
                                MAP[t_row][l] = '.'
                                break
                            elif MAP[t_row][l] == '#':
                                break
    
        print(f'#{tc} {"".join(MAP[0])}')
        for k in range(1, H):
            print("".join(MAP[k]))
  • 문제 제목 붙이기(7087) ⇒ 파이썬 제출 안됨
  • sol
    T = int(input())
    
    for tc in range(1, T+1):
        cnt = 0
        N = int(input())
        ls = []
        for _ in range(N):
            ls.append(input())
            ls.sort()
            # print(ls)
            log = 0
            for i in range(len(ls)-1):
                if log == 0:
                    if ord(ls[i][0]) == ord(ls[i+1][0]):
                        cnt += 1
                        log = 1
                    if ord(ls[i][0]) + 1 == ord(ls[i+1][0]):
                        cnt += 1
                    else:
                        break
                else:
                    if ord(ls[i][0]) + 1 == ord(ls[i+1][0]):
                        cnt += 1
                    else:
                        break
    
        print(f'#{tc} {cnt}')
  • 영준이의 카드 카운팅(4047)
  • 퍼팩트 셔플(3499)
  • 패턴 마디의 길이(2007)
  • sol
    T = int(input())
    cnt = 0 # 마디의 길이를 출력할거다
    
    for tc in range(1, T+1):
        sentence = list(input())
        # print(sentence)
        # N = len(sentence)
        madi = 0
        for i in range(1, 11):
            if sentence[:i] == sentence[i:i*2]:
                madi = i
                break
        print(f'#{tc} {madi}')
  • 간단한 369게임(1926)
  • 자기방으로 돌아가기(4408)
  • 자기방
    '''
    겹치는 만큼 기다려야하니까 가장 많이 겹치는 만큼이 최소 걸리는 시간이 되겠다!!
    '''
    
    T = int(input())
    for tc in range(1, T+1):
        N = int(input())  # 학생 수
        arr = [list(map(int, input().split())) for _ in range(N)]
    
        # for _ in range(N):
        #     go, to = map(int, input().split()) 9# 현재 방과 돌아갈 방
        #     print(go,to)
        # print(arr)
    
        cnt = [0] * 201         # 방사이 공간을 지나는 사람수를 기록할 복도
        for a, b in arr:        # arr에서 두개 꺼낼건데 a <= b라는 보장이 없음에 주의!!
                                # 복도번호 = (방번호 + 방번호%2) // 2
            a = (a + a % 2)//2
            b = (b + b % 2)//2
            for i in range(min(a, b), max(a, b)+1):  # 둘 중 작은데서 출발해서 둘중 큰곳으로 도착
                cnt[i] += 1
        print(f'#{tc} {max(cnt)}')
  • 재밌는 오셀로 게임
  • 18575
  • sol
    T = int(input())
    
    di = [-1,0,1,0]
    dj = [0,1,0,-1]
    
    for tc in range(1, T +1):
        N = int(input())
        arr = [list(map(int, input().split())) for _ in range(N)]
    
        max_sum = 0
        min_sum = 987654321
        for i in range(N):
            for j in range(N):
                point = arr[i][j]
                for k in range(4):
                    for l in range(1, N):
                        ni = i + di[k]*l
                        nj = j + dj[k]*l
                        if 0 <= ni < N and 0 <= nj < N:
                            point += arr[ni][nj]
    
                if max_sum <= point:
                    max_sum = point
                if min_sum >= point:
                    min_sum = point
        result = max_sum - min_sum
        print(f'#{tc} {result}')
  • 당근 포장하기(16811)
  • sol
    def check(N, ls): # 당근의 크기를 입력하면 모든 조건을 확인하는 프로그램
        '''
        당근 3개 => 소,중,대 상자에 든 당근의 개수 차이 = 0 소 1 중 1 대 1 씩 들어갔으니까
        당근 5개  > 소 3 중 1 대 1 = 당근의 개수 차이 2
            그런데 2개 초과하는 상자 잇으니까 조건 만족 x
        당근 8개
        '''
        L = int(N/2) # L초과하는 당근이 있으면 안됨
        ls.sort()
        min_chai = 987654321  # 포장개수차이 최소값 초기값 설정
        for i in range(N-2):
            for j in range(i+1, N-1):
                if ls[i] != ls[i+1] and ls[j] != ls[j+1]:
                    small = i+1
                    middle = j-i
                    large = N-1-j
                    if small <= L and middle <= L and large <= L:
                        if min_chai >= (max(small, middle, large) - min(small, middle, large)):
                            min_chai = max(small, middle, large) - min(small, middle, large)
        return min_chai
    
    T = int(input()) # 수확횟수
    for tc in range(1, T+1):
        N = int(input()) # 수확한 당근의 개수 3
        C = list(map(int, input().split())) # 당근의 크기 1 2 3
        # C.sort() # 당근을 크기 순으로 정렬
        # min_v = 1000 # 포장별 최소 개수 차이, 포장 불가인 경우 -1
        # for i in range(N-2):
        #     for j in range(i+1, N-1):
        #         if C[i] != C[i+1] and C[j] != C[j+1]: # 같은 크기 사이에 경계를 두면 안돼
        #             small = i + 1   # 소 상자에 들어간 당근 개수
        #             middle = j-i    # 중 상자에 들어간 당근 개수
        #             large = N-1-j   # 대 상자에 들어간 당근 개수
        #             if 0 < small <= N//2 and 0 < middle <= N//2 and 0 < large <= N//2:
        #                 if min_v > (max(small, middle, large) - min(small, middle, large)):
        #                     min_v = max(small, middle, large) - min(small, middle, large)
        res = check(N,C)
        if res == 987654321:
            print(f'#{tc} -1')
        else:
            print(f'#{tc} {res}')

백준

  • 스위치켜고끄기
  • 주사위_쌓기
  • 창고_다각형
  • 일곱_난쟁이(2309)
  • 난쟁이
    K = 100
    S = 0
    ls = []
    for i in range(9):
        ls.append(int(input()))
    
    S = sum(ls)
    find = S - K
    ls.sort()
    a = 0
    b = 0
    
    N = len(ls)
    for j in range(N-1):
        for k in range(j+1, N):
            if ls[j] + ls[k] == find:
                a = ls[j]
                b = ls[k]
                # print(a, b) = 15, 25
                # print(type(a)) -> int
    
    for f in ls:
        if f != a and f != b:
            print(f)
  • 참외밭
  • 직사각형
  • 2527
  • 직사각형을 만드는 방법
  • 8320
    N = int(input())
    
    # [1] 가능한 경우를 모두 순회
    ans = 0
    for i in range(1, N+1):
        for j in range(i, N+1):
            if i*j <= N:
                ans += 1
    print(ans)
    
    # [2] 몫 연산을 통해서 처리
    ans = N
    for i in range(2, N):
        n = N // i - (i-1)
        if n < 1:
            break
        ans += n
    print(ans)
  • 수열
  • 2559
    # N = 온도측정한 전체 날짜의 수, K = 합구하기 위한 연속적인 날짜의 수
    N, K = map(int, input().split())
    degrees = list(map(int, input().split())) # 매일 측정한 온도
    result = [] # 온도의 합을 구해서 넣어둘 리스트
    result.append(sum(degrees[0:K])) # 0번째부터 K-1번째까지 먼저 합해서 넣어준다음
    for i in range(N-K): # K개만큼 더해야하니까 인덱스 번호 N에서 K 빼준 범위로 설정
       result.append(result[i]-degrees[i]+degrees[i+K])
       # 더한거에서 젤 앞에꺼 빼고 그다음 하나 더해주기(한칸씩 뒤로 가는겨)
    print(max(result)) # 리스트에 넣어둔 것들 중 가장 큰값 프린트 하기
  • 색종이(2563)
  • 색종이
    N = int(input())
    
    matrix = [[0]*102 for _ in range(102)] # 색종이 표시할 배열
    
    for _ in range(N):
        a, b = map(int, input().split())
        for i in range(a,a+10):
            for j in range(b, b+10):
                matrix[i][j] = 1
    
    result = 0
    for k in matrix:
        result += sum(k)  # matrix 안의 k리스트들의 합을 result에 누적시켜 더해주면
                            # 넓이(1로 채워져 있는 곳)이 나온다
    print(result)
  • 색종이(10163)
  • 10163
    def count(arr):
        cnt = 0
        for ls in arr:
            for k in range(1, len(ls)):
                if ls[k-1] != ls[k]:
                    cnt += 1
        return cnt
    
    N = int(input())
    tmp = [[0]*102 for _ in range(102)]
    for _ in range(N):
        a, b = map(int, input().split())
        for i in range(a, a+10):
            for j in range(b, b+10):
                tmp[i][j] = 1
    
    # tmp2 = list(zip(*tmp))  # 전치행렬 # 튜플형태로 행렬이 전치됨
    tmp2 = list(map(list, zip(*tmp)))  # 수정 필요할 시의 전치행렬 # 리스트 형태로 전치됨
    
    result = count(tmp) + count(tmp2)
    print(result)
  • 경비원
  • 빙고
  • 줄_세우기
  • 2605
    N = int(input()) # 학생의 수
    numbers = list(map(int, input().split()))
    alst = [n for n in range(1, N+1)]
    # print(alst) # [1, 2, 3, 4, 5]
    
    for i in range(N): # i위치의 학생을 순서대로 이동처리
        n, t = numbers[i], alst[i] # 앞으로 이동할 칸 수, 학생번호
        # 순차적으로 덮어씌우기
        # 나한테 전에꺼를 집어넣기
        # 끝난다음에는 alst[i-n]번째에 t 넣어주기
        for j in range(i, i-n, -1):
            alst[j] = alst[j-1]
        alst[i-n] = t
    print(*alst)
  • 10431
    P = int(input())
    for tc in range(1, P+1):
        lst = list(map(int, input().split()))[1:]
        cnt = 0
        for i in range(1, 20):
            for j in range(i): # i의 이전 값들을 비교할것
                if lst[i] < lst[j]: # 더 큰애들이 앞에 서있으면
                    cnt += 1 # 카운트 증가
    
        print(f'{tc} {cnt}')
  • 종이자르기
  • 2628 - idea
    '''
    가장 큰 종이 조각의 넓이 ?
    바깥 둘레에서 잘라야하는 열과 행의 번호를
    각각 리스트에 담아서
    자르면 나오는 길이가지고
    가장 긴 길이 두개 곱하면 가장 큰 색종이 넓이 구할 수 있음 
    '''
    # 종이의 가로, 세로
    W, H = map(int, input().split())
    # [1] 가능한 가로/세로 자르는 위치를 저장 후 정렬
    w_ls = [0, H]
    h_ls = [0, W]
    N = int(input()) # 잘라야 하는 점선의 개수
    
    for _ in range(N):
        t, n = map(int, input().split())
        if t == 0:
            w_ls.append(n)
        else:
            h_ls.append(n)
    w_ls.sort()
    h_ls.sort()
    # print(w_ls)
    # [2] 가장 긴 길이 찾기
    w_mx = 0
    for i in range(1, len(w_ls)):
        w_mx = max(w_mx, w_ls[i] - w_ls[i-1])
    
    h_mx = 0
    for i in range(1, len(h_ls)):
        h_mx = max(h_mx, h_ls[i] - h_ls[i-1])
    
    print(w_mx*h_mx)
  • 수_이어가기
  • 직사각형네개의합집합의면적구하기
  • 2669
    arr = [[0]*102 for _ in range(102)]
    for _ in range(4):
        a, b, c, d = map(int, input().split())
        for i in range(b, d):
            for j in range(a, c):
                arr[i][j] = 1
    cnt = 0
    for k in range(102):
        for l in range(102):
            if arr[k][l] == 1:
                cnt += 1
    
    print(cnt)
  • 자리배정
  • 10157
    C, R = map(int, input().split())
    K = int(input())
    
    if R*C < K: # 배정이 불가능한 경우 0
        print(0)
    else: # 배정하면서 K가 되면 그 때 좌표 출력
        di, dj = [1, 0, -1, 0], [0, 1, 0, -1]
        # 주변을 1로 둘러싸면 : 범위체크 필요없음
        arr = [[1]*(C+2)] + [[1] + [0]*C + [1] for _ in range(R)] + [[1]*(C+2)]
    
        ci, cj, dr = 1, 1, 0
        for n in range(1, K):
            arr[ci][cj] = n
            ni, nj = ci + di[dr] , cj + dj[dr]
            if arr[ni][nj] == 0: # 비어있으니 이동가능
                ci, cj = ni, nj
            else:   # 범위밖 또는 이미 채워진경우
                dr = (dr+1)% 4
                ci, cj = ci+di[dr], cj+dj[dr]
        print(f'{cj} {ci}')
  • 개미
  • 방_배정
  • 13300
    '''
    여학생 = 0
    남학생 = 1
    '''
    def count(arr):
        grade = [0] * 7  # 학년 별로 몇명인지 세보자
        # ls = [] #
        for i in arr:   # 성별로 구분해서 학년만 넣어둔 리스트를 순회하면서
            grade[i] += 1 # 그 학년을 인덱스번호로 활용해서 cnt 증가시켜주기
            # print(grade)
        result = 0 # 방 몇개필요한지 구할 결과값변수 초기화
        for k in grade: # 학년별로 몇명인지 누적해서 구해둔 grade리스트 순회하면서
            if k % K == 0:  # 한방에 배정할 수 있는 최대 인원수로 나눈 값이 딱 떨어지면
                result += k//K  # 그 나눗셈 몫만큼의 방을 더해주면 됨
                # print(result)
            else:   # 안나눠 떨어지면 그 안나눠 떨어진 사람을 위해서
                result += k//K + 1  # 방 하나 추가 배정해 주면 됨
        return result # 누적된 방이 몇 개 필요한지에 대한 result값 반환하기
    
    # N = 수학여행에 참가하는 학생 수
    # K = 한 방에 배정할 수 있는 최대 인원 수
    N, K = map(int, input().split())
    cnt_S0 = []
    cnt_S1 = []
    
    for _ in range(N):
        S, Y = map(int, input().split())  # 성별 S / 학년 Y
        # print(S, Y)
        if S == 1: # 성별 1일경우
            # cnt_S1.append([S, Y]) # 의 성별과 학년 넣어주기
            cnt_S1.append(Y) # 아니지, 학년만 넣어주자 성별은 노났으니까
        elif S == 0: # 성별 2일경우
            # cnt_S0.append([S, Y])
            cnt_S0.append(Y)
    
    a = count(cnt_S1) # 성별 남자일 경우의 필요 방개수
    # print(a)
    b = count(cnt_S0)   # 성별 여자일 경우의 필요한 방개수
    ans = a+b # 더해서 결과값
    print(ans)
    
    '''
    print(cnt_S0)
    print(cnt_S1)
    [1, 2, 2, 3, 6, 5] # 성별 여자인 경우의 학년
    [1, 1, 2, 3, 4, 3, 3, 5, 5, 6] # 성별 남자인 경우의 학년'''
  • 딱지놀이
  • 14696
    N = int(input())  # 딱지놀이의 총 라운드 수
    for _ in range(N):
        A = list(input().split())
        B = list(input().split())
        a_len = int(A[0])
        b_len = int(B[0])
        a_ls = A[1:]
        b_ls = B[1:]
    
        # 인덱스 이용해서 카운트 해주자(1,2,3,4 입력해주기위해서 *5)
        one_cnt = [0] * 5
        two_cnt = [0] * 5
    
        for i in range(a_len):
            one_cnt[int(a_ls[i])] += 1
        for j in range(b_len):
            two_cnt[int(b_ls[j])] += 1
    
        # 4,3,2,1 역순 순회하면서 누가 이기는지 판단하기
        result = ''
        for k in range(4, 0, -1):
            if one_cnt[k] > two_cnt[k]:
                result = 'A'
                break
            elif one_cnt[k] < two_cnt[k]:
                result = 'B'
                break
            else:
                result = 'D'
        print(result)
profile
나의 행복 만들기

0개의 댓글