목록Study/Problem Solving (163)
전공공부
각각 1개의 돌 또는 3개의 돌을 가져가고 성근이가 무조건 먼저 시작한다. 이때, 돌의 갯수를 주어준다. 이긴 사람을 출력하라 (성근 : SK , 창영 : CY) 원래는 dp로 풀어야 하는데 dp를 나열 해보면 알겠지만 짝수면 성근이고 홀수면 창영이가 출력이된다. dp[1] = true; dp[2] = false; dp[3] = true; ... import java.util.Scanner; public class BOJ_9655_돌게임 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); if(N%2 == 1){ System.out.println("SK"); }else{ Sy..
비트 마스킹 ^ 연산 -> 서로 반대 일 시 1을 출력함 0^0 = 0 0^1 = 1 1^0 = 1 1^1 = 0 | 연산 -> 1이 하나라도 있을시 1출력 1|1 = 1 1|0 = 1 0|1 = 1 0|0 = 0 & 연산 -> 둘다 같을 시 1 출력 > 쉬프트 연산 1 (100(이진수) => 4) 4 >>2 -> (1(이진수) => 1) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class BOJ_11723_집합 { public static void main(String[] args) throws IOExce..

위 선을 잘 보면 1 -> 6 -> 12 -> 18 즉, 6의 배수로 늘어나는 규칙을 발견 할 수 있다. 그렇다면 27으로 가기 위해서는 1 + 6*1 + 6*2 + 6*3 = 37 이내이고 1 + 6*1 + 6*2 = 19 이상이다. 그러면 해당 사이인 위치로 가기 위해서는 총 4번을 움직여야 갈 수 있다는 것을 알 수 있다. 13의 경우 : 1 + 6*1 + 6*2 = 19 이내이고 1 + 6*1 = 7 이상이다. 총 3번을 움직여야 갈 수 있다. 이를 구현하면 된다. import java.util.Scanner; public class BOJ_2292_벌집 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); ..
문제에서 어떻게 구현해야 하는지 설명해주니 그대로 문제를 풀이하면 된다. package Simulation; import java.util.Scanner; public class BOJ_5073_삼각형과_세_변{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(true){ int a = sc.nextInt(); int b = sc.nextInt(); int c = sc.nextInt(); if(a == 0 && b == 0 && c == 0){ return; } int max = Math.max(a, Math.max(a, c)); System.out.println(change(max, a, b, c));..
n + 1, m+1 만큼 자리를 띄워서 앉아야 하므로 덧샘을 진행하고 H,W에 대해서 크기를 거기서 나눈 만큼이 남는 크기가 되는데 n+1,m+1로 만들었을때 사각형 외의 부분에도 실제로 사람이 앉을 수 있으므로 Math.ceil을 통해서 남는 자리는 반올림 해버린다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class BOJ_23971_ZOAC4 { public static void main(String[] args) throws IOException{ BufferedReader in = new BufferedReader(new I..
해당 숫자까지 도달을 하기 위해서 최소한의 연산으로 얼마만에 가는지를 구하는 것이 문제이다. dp를 이용해서 최소한의 움직임을 계산하기 위해서 Math.min 함수를 사용해서 얼마 안 움직인 것을 캐치하고, y 값 위치 전까지 카운팅을 진행하는 코드이다. import java.util.*; class Solution { public int solution(int x, int y, int n) { int answer = 0; int dp[] = new int[1_000_001]; Arrays.fill(dp, -1); dp[x] = 0; for(int i = x; i
import java.util.*; class Solution { public int solution(int[][] targets) { int answer = 1; Arrays.sort(targets,(o1,o2) -> o1[1] - o2[1]); int idx = 0; int max = targets[0][1]; while(idx < targets.length - 1){ if(max
어떻게 풀지 감을 잡지 못하여 다른 분의 블로그를 참조하였다. 핵심은 투포인터 형식으로 풀어 나가는 것인데 left, right 처음에는 두 지점 모두 0번째 인덱스에서 시작하다가 처음으로 부분 수열의 합인 k 보다 커지게 되면 left를 상승시키고 기존에 넣었던 수를 빼낸다. 또는 처음으로 k와 같은 수를 만나게 되면 정답 후보에 넣는다. 또는 부분 수열의 합보다 값이면 right를 상승시키고 수를 하나 더 넣게 된다. 이를 반복하는데 right 및 left가 length를 벗어나게 되면 안되므로 해당 조건을 위한 if문을 적용하고 right 상승시에도 right가 length 이상이면 배열 예외처리에 잡히므로 조건을 작성하였으며 left 상승시에도 마찬가지로 조건을 처리한다. 그리고, left와 ri..