본문 바로가기

개발

(99)
백준 16236 파이썬 더보기 from _collections import deque n = int(input()) data = [list(map(int, input().split())) for _ in range(n)] shark_size = 2 dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1] cnt = 0 size_count = 0 def search_fish(): result = n ** 3 nx, ny = 0, 0 global cnt global shark_size global shark_point global size_count for i in range(n): for j in range(n): if data[i][j] != 0: if data[i][j] < shark_size: move_size ..
[BOJ] 연구소_14502.. 위 사진은 답안의 전체 소스 코드이다. 이 문제를 이해하는데 총 3일이 걸렸다... 3일 동안 이 문제를 본 것이 아니지만, 너무 이해가 안가서 딴짓하다 오기를 반복하며 시간을 많이 소비했다. (알고리즘 때려치고 싶었다...) 문제를 대충 이해하고 푼 지금에도 2주 뒤에 풀라고 한다면 못 풀 것 같다.. 우선 가장 이해가 가지 않았던 부분. 1. 벽 세우기. 전체 벽을 세워야 하니까... 중첩 반복문으로 n*m중에 3개를 뽑는 경우의 수를 모두 고려해 줘야 한다. 지금도 헷갈리는게 build_wall가 모든 경우를 고려해 준 것이 맞는지 잘 모르겠다... (이해하기 위해 그림으로 그린 후, 이해한 것을 기록하자.) 그리면서 대충은 이해한 것 같은데,, 아직 확신이 안든다. 이것만 잡고 있을 순 없으니 일..
[BOJ] 잃어버린 괄호_1541 이 문제는 쉬웠는데,,, 내가 잘 생각하지 못하는 파이썬 문법이라 암기가 필요할 것 같다. 처음 data = list(map(str, input().split("-")을 사용했는데, 이건 input().split("-")랑 당연히 똑같다. map을 통해 split로 나눈 배열을 str자료형으로 바꾸는 것을 -> list배열로 만드는 것인데.. input으로 받아오는 데이터는 원래 자료형이 str이라 바꿔줄 필요가 없었고, split로 나누면 배열로 만들어지기 때문에 그냥 input().split("-")을 사용하면 되는 것이였다.. 이번 문제는 input().split("문자")에 대해 다시 한번 떠올리게 되는 문제여서 좋았다. 그리고 아직 파이썬 문법에서는 list, map, input().split(..
[BOJ] 거스름돈_5585 이 문제는 아주 쉬운 문제이다. 하지만 내 코드가 비효율적이여서 효율적인 코드를 기억하고자 남긴다. 조건도 3개나 된다. 이 코드를 간단히 줄이면 이 코드가 된다. 원리를 설명하자면, 배열의 원소를 큰 것부터 순서대로 가져온다. 그 값으로 코인을 나눈 몫을 count에 더해준다. -> 이래야 해당 코인이 사용될 수 있는 총 갯수가 나오니까. 그리고 a%=i는 i로 나눈 나머지 값이 저장된다. -> 이 뜻은 i로 최대한 뺸 후 값을 저장한다는 의미가 된다. 이렇게 해서 아주 간단하게 구할 수 있다.
[BOJ] 나이트의 이동_7562 이 문제는 bfs를 이용하여 최단거리를 구하는 문제이다. 궁금증. 이 코드에 최단거리가 어떻게 고려되었는가? 1. 시작점으로부터 모든 방향으로 움직인다. 2. 이미 방문한 상태라면, 방문하지 않는다. 3. 이동한 칸에는 이동하기 전의 count+1을 한다. 왜 DFS는 안되는가?
[BOJ] 제곱수의 합_1699 이 문제의 포인트는 다음과 같은 생각이다. 주어진 값 n의 가장 작은 수를 구하는 방법은, j를 1~n까지의 반복문 안에서 min을 활용해 j*j가 n보다 크지 않을 때까지 뺸 값에 +1 한 값이다. 즉, 다음과 같은 코드를 구성하게 된다. 근데,, 이걸 어떻게 생각해내지,,, 무튼 수를 더해 검사해나가며, dp[i]라는 한 자리에 그 값을 교체해주는 형식이된다.
[BOJ] 스티커_9465 이 문제는 그림과 같은 규칙을 찾아내, 점화식을 구한 후 푸는 DP문제이다. 해당 동그라미 표시의 값은 대각선의 값을 더하거나, 그 왼쪽의 값을 더하는 방법이 있다. 그 중 최대인 값을 구한다면, 그것이 최대로 가질 수 있는 값이 된다. 처음 실수가 나왔던 코드이다. 이 코드는 윗 칸부터 순차적으로 내려오게 했는데, 그렇게 되면 안되고 윗칸과 아래칸이 동시에 이루어져야 한다. 그래서 이러한 식이 나오게 된다.
[BOJ] 01타일_1904 이 문제의 유형은 타일과 같은 여러 문제들에서 비슷하게 응용된다. 이 문제의 핵심은 다음과 같다. 그림을 예로 보았을 때, dp[4]를 구하는 방법을 생각해보겠다. dp[2]는 타일이 두개일 때, 구할 수 있는 모든 경우의 수이다. 만약 여기에 00타일 두개가 들어가고, dp[3]에는 1타일 한개가 들어간다면 4개짜리의 모든 경우의 수가 나온다. 하지만 난 여기서 뭔가 거슬리는 생각들이 있었다. dp[2]에 00을 추가할 때, 순서를 바꿔준다면 다른 경우가 되지 않을까?? 그리고 두개를 추가한다고 했을 때, 00말고 11을 넣는다면,,? 물론 잘못된 생각이지만, 한번은 짚고 넘어가자. 저 생각은 왜 잘못된 것일까? 이 잘못된 생각의 흐름은 어디서 부터 시작된걸까? 일단 dp[2]의 11에 00을 앞뒤로 ..