728x90
반응형

코딩테스트 11

[Baekjoon 6603 / Python / 실버2] 로또

기본적인 백트래킹 문제이다.주어진 집합에서 6개 숫자의 조합(순서가 다른 같은 숫자를 중복으로 간주)을 구해야 한다. # 실버2 -> 백트래킹import sysinput = sys.stdin.readlinedef back_tracking(depth, start, result):    # 6개의 숫자가 모이면 출력    if depth == 6:        print(*result)        return        for i in range(start, len(S)):        result.append(S[i])        back_tracking(depth + 1, i + 1, result)        result.pop()while True:    K, *S = map(int, input..

[Baekjoon 11660 / python / 실버1] 구간 합 구하기 5

누적 합, DP 문제이다.2차원 리스트를 사용하기 때문에 단일 리스트보단 조금 더 복잡하다. # 실버1 -> 누적 합"""N : 표의 크기M : 합을 구해야 하는 횟수"""import sysinput = sys.stdin.readlineN, M = map(int, input().split())origin = [list(map(int, input().split())) for _ in range(N)]# dp(누적 합)테이블 생성dp = [[0] * (N + 1) for _ in range(N + 1)]for i in range(1, N + 1):    for j in range(1, N + 1):        dp[i][j] = origin[i-1][j-1] + dp[i][j-1] + dp[i-1][j] ..

[Baekjoon 2531 / python / 실버1] 회전 초밥

투 포인터 문제이다.근데 해결방법 고민 하는데 시간복잡도도 그렇고 그냥 구현해도 될 거 같아서 해봤는데 풀려버렸다... 결론은 투 포인터 안 쓰고 그냥 구현으로 풀었다. # 실버1 -> 투 포인터"""N : 회전 초밥 벨트에 놓인 접시의 수D : 초밥의 가짓수(초밥 최대 번호)K : 연속해서 먹어야 하는 접시의 수C : 쿠폰으로 먹을 수 있는 초밥 번호"""import sysinput = sys.stdin.readlineN, D, K, C = map(int, input().split())sushi = [int(input()) for _ in range(N)]count = 0for start in range(N):        choice = [sushi[(start + i) % N] for i in ra..

[Baekjoon 1780 / python / 실버2] 종이의 개수

무난한 분할 정복 문제이다. 재귀함수가 사용된다. # 실버2 -> 분할 정복, 재귀"""N : 1 또는 3의 k승-1, 0, 1 로 이루어진 N * N 행렬하나의 수로 이루어져 있지 않다면 9개로 분할분할을 마친 후, 각 숫자로 이루어진 종이가 몇개인지 출력"""import sysinput = sys.stdin.readlineN = int(input())table = [list(map(int, input().split())) for _ in range(N)]minus, zero, plus = 0, 0, 0def divide(x, y, n):    global minus, zero, plus    prev = table[x][y] # 기준이 될 숫자 설정    for i in range(x, x + n):..

[Baekjoon 1654 / Python / 실버2] 랜선 자르기

이분 탐색 문제이다. 늘 결과 도출 부분에서 묘하게 헷갈린다. # 실버2 -> 이분 탐색"""K : 이미 가지고 있는 랜선의 개수N : 만들어야 할 랜선의 개수data[] : K개 랜선 리스트start : 1 -> 랜선 최소 길이end : max(data) -> 랜선 최대 길이- 랜선 길이를 기준으로 이분 탐색 실시- 반복할 때 마다 조건 검사    -> 해당 길이로 N개 랜선 제작이 가능한지    -> 모든 랜선을 일일이 길이로 나눠 총 랜선 개수 세기- 최대값을 찾아야 하므로 end 출력"""import sysinput = sys.stdin.readlineK, N = map(int, input().split())data = [int(input()) for _ in range(K)]start = 1en..

[Baekjoon 9465 / Python / 실버1] 스티커

DP 문제이다. 언제나 어렵고 새롭고 가장 싫어하는 알고리즘이다. # 실버1 -> DPimport sysinput = sys.stdin.readline# 테스트 케이스 개수T = int(input())for _ in range(T):    N = int(input()) # 스티커 길이    sticker = []    sticker.append(list(map(int, input().split())))    sticker.append(list(map(int, input().split())))    if N == 1:        print(max(sticker[0][0], sticker[1][0]))        continue    dp = [[0] * (N + 1) for _ in range(3)] ..

[Baekjoon 1987 / Python / 골드4] 알파벳

DFS, 백트래킹 문제이다. 상하좌우 탐색을 요하기 때문에 BFS로도 잠시 생각했었으나 백트래킹이 필요했기에 DFS로 진행했다. 어느정도 정석에 가까운 백트래킹 문제 같다. # DFS, 백트래킹import sysinput = sys.stdin.readline# 입력받기R, C = map(int, input().split())board = []for _ in range(R):    board.append(list(input().strip()))# 사전준비directions = [[-1, 0], [1, 0], [0, -1], [0, 1]]visited = [[False] * C for _ in range(R)]visited[0][0] = Truepath = set() # 집합으로 불필요한 중복 알파벳이 들어..

[Baekjoon 2138 / Python / 골드4] 전구와 스위치

그리디 문제이다. 문제는 간단한데 해결 방법이 도저히 떠오르질 않았다. 한번에 3개의 전구가 바뀌니까 엄청나게 많은 경우의 수가 있을 것이라 생각했고, 아무리 생각해도 답을 도출할 방법이 떠오르질 않아서 다른 코드를 참고했다. 근데 참고해도 이해가 잘 안된다. 이 코드가 어째서 정답을 도출하는지. 이론적으론 이해했지만 와닿지가 않는다.# 그리디import sysinput = sys.stdin.readlineN = int(input())origin = list(map(int, input().strip()))target = list(map(int, input().strip()))# 1번 인덱스 전구부터 하나씩 누를지 말지 결정하는 함수def solve(A, B):    press = 0    for i in..

Algorithm/Greedy 2024.09.26

[프로그래머스 / Python] 배열 회전시키기

def solution(numbers, direction) : if direction == 'right' : temp = numbers[-1] numbers[1:] = numbers[0:-1] numbers[0] = temp else : temp = numbers[0] numbers[0:-1] = numbers[1:] numbers[-1] = temp return numbers 정답 코드 'right'일 경우, 소실될 맨 마지막 요소[-1]를 temp 변수에 저장해둔 후 모든 요소를 오른쪽으로 밀어준다. 그리고 저장해둔 temp 값을 [0] 위치에 할당한다. 'left'는 right와 반대로 실시한다.

728x90
반응형