배열 내 위치 기반으로 완전탐색을 진행하는 방법에 대해 배우게 됩니다.
a = list(input())
n = len(a)
# 0이 있을 때
if '0' in a:
for i in range(n):
if a[i] == '0':
a[i] = '1'
break
# 0이 없을 때
else:
a[-1] = '0'
answer = 0
for i in range(n):
answer += int(a[i]) * (2 ** ((n - 1) - i))
print(answer)
import sys
INI_MAX = sys.maxsize
# 거리 계산 함수
def dist(x1, y1, x2, y2):
return abs(x1 - x2) + abs(y1 - y2)
n = int(input())
# 체크포인트 리스트
points = []
for _ in range(n):
x, y = map(int, input().split())
points.append((x, y))
ans = INI_MAX
for i in range(1, n - 1):
# 거리의 합
total = 0
# 건너 뛸 포인트 좌표와 인덱스 저장 후 삭제
tmp_point, tmp_index = points[i], points.index(points[i])
points.remove(tmp_point)
# 모든 포인트들 간의 거리 합 구하기, 포인트를 하나 건너 뛰었으므로 n - 2까지 확인
for j in range(n - 2):
total += dist(points[j][0], points[j][1], points[j + 1][0], points[j + 1][1])
ans = min(ans, total)
# 건너 뛰었던 포인트 원래대로 놓려놓기
points.insert(tmp_index, tmp_point)
print(ans)
import sys
INI_MAX = sys.maxsize
from collections import deque
n = int(input())
personnel = deque([int(input()) for _ in range(n)])
ans = INI_MAX
for i in range(n):
dist = 0
for j in range(1, n):
dist += personnel[j] * j
personnel.rotate(-1)
ans = min(ans, dist)
print(ans)
A = input()
ans = 0
for i in range(len(A) - 1):
for j in range(i + 2, len(A) - 1):
if A[i : i + 2] == '((':
if A[j : j + 2] == '))':
ans += 1
print(ans)
n = int(input())
nums = list(map(int, input().split()))
INI_MIN = -10e9
ans = INI_MIN
for i in range(n):
# 인접하지 않으므로 2칸 떨어진 곳부터 더함
for j in range(i + 2, n):
sum_num = 0
sum_num = nums[i] + nums[j]
# 최댓값과 현재 값을 비교하여 최댓값 갱신
ans = max(ans, sum_num)
print(ans)
n = int(input())
string = input()
cnt = 0
for i in range(n - 2):
for j in range(i + 1, n - 1):
for k in range(j + 1, n):
if string[i] == 'C' and string[j] == 'O' and string[k] == 'W':
cnt += 1
print(cnt)
n = int(input())
nums = [input() for _ in range(n)]
def extend_num(num):
return '0' * (max_len - len(num)) + num
not_carry = -10e9
for i in range(n - 2):
for j in range(i + 1, n - 1):
for k in range(j + 1, n):
sum_of_digits = ''
# 숫자의 최대 길이 찾기
max_num = max(int(nums[i]), int(nums[j]), int(nums[k]))
max_len = len(str(max_num))
# 숫자 확장하기
num1, num2, num3 = extend_num(nums[i]), extend_num(nums[j]), \
extend_num(nums[k])
# 각 자리수 더하기
for d in range(max_len):
each_digit = int(num1[d]) + int(num2[d]) + int(num3[d])
# 자릿수 합이 10 이상이면 자릿수 합 초기화 후 다음 조합으로
if each_digit >= 10:
sum_of_digits = ''
break
sum_of_digits += str(each_digit)
if sum_of_digits and not_carry < int(sum_of_digits):
not_carry = int(sum_of_digits)
if not_carry < 0:
print(-1)
else:
print(not_carry)
🤔
n, m = map(int, input().split())
strings = [input() for _ in range(n)]
# 왼아, 왼, 왼위, 위, 오위, 오, 오아, 아
dxs, dys = [1, 0, -1, -1, -1, 0, 1, 1], [-1, -1, -1, 0, 1, 1, 1, 0]
def in_range(x, y):
return 0 <= x and x < n and 0 <= y and y < m
# LEE 개수
num_of_LEE = 0
for i in range(n):
for j in range(m):
# L부터 시작이므로 L이 아니면 다음 위치로
if strings[i][j] != 'L':
continue
for dx, dy in zip(dxs, dys):
# 문자열 LEE 확인 리스트
check_LEE = []
# 현재 위치
curx = i
cury = j
# 확인 리스트에 L 추가, (i, j)는 확인용
# check_LEE.append(((i, j), 'L'))
check_LEE.append('L')
while True:
nx = curx + dx
ny = cury + dy
# 다음 위치가 격자를 벗어나면 break
if not in_range(nx, ny):
break
# 다음 문자가 E일 때 확인 리스트에 E 추가
if strings[nx][ny] == 'E':
# check_LEE.append(((nx, ny), 'E'))
check_LEE.append('E')
# print(check_LEE)
# 확인 리스트 길이가 3이면 LEE로 판단, LEE 개수 증가
if len(check_LEE) == 3:
num_of_LEE += 1
break
# 다음 문자가 E가 아니면 break
else:
break
# 현재 위치 갱신
curx = nx
cury = ny
print(num_of_LEE)
🤔
두 격자를 놓기 위해 4개의 for문과 변수를 사용하는 것까지는 했지만, 격자가 같은 행에서 겹치지 않는 경우를 생각하지 못함
# 두 격자가 겹치는 경우에는 패스
# 격자가 같은 줄에 있을 수 있으니 j와 l의 차가 3보다 작으면 겹치는 것
if i == k and abs(j - l) <= 2:
continue
n, s = map(int, input().split())
nums = list(map(int, input().split()))
ans = 10e9
for i in range(n):
for j in range(i + 1, n):
# 2개의 숫자 따로 저장 후 0으로 초기화
a, b = nums[i], nums[j]
nums[i], nums[j] = 0, 0
# 남은 nums 합과 s의 차이 중 최솟값 찾기
ans = min(ans, abs(s - sum(nums)))
# 제외된 숫자 원래대로
nums[i], nums[j] = a, b
print(ans)
배열 값의 총합을 구한 후 2개의 숫자를 빼는 방법이 더 효율적이다.