Algorithm 56

[백준] 14442번: 벽 부수고 이동하기2- 파이썬

https://www.acmicpc.net/problem/14442 14442번: 벽 부수고 이동하기 2 첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자. www.acmicpc.net 문제 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다. 만약에 이동하는..

Algorithm 2022.02.26

[백준] 2206번: 벽 부수고 이동하기 - 파이썬

https://www.acmicpc.net/problem/2206 2206번: 벽 부수고 이동하기 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로 www.acmicpc.net 문제 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다. 만약에 이동하는 도중에 한..

Algorithm 2022.02.26

백준 BOJ 시간초과 팁 (부제: 우리의 시간은 소중하니까)

백준 시간초과 백준에서 알고리즘 공부를 하다보면 시간초과로 애를 먹을 때가 많다. 시간초과 문제 고치다가 내 시간만 초과되는 상황.. 막상 다 풀어보면 분명 다른 사람들과 몇 줄 차이 안나는데 시간차이가 많이 나는게 마음에 안들어서 도대체 뭐가 다른지 찾아봤다. 우리 모두의 시간은 소중하니까 시간을 단축할 수 있는 방법들 중 몇 가지를 가져왔다. 1. input()보다 sys.stdin.readline()이 더 빠르다. 백준 문제를 많이 풀어본 사람들은 많이 아는 팁이다. input() 내장함수 word = input("단어를 입력해주세요") input이 호출되면 Promt message를 화면에 출력하고 사용자의 입력을 기다린다. 사용자가 키를 하나씩 누루면 데이터가 버퍼에 들어가는데, 개행문자(줄바꿈..

Algorithm 2022.02.26

[백준] 14888번: 연산자 끼워넣기- 파이썬

https://www.acmicpc.net/problem/14888 14888번: 연산자 끼워넣기 첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, www.acmicpc.net 문제 N개의 수로 이루어진 수열 A1, A2, ..., AN이 주어진다. 또, 수와 수 사이에 끼워넣을 수 있는 N-1개의 연산자가 주어진다. 연산자는 덧셈(+), 뺄셈(-), 곱셈(×), 나눗셈(÷)으로만 이루어져 있다. 우리는 수와 수 사이에 연산자를 하나씩 넣어서, 수식을 하나 만들 수 있다. 이때, 주어진 수의 순서를 바꾸면 안 된다...

Algorithm 2022.02.10

[Algorithm] 비트마스크 (BitMask)

비트 마스크 (BitMask) 컴퓨터의 연산방식을 이용하여 정수의 이진수 표현을 자료구조로 쓰는 기법 *비트 (bit)란? 컴퓨터에서 다루는 최소 단위로 0과 1로 이루어짐 장점 빠른 수행시간 간결한 코드 더 적은 메모리 사용 비트 연산자 c = a & b # AND 000101 & 000011 = 000001 c = a | b # OR 000101 | 000011 = 000111 c = a ^ b # XOR 000101 ^ 000011 = 000110 c = ~a # NOT ~000101 = 111010 c = a b # SHIFT 000101 >> 000011 = 000000 1. AND 연산 대응하는 두 비트가 모두 1일 경우 1, 아니면 0 2. OR 연산 대응하는 두 비트가 모두 0일 경우 0,..

Algorithm/이론 2022.02.09

[백준] 14500번: 테트로미노 - 파이썬

문제 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변끼리 연결되어 있어야 한다. 즉, 꼭짓점과 꼭짓점만 맞닿아 있으면 안 된다. 정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다. 아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. 종이는 1×1 크기의 칸으로 나누어져 있으며, 각각의 칸에는 정수가 하나 쓰여 있다. 테트로미노 하나를 적절히 놓아서 테트로미노가 놓인 칸에 쓰여 있는 수들의 합을 최대로 하는 프로그램을 작성하시오. 테트로미노는 반드시 한 정사각형이 정확히 하나의 칸을 포함하도록 놓아야 하며, 회..

Algorithm 2022.02.07

[Algorithm] Two Pointers

📌 Two Pointers 1차원 배열에서 두 개의 포인터를 사용하여 원하는 결과를 얻는 알고리즘 "특정한 합을 가지는 부분 연속 수열" 문제에서는 Two Pointer를 사용! 대표적으로 투 포인터를 활용한 문제는 다음과 같은 문제다. Q. 정렬된 리스트 A와 타겟 값 S가 주어졌을 때, 두 수의 합이 S가 되는 순서쌍을 모두 구하여라. 가장 먼저 떠오르는 풀이는 이중 반복문을 이용해 탐색하는 방법일 것이다. for i in range(len(A)): for j in range(i+1, len(A)): if A[i] + A[j] == S: print(A[i],A[j]) 매우 단순하고 직관적이지만 시간 복잡도가 O(n^2)이라 데이터가 커지면 시간초과가 발생할 가능성이 크다. 또한 문제가 두 수의 합이 ..

Algorithm/이론 2022.02.05

[백준] 3273번: 두 수의 합- 파이썬( 투 포인터)

https://www.acmicpc.net/problem/3273 3273번: 두 수의 합 n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는 www.acmicpc.net 문제 n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는 (ai, aj)쌍의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 수열의 크기 n이 ..

Algorithm 2022.02.05

[백준] 17837번: 새로운 게임 2 - 파이썬

문제 재현이는 주변을 살펴보던 중 체스판과 말을 이용해서 새로운 게임을 만들기로 했다. 새로운 게임은 크기가 N×N인 체스판에서 진행되고, 사용하는 말의 개수는 K개이다. 말은 원판모양이고, 하나의 말 위에 다른 말을 올릴 수 있다. 체스판의 각 칸은 흰색, 빨간색, 파란색 중 하나로 색칠되어있다. 게임은 체스판 위에 말 K개를 놓고 시작한다. 말은 1번부터 K번까지 번호가 매겨져 있고, 이동 방향도 미리 정해져 있다. 이동 방향은 위, 아래, 왼쪽, 오른쪽 4가지 중 하나이다. 턴 한 번은 1번 말부터 K번 말까지 순서대로 이동시키는 것이다. 한 말이 이동할 때 위에 올려져 있는 말도 함께 이동한다. 말의 이동 방향에 있는 칸에 따라서 말의 이동이 다르며 아래와 같다. 턴이 진행되던 중에 말이 4개 이..

Algorithm 2022.01.22

[백준] 16235번: 나무 재테크- 파이썬

문제 부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터 떨어진 칸의 개수, c는 가장 왼쪽으로부터 떨어진 칸의 개수이다. r과 c는 1부터 시작한다. 상도는 전자통신공학과 출신답게 땅의 양분을 조사하는 로봇 S2D2를 만들었다. S2D2는 1×1 크기의 칸에 들어있는 양분을 조사해 상도에게 전송하고, 모든 칸에 대해서 조사를 한다. 가장 처음에 양분은 모든 칸에 5만큼 들어있다. 매일 매일 넓은 땅을 보면서 뿌듯한 하루를 보내고 있던 어느 날 이런 생각이 들었다. 나무 재테크를 하자! 나무 재테크란 작은 묘목을 구매해 어느정도 키운 후 팔아서 수익을 ..

Algorithm 2022.01.22
728x90