always_here

지식을 공유하고 함께 성장하는 엔지니어 as_always 입니다

AS_ALWAYS

알고리즘

구름톤 챌린지 Day06 - Day08 [완전탐색]

nauung_always 2023. 8. 31. 23:54
728x90

[ 문제 6 ]

from itertools import combinations
N = int(input())
S = input()

P = set()

blank = [i for i in range(1, N)]
com = list(combinations(blank, 2))

for f, s in com:
    P.update([S[:f], S[f:s], S[s:]])

p = list(P)
p.sort()

result = 0
for f, s in com:
    tmp = 0
    tmp += p.index(S[:f]) + 1
    tmp += p.index(S[f:s]) + 1
    tmp += p.index(S[s:]) + 1
    result = max(result, tmp)

print(result)

물론, 이중 for문을 사용해서 부분 문자열 3개를 반복해서 추가해주는 방법도 있으나, 이중 for문 외의 방법을 사용하고 싶었다. combination을 사용해서 부분문자열을 3개로 나누기 위해서는, 문자를 뽑는 것이 아니라 2개의 공백 인덱스를 뽑아 3개의 부분 문자열로 나누면 된다 !

먼저, 부분 문자열 집합을 나타내기 위해 set() 에 데이터를 추가했다.
set 집합 자료형 특징 : 중복을 허용하지 않는다, 순서가 없다
1. 문자열 하나씩 추가 : add  -> P.add(S[:f]) P.add(S[f:s]) P.add(S[s:])
2. 문자열 여러개 한번에 추가 : update -> P.update([S[:f], S[f:s], S[s:]])

set에 추가된 문자열 정렬하기 위해서 먼저 list로 변환해준 후 ! 정렬
각각의 index 뽑아서 마무리했다.

[ 문제 7 ]

N, K = map(int, input().split())

matrix = []
for _ in range(N):
    matrix.append(list(map(int, input().split())))

dx = [-1, 1, 0, 0, -1, -1, 1, 1]
dy = [0, 0, 1, -1, -1, 1, 1, -1]

answer = 0
for i in range(N):
    for j in range(N):
        cnt = 0
        if matrix[i][j] == 0:
            for k in range(8):
                if (0 <= i + dx[k] < N) and (0 <= j + dy[k] < N) and (matrix[i+dx[k]][j+dy[k]] == 1) :
                    cnt += 1
            if cnt == K:
                answer += 1
print(answer)

상하좌우 대각선까지 확인하기 위해서 dx, dy를 위와 같은 배열로 구현했다. 
상하좌우 대각선 범위가 N X N 행렬 안에 존재하는 값들에 대해서 아래 조건 식을 확인해주고찾고 싶은 값과 동일한 값의 개수를 세어 출력했다. 

[ 문제 8 ]

N = int(input())

band = 1
medi = 7
pain = 14

items = [pain, medi, band]
cnt = 0

for item in items:
    cnt += N // item
    N = N % item
    if N == 0:
        break
print(cnt)

가장 큰 값 순으로 나눠주면서 진행했다. 이를 통해 최소 개수를 구할 수 있다. 

728x90