파이썬

PS/백준

[백준] 2589 - 보물섬

2589번: 보물섬 보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서 www.acmicpc.net ✏️ 풀이 가장 먼 거리를 구하는것이 이 문제의 핵심이였다. 하지만 한 지점에서만 구하는 것이 아니라 L있는 부분에서 가장 먼거리라서 2중 for문을 통해서 브루트 포스를 통해서 모든 거리를 구해 그중에 가장 먼 거리를 출력하는 것이다. 이번 문제는 c++를 익히기 위해서 두가지 언어로 풀었다. 처음에는 파이썬으로 풀어서 해결방법을 찾고, 그걸 바탕으로 c++을 이용해서 코드를 작성했다. 💻 코드 import sys from collections import deq..

PS/백준

[백준] 5430 - AC

5430번: AC 각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다. www.acmicpc.net ✏️ 풀이 첫 번째 풀이 처음 문제를 풀었을 때, 마지막에 D, 0, [] 입력이 주어진 경우를 제대로 하지 않아서 Value error가 발생했다. 두 번째 풀이 RR이 나온경우에는 배열이 그대로라서 문자열 메서드의 replace를 통해서 RR을 지우고, 반복문을 통해서 진행을 했다. 그런데 생각해보니 replace의 시간 복잡도를 몰랐는데, n보다 더 많이 걸려서 그냥 반복문으로 처리했다. 결국 문제에서 주어진 R, D연산을 반복문을 통해서 진행했다. 뭔가 문제에서 이걸 원하는게 아닐거 같은데?라는 생각과 함께 ..

PS/백준

[백준] 25418 - 정수 a를 k로 만들기

25418번: 정수 a를 k로 만들기 7(A), 8(연산 1), 9(연산 1), 18(연산 2), 19(연산 1), 38(연산 2), 76(연산 2), 77(연산 1)이 최소 연산이므로 정답은 7이다. www.acmicpc.net ✏️ 풀이 입력으로 a, k가 주어지는데 그냥 a를 k로 만드는 최소 연산 횟수를 출력하는 것이다. 최소, 최단 이런 단어가 보이면 이제는 바로 BFS로 풀면 되겠다는 생각을 한다. 뭐 아닐 수 도 있겠지만, 그건 많이 풀어보면 BFS구나, 아니구나를 판단할 수 있을 것이라고 믿는다. 큐에는 시작과 연산 횟수를 넣었다. 그렇게 연산을 하면 cnt를 증가 시키고, k에 도달하면 출력을 하고 끝을 낸다. BFS의 개념만 알면 금방 풀 수 있는 문제라서 쉽게 풀 수 있었다. 💻 코드..

PS/백준

[백준] 2583 - 영역 구하기

2583번: 영역 구하기 첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오 www.acmicpc.net ✏️ 풀이 입력으로는 k개의 영역을 준다. 그래서 나는 x1, y1, x2, y2로 입력을 받았다. 이렇게 입력을 받아서 previsit으로 입력받은 영역을 방문 처리했다. 간단하게 표현하면 미로에서 벽을 세운 느낌으로 처리했다. 그리고 BFS를 통해서 영역의 너비를 계산했다. 이문제에서는 처음 입력받은 좌표에 해당하는 구역만큼만 방문 처리를 했으면 금방 풀 수 있는 문제였다. BFS는 평소에 풀던 다른 문제처럼 처리를 하면 되는 거여서 금방..

PS/백준

실버2 색종이 만들기(2630)

2630번: 색종이 만들기 첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다. www.acmicpc.net 분할 정복 공부하면서 이렇게 4개로 나눠지는 형태를 쿼드트리라는 것을 처음 알았다. 이렇게 4분할 해서 재귀를 돌리는 형태의 코드가 많이 나왔다. import sys input = sys.stdin.readline def divide(r, c, n): check, flag = matrix[r][c], True for i in range(r, r+n): for j in range(c, c+n): if check != matrix[i][j..

PS/백준

실버1 z(1074)

1074번: Z 한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을 www.acmicpc.net 위의 문제를 보고 분할 정복 문제라는 것을 알았지만, 분할 정복를 정확하게 모르고 있었기에 풀어내는데 조금 오래 걸렸다. import sys input = sys.stdin.readline def printResult(value, location): print(value + location) exit(0) def divide(n, r, c, value): n //= 2 if r < n and c < n: if n == 1: printResult(valu..

PS/백준

실버3 구간 합 구하기 4(11659)

11659번: 구간 합 구하기 4 첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j www.acmicpc.net 처음에는 아래와 같이 정말 간편하게 풀 수 있을 것이라고 생각하고 풀었다. 아래와 같이 sum과 슬라이싱을 이용했더니 바로 실패했다. 그래서 누적합에 대해서 공부를 했다. n, m = map(int, input().split()) data = list(map(int, input().split())) for _ in range(m): i, j = map(int, input().split()) print(sum(data[i-1:j])) 아래는 ..

PS/백준

실버3 1로 만들기(1463)

1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net DP문제를 잘 몰라서 처음에는 8까지 모든 경우의 수를 적었다. 적고 보니 어떻게 풀어야할 지 보여서 쉽게 풀 수 있다. 3이나 2로 나눠지면 best를 업데이트를 했다. 최소값만 넣을 수 있게 min을 활용해서 풀고, 마지막에 append하기 전에 min값을 넣었다. 이렇게 풀고 성공(832ms)은 했는데 생각을 해보니 굳이 인덱스를 넣을 필요가 없다는 것을 알게 되었다. import sys input = sys.stdin.readline num = int(input()) memo = [(0,0), (1,0)] for i in range(2, num+1): best = 99..

jjw000628
'파이썬' 태그의 글 목록