2239번: 스도쿠 스도쿠는 매우 간단한 숫자 퍼즐이다. 9×9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9개의 3×3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다. 예를 들어 다 www.acmicpc.net 문제 이해 & 기본 개념 스도쿠를 완성시키는 문제 시간 제한이 2초로 충분하므로 백트래킹을 이용하면 쉽게 풀 수 있다. 중요 포인트 가로, 세로, 3x3 사각형에서 중복되는 숫자가 없는지 확인해야한다. 가로, 세로에선 아래와 같이 쉽게 확인할 수 있다. map[x][y]와 for문의 위치가 같아지는 경우 continue로 처리해버리면, 세로의 경우를 체크하지 못할 수 있다. // map[x][y]와 중복되는 숫자가 있는지 체크하는 for문 for (i in..
2467번: 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 - www.acmicpc.net 문제 이해 & 기본 개념 배열의 원소 중 2개의 합이 0에 가장 가까운 원소 쌍을 찾는 문제 투 포인터를 이용하면 쉽게 구할 수 있다. 중요 포인트 두 개의 포인터를 양 쪽 끝에서 시작하는게 포인트 최종 풀이 두 개의 포인터를 각각 배열의 맨 앞과 맨 뒤에 배치한다. 왼쪽 포인터를 당기는 경우 or 오른쪽 포인터를 당기는 경우 중 0에 더 가까워 지는 쪽으로 포인터를 이동한다. cur = abs(num[i] + num[j]) // 현재 두 원소의 합 if(..
2166번: 다각형의 면적 첫째 줄에 N이 주어진다. 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다. 좌표값은 절댓값이 100,000을 넘지 않는 정수이다. www.acmicpc.net 문제 이해 & 기본 개념 n개의 점으로 이루어진 다각형의 넓이를 구하는 문제 신발끈 공식을 이용하면 쉽게 풀 수 있다. 중요 포인트 N이 최대 10,000까지, 각 좌표의 절댓값이 최대 100,000이므로 Long 타입을 선택해야 한다. 신발끈 공식에서는 좌표를 이어지도록 나열하는 것이 중요한데, 해당 문제에서는 다각형을 이루는 순서대로 입력이 들어온다. 만약, 순서가 랜덤이라면 하나의 다각형으로 고정 되지 않기에 문제가 성립되지 않는다. 스페셜 저지면 가능하겠지만, 일반 문제이기 때문에..
1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 문제 이해 & 기본 개념 아래 3가지 방법을 통해 입력 받은 수를 1로 만드는 것 X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 최소 횟수를 구해야하는 문제 3으로 나누는게 1을 빼는 것보다 수가 훨씬 작아지므로 자칫하면 그리디 문제로 오해할 수 있다. ex) n = 10 10 -> 9 -> 3 -> 1 10 -> 5 -> 4 -> 2 -> 1 이처럼 가능한 큰 수로 나누는 것보다 1을 먼저 빼는 경우가 최소 횟수가 될 수도 있기 때문에 dp를 이용한다. 최종 풀이 파란색이 처음 계산 되는 부분 빨간색이 중복 계산 되는 ..
11055번: 가장 큰 증가 부분 수열 수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수 www.acmicpc.net 문제 이해 & 기본 개념 수열에서 증가하는 부분 (이어질 필요 x)에서 가장 합이 큰 경우를 찾아야하는 문제 중요 포인트 모든 경우의 수를 보는 방법도 있긴 하겠지만, 중복된 연산이 많이 발생 중복된 연산을 줄이기 위해 dp를 사용하면 간단하게 풀 수 있음 최종 풀이 점화식 dp[i] = max(dp[i], dp[j] + a[i]) i는 현재 위치, j는 이전에 선택된 원소의 위치 dp[i]는 i까지의 최..
10814번: 나이순 정렬 온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 www.acmicpc.net 문제 이해 & 기본 개념 회원의 나이와 이름이 입력된다. 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 문제 중요 포인트 입력 데이터를 클래스로 묶는 것 Comparable 인터페이스를 사용하여 정렬 기준을 재정의하는 것 최종 풀이 Comparable 인터페이스의 compareTo 메소드를 오버라이드하면 정렬 기준을 변경할 수 있다. compareTo의 반환 값이 양수이면 두 객체를 swap한다. class User im..
1676번: 팩토리얼 0의 개수 N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오. www.acmicpc.net 문제 이해 & 기본 개념 팩토리얼의 결과 값에서 끝에 0의 개수를 구하는 문제 N이 최대 500까지 들어오므로 팩토리얼을 직접 계산하는 방법은 불가 BigInteger를 사용하면 가능하긴 하겠지만, 좋은 방법은 아닌 듯함 중요 포인트 팩토리얼을 계산하지 않고 0의 개수를 알아내는 방법을 찾는게 중요 어떤 경우에 끝에 0이 붙는지를 생각해보면 쉽게 규칙을 찾을 수 있다. 최종 풀이 끝자리에 0이 붙는 경우는 10(2 x 5)을 만났을 때이다. 2와 5가 곱해지는 순간 10이 되어 끝자리에 0이 생기게 된다. 즉, 2x5가 몇 번 나오는지만 알면 0이..
14929번: 귀찮아 (SIB) n과 xi가 주어짇나. n은 10만 이하ㅇ고, xi는 젗ㄹ댓값이 100이하인 정수디이다. www.acmicpc.net 문제 이해 각각의 두 원소끼리 곱한 합을 구하는 문제 즉, n=3이고 x1, x2, x3가 있으면 x1x2 + x1x3 + x2x3를 구하라는 문제이다. 해당 문제에선 규칙을 찾는게 중요 + 누적 합으로 계산 최적화 풀이 n=4일 때를 가정하면 아래와 같은 식을 얻을 수 있다. ex) n=4 { x1 x2 x3 x4 } x1x2 + x1x3 + x1x4 + x2x3 + x2x4 + x3x4 => x1(x2+x3+x4) + x2(x3+x4) + x3(x4) 규칙을 보면 x1부터 차례대로 자신을 제외한 다른 원소들의 합과 곱해지는 것을 볼 수 있다. 공통 인수..