목록자바 (15)
시간이 NullNull
문득 준홍이는 각 카드 세트에서 카드를 한 장씩 골라서 카드에 적힌 숫자를 합한 결과 중, 등장할 확률이 가장 높은 숫자는 어떤 숫자일지 궁금해졌다. 단, 카드 세트에서 어떤 카드를 선택할 확률은 모두 동일하다고 가정한다. 이를 계산하는 프로그램을 작성하라. 카드 두세트가 있고 여기서 숫자들의 합중 가장 빈도수가 많은 합을 출력한다. 단, 밑에 제약 조건으로 오름차순으로 정렬하라고 되어 있다. 이 문제의 경우 매우 간단하게 풀릴 수 있다. N, M 이 주어질 때 더 큰수를 먼저 찾는다. 예를 들어 N = 6, M= 3 일때 나올 수 있는 합은 2 ~ 9 까지의 수가 될 것이다. 이때 2는 1+1 , 9 는 3+9로 누가 봐도 제일 빈도수가 작을 것으로 예상된다. 그렇다면 이제 빈도수를 계산을 어떻게 할 ..
승현이는 N(2 ≤ N ≤ 10) 진법의 수 X(1 ≤ X ≤ N^10,000,000) 를 공책에 적었다. 승현이는 손이 점점 아프기 시작했고, 머릿속에서 문득 X를 (N-1)로 나눈 나머지가 궁금해졌다. 승현이를 도와 N진법의 수 X가 주어졌을 때에 X를 (N-1)로 나눈 나머지를 계산하는 프로그램을 작성하라. 예를 들면, 9진법의 수 234는 10진법으로 193이고, 8로 나눈 나머지는 1이 된다. 이 문제에서 정말 편하게 생각하면 주어진 수를 10진법으로 바꾸고 (N-1)을 % 연산하면 나머지가 구해지지 않나? 라고 생각할 수 있지만 N이 10,000,000이라는 것에 주목해야 한다. java의 경우 Integer.parseInt( '숫자', '진법' ) 을 하게 되면 알아서 숫자가 진법 변환되어 ..
고슴도치는 물이 찰 예정인 칸으로 이동할 수 없다. 즉, 다음 시간에 물이 찰 예정인 칸으로 고슴도치는 이동할 수 없다. 이동할 수 있으면 고슴도치가 물에 빠지기 때문이다. 이 문제의 포인트는 위의 문장이라고 생각이 들었다. 그렇다면 같은 시간에는 물이 먼저 이동하고 그 뒤에 고슴도치가 이동한다고 다르게 생각할 수도 있다고 생각하였고 물이 먼저 움직인 후에 고슴도치가 움직이면 되겠다고 생각하였다. 1. 한 사이클당 물이 한번 번진다.2. 한 사이클당 고슴도치가 한번 움직인다.2-1. 고슴도치가 못 움직이게 되면( 빠지는 경우 포함 ) 더이상 Queue에 다시 넣을 노드가 사라지게 됨으로 종료3. 도착하면 그때 몇 사이클 움직이게 되었는지 파악하여 결과값 출력 물의 좌표와 고슴도치의 좌표를 각각 Queue..
N이 주어질 때, 두 사람이 최선을 다해 게임을 한다면 어떤 사람이 이기게 되는지 출력하는 프로그램을 작성하라. 이 문제에서 가장 힘들었던 점이 최선을 다해 게임을 한다면 이었다. 처음에 모든 경우를 종이에 적어 구해보았는데 숫자가 작은 수부터 시작한다면 경우의 수가 너무 많아지고 계산식이 복잡해 지는 것을 확인하고 역으로 N부터 시작해보았다. 예를 들어 N이 100일때 1. 내가 이기기 위해서는 다음 사람이 무조건 100 "초과" 하는 숫자를 부르게 해야함으로 내가 51 을 부르면 다음 사람은 최소 102를 부르게 되므로 무조건 이길 수 있다. 2. 반대로 그렇다면 나의 상대는 내가 51을 부를 수 없도록 24라는 숫자를 불러 내가 최대 49의 숫자를 부를 수 밖에 없게 만든다. 이 두가지를 반복하게 ..
첫째 줄에 지도의 세로 크기 N과 가로 크기 M이 주어진다. (3 ≤ N, M ≤ 8)둘째 줄부터 N개의 줄에 지도의 모양이 주어진다. 0은 빈 칸, 1은 벽, 2는 바이러스가 있는 위치이다. 2의 개수는 2보다 크거나 같고, 10보다 작거나 같은 자연수이다.빈 칸의 개수는 3개 이상이다. 라는 문구가 가장 먼저 눈에 띄었고 N이 8이하 벽은 3개 라는 것에 착안점을 두어 3중 for문으로 벽을 세울 인덱스를 정한뒤 바이러스가 퍼지도록 bfs를 하여 그 때 남은 0의 갯수를 세어 확인하였다. 3중 for문을 작성할때 ( 3개의 점을 고를때 ) 같은 점을 찍지 않도록 그리고 0인점만 골라 벽을 세울 수 있도록 다음과 같이 작성하였다.첫번째 for문 기준으로 idx / M(가로크기) 는 일반적인 배열의 i ..