본문 바로가기

전체 글

(201)
[16234번] 인구 이동(삼성 코딩테스트 SW) 문제 N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모든 나라는 1×1 크기이기 때문에, 모든 국경선은 정사각형 형태이다. 오늘부터 인구 이동이 시작되는 날이다. 인구 이동은 다음과 같이 진행되고, 더 이상 아래 방법에 의해 인구 이동이 없을 때까지 지속된다. 국경선을 공유하는 두 나라의 인구 차이가 L명 이상, R명 이하라면, 두 나라가 공유하는 국경선을 오늘 하루동안 연다. 위의 조건에 의해 열어야하는 국경선이 모두 열렸다면, 인구 이동을 시작한다. 국경선이 열려있어 인접한 칸만을 이용해 이동할 수 있으면, 그 나라를 오늘 하루 동안은 연합이라고 ..
[1463번] 1로 만들기 문제 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 문제접근법. 예제에서 주어진 10을 보면, 10 -> 9 -> 3 -> 1이다. 9를 만들기 위해 연산의 사용하는 연산의 최솟값이 10에 사용될 것이라고 유추할 수 있다. 다이나믹 프로그래밍으로 문제를 접근해야 한다. 1~10까지 직접 채워나가다 보면, 점화식을 찾을 수 있다. 1 2 3 4 5 6 7 8 9 10 0 1 1 2 3 2 3 3 2 3 위에는 1~10까지의 숫자를 의미하고, 아래는 1을 만들기..
[9095번] 1, 2, 3 더하기 문제 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오. 문제접근법. 규칙을 발견해야 문제를 해결할 수 있다. 점화식만 보고 직관적으로 이해가 되면 좋겠지만, 대부분이 그렇지 않을 것이다. n = 4 라는 예제를 통해서 이해도를 높여보자. n >= 4 일 때, f(n) = f(n - 1) + f(n - 2) + f(n - 3)이다. n = 1 일 때, 1 n = 2 일 때, 1 + 1 / 2 n = 3 일 때, 1 + 1 + 1 / 2 + 1 / 1 + 2 / 3 n..
[11722번] 가장 긴 감소하는 부분 수열(DP) 가장 긴 감소하는 부분 수열 성공 문제 수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10} 이고, 길이는 3이다. 문제접근법. 1. 하나의 원소를 기준으로 가장 긴 문자열을 찾아야 한다. 2. 반복적으로 특정 원소를 기준으로 한 연산이 없도록 한다.(메모이제이션) 앞선 코드와 비슷하지만, 재귀함수 호출없이 문제를 풀 것이다. DP[i]는 해당 인덱스(i)에서 시작해서 가장 길게 만들 수 있는 값을 저장한다. 다음과 같은 재귀식을 만들 수 있다. DP[i]를 정의하는 것이 가장 중요하다. 처음에, DP[i]를, ..
[11722번] 가장 긴 감소하는 부분 수열 가장 긴 감소하는 부분 수열 성공 시간 제한메모리 제한제출정답맞은 사람정답 비율 1 초 256 MB 8943 5611 4608 64.828% 문제 수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10} 이고, 길이는 3이다. 문제접근법. 1. 하나의 원소를 기준으로 가장 긴 문자열을 찾아야 한다. 2. 반복적으로 특정 원소를 기준으로 한 연산이 없도록 한다.(메모이제이션) 해설코드(C++) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2..
[17144번] 미세먼지 안녕! (C++, 삼성코딩테스트) 문제 미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사과는 뛰어난 코딩 실력을 이용해 각 칸 (r, c)에 있는 미세먼지의 양을 실시간으로 모니터링하는 시스템을 개발했다. (r, c)는 r행 c열을 의미한다. 공기청정기는 항상 왼쪽 열에 설치되어 있고, 크기는 두 행을 차지한다. 공기청정기가 설치되어 있지 않은 칸에는 미세먼지가 있고, (r, c)에 있는 미세먼지의 양은 Ar,c이다. 1초 동안 아래 적힌 일이 순서대로 일어난다. 미세먼지가 확산된다. 확산은 미세먼지가 있는 모든 칸에서 동시에 일어난다. (r, c)에 있는 미세먼지는 인접한 네 방향으로 확산된다. 인접..
[2257번] 화학식량 (스택 풀이) 지난 번, 재귀함수 풀이에 이어서 스택 풀이입니다. 문제 접근법. 1. 괄호에 대해서 먼저 연산을 할 필요가 있다. 2. 숫자가 있는 경우, 앞에 있는 문자나 괄호식에 대해서 곱셈을 해줘야 한다. 괄호와 같은 우선 순위가 필요한 연산일 경우, 적합한 자료구조는 스택입니다. 스택을 이용해서, 특정 우선 순위에 대해서 먼저 처리해주는 것이 필요합니다. H, C, O에 대해서는 해당하는 숫자(1, 14, 16)를 넣어줍니다. (은 우선순위 연산을 위해서 사용되므로, 그대로 넣어줍니다. )의 경우에는 (를 만날 때까지 만나는 숫자들을 모두 더하도록 처리합니다. 숫자의 경우에는 스택의 Top에 대해서 곱셈을 처리해서, *다시 숫자를 넣어줍니다. * )의 경우에 모든 숫자를 더할 수 있는 이유는, 스택에 들어가는 ..
[2257번] 화학식량(재귀함수 풀이) 이 문제는 스택으로 풀 수도 있다고 한다. 이번 해설에서는 재귀함수를 통해서 설명하겠다. 문제접근법. 1. 한 문자가 무엇인지에 따라서, 알맞는 연산의 과정이 필요 2. 괄호가 등장했을 때, 특별한 연산이 필요 이 두 가지에 초점을 맞춰서 재귀 함수를 구성하면 된다. 1번은 알파벳 두개가 연달아 나왔을 때와, 숫자가 나왔을 때를 생각해주면 조건문을 작성할 수 있다. 2번은 좀 까다롭다. 예시는 다음과 같다. (H(O2)3)2를 보면, 괄호가 두 개 나와 있다. 괄호가 두 개 이상있을 때 방법을 생각하는게 문제의 핵심이다. 괄호가 열리기 전까지 연산된 값을 기록해두고 괄호가 닫히면 기록된 값을 이용해서 연산을 진행하면 문제를 해결할 수 있다. 해설 코드(C++) 1 2 3 4 5 6 7 8 9 10 11 ..