List2

SOYOUNG·2021년 3월 8일
0

알고리즘 기본

목록 보기
2/5

이차원 리스트

swea4836 색칠하기

T = int(input())
for tc in range(1, T+1):
    N = int(input())
    co_plane = [[0] * 10 for _ in range(10)] # 평면좌표
    color = []
    cnt = 0 # 전체 좌표 에서 cnt 구해야 하니까 cnt 초기화는 여기서 !!
    for i in range(N):
        color.append(list(map(int, input().split())))

        for j in range(color[i][0], color[i][2] + 1): # x 좌표
            for k in range(color[i][1], color[i][3] + 1): # y 좌표
                if color[i][4] == 1: # 빨강이면
                    co_plane[j][k] += 1

                elif color[i][4] == 2: # 파랑이면
                    co_plane[j][k] += 10

                if co_plane[j][k] % 11 == 0:
                    cnt += 1


    print('#{} {}'.format(tc, cnt))

swea4839 이진탐색

def bi_search(lst,key):
 left = 0
 right = len(lst)-1
 cnt = 0
 while left <= right:
     middle = (left+right)//2
     if lst[middle] == key:
         break
     elif key < lst[middle]: # if 말고 elif ! 아니라면 이어야 하니까
         right = middle
         cnt += 1
     elif key > lst[middle]:
         left = middle
         cnt += 1
 return cnt

T = int(input())
for tc in range(1, T+1):
 P, Pa, Pb = map(int, input().split())

 book = [0] * P
 for i in range(0, P):
     book[i] = i+1

 if bi_search(book, Pa) < bi_search(book, Pb):
     ans = 'A'
 if bi_search(book, Pa) == bi_search(book, Pb):
     ans = 0
 if bi_search(book, Pa) > bi_search(book, Pb):
     ans = 'B'


 print('#{} {}'.format(tc, ans))

swea4837 부분집합의 합

def get_sum(lst):
 total = 0
 for i in range(len(lst)):
     total += lst[i]
 return total

T = int(input())
A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

for tc in range(1, T+1):
 N, K = map(int, input().split())
 cnt = 0
 for i in range(1 << len(A)):
     arr = []

     for j in range(len(A)):
         if i & (1 << j):
             subset = A[j]
             arr.append(subset)  # arr 은 부분집합

     if len(arr) == N and get_sum(arr) == K: # 부분집합 중 N개의 원소 갖고 있고 합이 K 이면
             cnt += 1

 print('#{} {}'.format(tc, cnt))

비트연산 잘 기억하기!!

swea4838 특별한 정렬

T = int(input())
for tc in range(1, T+1):
 N = int(input())
 lst = list(map(int, input().split()))
 # 정렬
 for i in range(len(lst)-1):
     min_idx = i
     for j in range(i+1, len(lst)):
         if lst[j] < lst[min_idx]:
             min_idx = j
     tmp = lst[i]
     lst[i] = lst[min_idx]
     lst[min_idx] = tmp

 ans = [0] * len(lst)
 for i in range(len(lst)):
     if i % 2: # 홀수 인덱스에 lst 인덱스 0, 1, 2 이순서로 온다.
         ans[i] = lst[i//2]

     elif i % 2 == 0: # 짝수 인덱스에는 list 인덱스의 len(lst)-1, len(lst)-2, len(lst)-3 이순서로 온다.
         ans[i] = lst[len(lst)-(i//2+1)]

 print('#{}'.format(tc), *ans[:10]) # 10개만 출력하라는 문제이므로.

swea1979 어디에 단어가 들어갈 수 있을까

  • D2이지만 어렵게 느껴졌다..
  • 처음에 1 이면 하나씩 카운팅 하고 그게 K가 되면 cnt += 1 씩 하는걸로 하려고 했는데 반례가 너무 많았다.
  • 그래서 일단 인덱스 오류가 나지 않도록 표 테두리를 벽으로 감싸줬다.
  • 그리고 세로 구할때 인덱스로 구하려고 하다가 결국 세로 리스트를 새로 만들었다 ^-^
T = int(input())
for tc in range(1, T + 1):
    N, K = map(int, input().split())
    puzzle = [[0] * (N+2)] + [[0] + list(map(int, input().split())) + [0] for _ in range(N)] + [[0] * (N+2)]# 인덱스 에러나는거 막기 위해 테두리 감싸기
    # print(puzzle)
    # 가로
    cnt1 = 0

    for i in range(1, N+1):
        for j in range(1, N+1-K+1):
            if puzzle[i][j:j+K] == [1] * K and puzzle[i][j-1] == 0 and puzzle[i][j+K] == 0:
                cnt1 += 1

    # 세로(얘는 리스트형식 아니니까 슬라이싱으로 못구함)
    # 세로 이차원 리스트 새로 만들기..
    sero = []
    for j in range(N+2):
        for i in range(N+2):
            sero.append(puzzle[i][j])

    # (N+2) * (N+2) 로 쪼개기
    sero_lst = [sero[(N+2)*i:(N+2)*i+(N+2)] for i in range(N+2)]

    cnt2 = 0
    for i in range(N+2):
        for j in range(N+2):
            if sero_lst[i][j:j+K] == [1] * K and sero_lst[i][j-1] == 0 and sero_lst[i][j+K] == 0:
                cnt2 += 1

    print('#{} {}'.format(tc, cnt1+cnt2))

d2인데 오래걸려서 속상했다. 근데 지금보니까 왜저렇게 어렵게 풀었나 싶다.

swea20014 파리퇴지

def get_sum(lst):
  total = 0
  for i in range(len(lst)):
      total += lst[i]
  return total

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)]
  ss = []
  s = []
  maxx = -987654321

  for i in range(N-M+1):
      for j in range(N-M+1):
          for k in range(M):
              for l in range(M):
                  s.append(flies[j+k][i+l]) # 쭉 나열 된 리스트
  # print(s)
  for i in range(len(s)//M):
      ch_ = s[i+(M*M-1)*i:i+(M*M-1)*i+M*M] # M*M 개 씩 쪼개기

      if maxx <get_sum(ch_):
          maxx = get_sum(ch_)


  print('#{} {}'.format(tc, maxx))
  ```
  
profile
개발자 꿈나무

0개의 댓글