문제 20056번: 마법사 상어와 파이어볼 첫째 줄에 N, M, K가 주어진다. 둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다. 서로 다른 두 파이어볼의 위치 www.acmicpc.net 문제 풀이 입력값으로 파이어볼의 위치 (r, c), 질량(m), 방향(d), 속력(s)이 주어진다. 시뮬레이션 문제이므로 다음과 같은 과정을 순차적으로 진행한다. 모든 파이어볼은 자신의 방향으로 속력만큼 이동한다. 이동을 마친 후, 이동된 파이어볼들이 같은 칸에 2개 이상 있다면 다음과 같이 처리한다. 파이어볼은 4개로 나누어진다. 나누어진 파이어볼의 질량, 속력, 방향은 다음과 같다. 질량은 `합쳐진 파이어볼 질량의 ..
문제 17135번: 캐슬 디펜스 첫째 줄에 격자판 행의 수 N, 열의 수 M, 궁수의 공격 거리 제한 D가 주어진다. 둘째 줄부터 N개의 줄에는 격자판의 상태가 주어진다. 0은 빈 칸, 1은 적이 있는 칸이다. www.acmicpc.net 문제 풀이 문제에서 격자판과 궁수의 공격 거리 제한 D가 주어 질 때 제거할 수 있는 적의 최대 수를 출력하는 문제이다. 궁수는 3명을 배치할 수 있으며, 배치 가능한 범위는 열의 범위인 M까지 이다. 궁수의 경우 3명만 배치 가능하므로 각 좌표에 대해 조합(Combination)으로 경우의 수를 구해 후보군을 구한다. 후보군을 구하였다면 후보군을 모두 순회하면서 공격 가능한 거리에 따라 적을 제거하고 적이 앞으로 움직이는 과정을 반복하여 제거한 적의 수를 비교하여 최..
문제 2186번: 문자판 첫째 줄에 N(1 ≤ N ≤ 100), M(1 ≤ M ≤ 100), K(1 ≤ K ≤ 5)가 주어진다. 다음 N개의 줄에는 M개의 알파벳 대문자가 주어지는데, 이는 N×M 크기의 문자판을 나타낸다. 다음 줄에는 1자 이상 80자 이하의 www.acmicpc.net 문제 풀이 목표가 되는 문자열과 일치하는 경우의 수를 찾는 문제이다. 이를 위해서 `상, 하, 좌, 우`로 K 만큼씩 이동할 수 있다. 문제를 풀기 위해서는 단순히 DFS를 통해 경우의 수를 찾게 되면 시간 초과가 발생한다. 따라서 메모이제이션을 통해 이미 체크한 경우의 수라면 해당 경우의 수를 체크하지 않아야(가지치기) 한다. 처음에는 `dirs = ((0, 1), (0, -1), (-1, 0), (1, 0))`를 사..
문제 SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 문제 풀이 이름이 주어질 때 다음과 같은 조건을 통해 정렬 후에 이름을 출력하면 되는 문제이다. 동일한 이름은 하나만 출력한다. 이름의 길이를 우선으로 정렬한다. 길이가 같다면, 이름 순으로 정렬한다. 위는 파이썬에서 `set`과 `lambda`를 활용하면 쉽게 해결 할 수 있다. 코드 T = int(input()) for test_case in range(1, T + 1): N = int(input()) names = [None] * N for idx in range(N): cur_name = input() names[idx] = (cur_name, len..

문제 20057번: 마법사 상어와 토네이도 마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을 www.acmicpc.net 문제 풀이 5 x 5 크기의 토네이도가 방향을 전환하며, 현재 있는 모래에 영향을 미치는 문제이다. 문제를 풀기 위해서는 `상, 하, 좌, 우`로 전환되는 경우의 토네이도에 대해 사전에 초기화가 필요하다. tornado = [ (None, None, 2, None, None), (None, 10, 7, 1, None), (5, 'a', None, None, None), (None, 10, 7, 1, None), (None, N..
문제 17140번: 이차원 배열과 연산 첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다. www.acmicpc.net 문제 풀이 문제에서 배열 A가 주어지면, 배열의 행, 열의 수에 따라 정렬을 수행 후 행렬에 값을 추가한다. 조건은 다음과 같다. 행의 개수가 열의 개수보다 크거나 같은 경우 배열 A의 모든 행에 대해 정렬을 수행한다 행의 개수가 열의 개수보다 작은 경우 배열 A의 모든 열에 대해 정렬을 수행한다. 정렬을 위해서는 한 행 또는 한 열의 수와 등장 횟수를 기준으로 정렬한다. (count, number)와 같은 기준으로 정렬한다. 정렬할 때, 0은 ..
문제 8980번: 택배 입력의 첫 줄은 마을 수 N과 트럭의 용량 C가 빈칸을 사이에 두고 주어진다. N은 2이상 2,000이하 정수이고, C는 1이상 10,000이하 정수이다. 다음 줄에, 보내는 박스 정보의 개수 M이 주어진다. M은 1이 www.acmicpc.net 문제 풀이 접근법을 생각하기까지 시간이 걸렸으며, 다소 어려웠다. 문제의 해답은 각 마을 별로 출발지 도착지를 기준으로 출발 가능한 양을 지속적으로 확인해야 한다는 것이다. 마을 별로 실을 수 있는 최대 박스의 양을 트럭의 용량으로 초기화한다. 입력된 값을 도착지를 기준으로 정렬한다 입력된 값을 순차적으로 돌며, 출발지 도착지에 적재 가능량과 박스의 양을 비교하여 처리한다. 이를 순차적으로 반복하면 요구하는 답을 찾을 수 있다. 코드 f..
문제 2141번: 우체국 첫째 줄에 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 X[1] A[1], X[2] A[2], …, X[N] A[N]이 주어진다. 범위는 |X[i]|≤1,000,000,000, 0≤A[i]≤1,000,000,000 이며 모든 입력은 정수이다. www.acmicpc.net 문제 풀이 처음 문제를 접하였을 때는 나라에서 각 사람들까지의 거리의 합이 최소가 되는 위치의 의미를 이해하지 못했다. 코드를 작성하는 시간보다 문제에서 의미하는 바를 생각하는 데까지 걸리는 시간이 더 소요된 것 같다. 즉 문제를 풀기 위해서는 중간 값을 계산하고, 각 마을의 번호 순서대로 정렬한다. 정렬된 마을을 기준으로 하나씩 인구수를 계산하여 중간값과 가장 근접한 마을을 찾아 출력하면 된다. ..