https://www.acmicpc.net/problem/11048 11048번: 이동하기 준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다. 준규는 www.acmicpc.net 문제 해결 방법 처음 문제를 접했을 때, 단순한 완전탐색 문제라고 생각했습니다. 사탕의 최댓값을 구하기 위해 모든 칸을 탐색하여 진행하는 방식을 떠올렸습니다. 마침 이동하는 범위도 (0,1) (1,0) (1,1) 이기에 범위도 신경쓸 부분이 줄어들었다 생각했습니다. 처음 작성한 코드는 아래와 같습니다. import java.io.*; import java.util.*; public ..
https://www.acmicpc.net/problem/14225 14225번: 부분수열의 합 수열 S가 주어졌을 때, 수열 S의 부분 수열의 합으로 나올 수 없는 가장 작은 자연수를 구하는 프로그램을 작성하시오. 예를 들어, S = [5, 1, 2]인 경우에 1, 2, 3(=1+2), 5, 6(=1+5), 7(=2+5), 8(=1+2+5)을 만들 www.acmicpc.net 문제 해결 과정 예제 입력 1번 경우의 그림이다. 아무 것도 없는 상태에서 각 배열의 값을 DFS 방식으로 탐색하며 store라는 배열에 각 수열의 합을 채워 넣는 방식이다. 이때, store 배열은 조건에 "100,00보다 작거나 같은 수" 가 최대 20개까지 주어지니까 1~2,000,000 으로 범위를 생각하여 store의 배..
https://www.acmicpc.net/problem/6603 6603번: 로또 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로 www.acmicpc.net 문제 해결 방법 순열 문제라고 생각했습니다. 기본적으로 k개의 수 중 6개의 수를 골라야 하며, 수는 사전순으로(오름차순) 배치를 해야 하기에 범위를 나눠 생각했습니다. k개의 수 중 첫번째 자리에 올 수 있는 수는 (k-6)+1 가지 입니다. 예를 들어, k가 7이라면 첫번째로 올 수 있는 수는 1과 2 입니다. 3이 되는 순간 3, 4, 5, 6, 7 이 다섯 가지의 수밖에 없기 때..
https://www.acmicpc.net/problem/1913 1913번: 달팽이 N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 www.acmicpc.net 문제 접근 방법 달팽이가 움직이는 모습은 위와 같다. 시작점을 먼저 찾고 ( N/2, N/2 ) 시작점을 기준으로 움직일 수 있는 범위를 제한하여 구동하면 된다. 예를 들어 1->2, 2->3을 갈때는 최대 한 칸만 움직일 수 있지만 3->5, 7->10 등 움직일 수 있는 범위가 늘어나는 포인트가 생긴다. 이 포인트들은 달팽이가 위, 아래로 움직일 때 (x,y에서 x값이 증가하거나 감소할 때) 이..
https://www.acmicpc.net/problem/1244 1244번: 스위치 켜고 끄기 첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩 www.acmicpc.net 문제 접근 과정 스위치 값을 받고, 스위치 배열에 값을 받았습니다. 남학생(1)은 자신이 받은 수가 스위치 번호의 배수일 때 스위치 값을 전환시키고 여학생(2)은 자신이 받은 수 기준으로 좌우가 대칭이여야 스위치 값을 전환시킵니다. 남학생의 경우 (배열의 인덱스+1)%수 == 0 을 통해 배수를 구하여 쉽게 구할 수 있었고, 여학생의 경우 받은 수를 기준으로 lt(수-1)와 rt(수+1)를 ..
https://www.acmicpc.net/problem/4396 4396번: 지뢰 찾기 지뢰찾기는 n × n 격자 위에서 이루어진다. m개의 지뢰가 각각 서로 다른 격자 위에 숨겨져 있다. 플레이어는 격자판의 어느 지점을 건드리기를 계속한다. 지뢰가 있는 지점을 건드리면 플레이어 www.acmicpc.net 문제 접근 과정 먼저 지뢰의 정보가 담긴 배열과 열린 칸이 포함된 배열을 생성해주고, 열린 칸(x)이 포함된 배열의 for문을 돌며 1. 만약 x 위치에 지뢰가 있다 -> 그 즉시 모든 칸을 *로 출력한다. 2. 만약 x 위치에 지뢰가 없다 -> x에 인접한 8칸의 지뢰 수를 확인한다. 로 생각했었습니다. 하지만, 문제를 조금 더 자세히 읽었어야 했죠.. 만약 지뢰가 발견되면, 지뢰가 있는 모든 칸..
https://www.acmicpc.net/problem/2578 2578번: 빙고 첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로 www.acmicpc.net 문제 접근 방법 처음 문제를 보고 단순히 "for문 여러번 돌려야겠는데?" 라고 생각했습니다. 이 생각을 하고 다른 간결한 풀이가 있는지 생각해봤지만 떠오르는 것이 없었고, 자신의 빙고판과 사회자가 부를 숫자를 배열에 입력받은 후 for문을 돌려 수를 확인하고, 수를 확인한 후에 빙고가 있는지 확인하는 과정을 구현하였습니다. 코드 import java.io.*; import java.util.*; class M..
해결방법 문제를 보고 모든 경우의 수를 확인해야 겠다는 생각을 했습니다. d(n) = n + n의 각 자리수의 합을 구하는 함수 여기서 n을 d(n)의 생성자라고 하는데, 이 생성자가 없는 수를 셀프 넘버라 하고, 이를 구하는 문제입니다. 1부터 10000까지 루프를 돌면서 d(n)함수가 진행되는 숫자들을 기록하고, 이에 해당하지 않는 수를 루프를 돌며 출력하여 해결하였습니다. 코드 package baekjoon; public class J4673 { static int[] arr = new int[10001]; static void d(int n) { int sum = 0; for(int i=0; i