[코드트리 챌린지] 자리 수 단위로 완전탐색_연습문제 & 테스트

HKTUOHA·2023년 10월 15일
0

코드트리

목록 보기
9/15
post-thumbnail

⭐실력진단 결과



배열 내 위치 기반으로 완전탐색을 진행하는 방법에 대해 배우게 됩니다.

🟠이상한 진수 2

📌문제


📌나의 코드

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)


🟠마라톤 중간에 택시타기 2

📌문제


📌나의 코드

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)


🟢괄호 쌍 만들어주기 2

📌문제


📌나의 코드

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)


🟢인접하지 않은 2개의 숫자

📌문제


📌나의 코드

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)


🟢씨 오 더블유 2

📌문제


📌나의 코드

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)


🔴Carry 피하기 2

📌문제


📌나의 코드

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)


❌🟠오목

📌문제


📌나의 코드

🤔



🔴숨은 단어 찾기 2

📌문제


📌나의 코드

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)


❌🟠최고의 13위치 2

📌문제


📌나의 코드

🤔


✏️오답노트

두 격자를 놓기 위해 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개의 숫자를 빼는 방법이 더 효율적이다.

profile
공부 기록

0개의 댓글