본문 바로가기

백준756

[자바] 백준 22943 - 수 (java) 문제 : boj22943 필요 알고리즘 개념 브루트포스 가능한 모든 경우에 대해 완전탐색을 통해 경우의 수를 찾아줄꺼다. 에라토스테네스의 체 소수 판정 알고리즘이다. 한 개의 수가 소수인지 판정할때는 안쓰인다. 이 문제에서는 특정 범위 이내의 모든 소수를 찾아두고 풀이를 진행할 것이므로 에라토스테네스의 체를 사용했다. ※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다. 풀이 우선 이 문제를 풀기위해 알아야 하는 것들을 생각해보자. 1... 2022. 7. 28.
[자바] 백준 24839 - Speed Typing (java) 문제 : boj24839 필요 알고리즘 개념 문자열 파싱 String을 character 단위로 볼 줄 알아야 한다. 그리디 알고리즘 (greedy) I의 모든 문자가 순서대로 P에 존재해야 하는지를 매번 '그리디하게' 확인한다. 두 포인터 (two pointer) I와 P의 시작점에 가상의 포인터를 하나씩 두고 양측이 점점 움직이면서 답을 찾아나가야 한다. ※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다. 풀이 I는 읽기 힘드므로,.. 2022. 7. 27.
[자바] 백준 2195 - 문자열 복사 (boj java) 문제 : boj2195 p의 각 부분 문자열들에 대해 가장 s에 많이 포함되도록 골라주면 된다. 예를들어 예제 입력 1의 경우엔 다음과 같다. xy0z zzz0yyy0xxx 위의 경우로만 보면 헷갈릴수도 있으니 다음의 예시를 봐보자. abxyz abababxyzzz 위와 같이 p를 각 부분문자열로 나눴을 때의 각 부분문자열이 s에 가장 많이 포함되게 해주면 된다. 그럼 이 부분문자열 구간을 어떻게 나눌 수 있을까? 간단하게, p의 첫번째 문자부터 차례대로 보면서 s에 포함되어있는 최대 부분문자열까지 잘라내면 된다. 예를들어 위의 예제는 다음과 같이 진행된다. 1. abababxyzzz "a"는 s에 포함되므로 좀 더 봐보자. 2. abababxyzzz "ab"도 s에 포함되므로 좀 더 봐보자. 3. ab.. 2022. 7. 26.
[자바] 백준 23809 - 골뱅이 찍기 - 돌아간 ㅈ (boj java) 문제 : boj23809 규칙을 찾고 구현해보자! 1. n줄에 n개의@ + 3n개의 공백 + n개의@ 2. n줄에 n개의@ + 2n개의 공백 + n개의@ 3. n줄에 3n개의 @ 4. n줄에 n개의@ + 2n개의 공백 + n개의@ 5. n줄에 n개의@ + 3n개의 공백 + n개의@ 이렇게 구현해주면 된다. 코드 : github import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { private void print(int n, StringBuilder sb, int gap) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { sb.append('@').. 2022. 7. 25.
[자바] 백준 24524 - 아름다운 문자열 (boj java) 문제 : boj24524 'S 에서의 순서대로 이어 붙여' 부분이 가장 중요하다. 예제 입력 2번처럼 순서가 안맞으면 카운팅을 하면 안된다. 그럼 이걸 어떻게 알 수 있을까? 이하의 말로 설명한 로직을 생각해보자. 1. s의 각 문자열의 문자(character)를 처음부터 순서대로 확인하면서.. 2. 각 문자가 t에 존재하는 문자가 아니라면 무시한다. 3. 현재 s에서 보고 있는 문자를 c라고 하자. t에서 c가 나온 위치 직전의 문자를 bf라고 하자. 예를들어 c가 'a'이고, t가 "bac"라면 bf는 'b'이다. 이제 여기가 중요하다. 현재까지 s에서 나온 각 문자의 횟수를 cnt[] 라고 하자. 즉 c가 현재까지 나온 횟수는 cnt[c]이다. 이 때, cnt[c] >= cnt[bf] 라면, 현재 .. 2022. 7. 24.
[자바] 백준 1682 - 돌리기 (boj java) 문제 : boj1682 내 경우 String을 기준으로 한 bfs로 풀었다. 우선 수열이 '1,2,3,4,5,6,7,8' 이라고 한다면 이걸 String으로 "12348765"로 변경한다. 즉 수열의 순서와 관계없이 그냥 내가 알아보기 편하게 배열에 나타나는 순서대로 String으로 만들었다. 어떻게 하든 상관은 없다. 마찬가지로 입력이 '6 4 2 8 1 3 5 7'일 경우 String으로는 "64287531"로 표현했다. 이런식으로 입력으로 들어온 값을 String으로 변환한걸 GOAL, 시작 수열을 String으로 변환한 "12348765"를 START라고 해보자. 그럼 이제 A, B, C, D의 4가지 변환 과정을 거쳐 START에서 GOAL로 최소 몇 번 만에 변환되는지 알 수 있으면 된다. 이.. 2022. 7. 23.
[자바] 백준 10504 - 덧셈 (boj java) 문제 : boj10504 24의 경우 7+8+9가 답이다. 대충 봐도 중간 특정 지점에서 시작되는 숫자에 대해, 몇 개의 합인지도 지정되지 않은 상태로 연속되는 양의 정수의 구간을 찾기란 어려워 보인다. 개인적으로 수학이 약해서 정말 어려웠다 ㅠ. 약간 생각을 바꿔서, 그럼 중간부터 시작되지 않고 항상 1부터 시작된다고 해보자. 즉, a까지의 합이라고 하면 1+2+...+a 가 N이라고 하면 어떨까? 이건 상대적으로 쉬워보인다. a는 최대 44720이니깐(44720x44721/2 = 999,961,560 이고, 문제에서 제시된 입력값의 최대치가 10^9 이므로 최대 44720 까지만 보면 된다.), O(44720)으로 찾을 수 있다. 그리고 a를 2부터 44720까지 증가시키면서 확인해보면 '만약 여러 .. 2022. 7. 22.
[자바] 백준 18114 - 블랙 프라이데이 (boj java) 문제 : boj18114 1. 한 개만 선택해서 C가 되는 경우 (코드 19~22line 참고) 이 경우는 간단하다. N개를 입력받으면서 해당 값이 C인 경우를 찾으면 된다. O(N) 2. 두 개를 선택해서 C가 되는 경우 (코드 24~31line 참고) 이 경우도 어렵지 않다. 미리 N개를 입력받으면서 배열에도 기록해두고, HashSet에도 기록을 해둔다고 해보자. 이후 배열을 순회하면서 현재 보고 있는 값이 A라고 할 때, HashSet에 C-A가 존재하는지만 확인해주면 된다. 주의점은 A != C-A 여야 한다(동일한 물건을 두 개 고르면 안되고, 모든 물건은 무게가 다르므로 A와 C-A가 동일할 수 없다). O(2N) 3. 세 개를 선택해서 C가 되는 경우 (코드 32~41line 참고) 이 경우.. 2022. 7. 21.
[코틀린, 자바] 백준 1094 - 막대기 (boj kotlin java) 문제 : boj1094 결국 64에서 시작해서 2씩 나눠가면서 나오는 64, 32, 16, 8, 4, 2, 1을 하나씩만 사용해서 숫자 X를 표현하는 문제이다. 눈썰미가 있다면 막대기로 바꿔서 표현했지만 결국 2진법 표현방식과 동일하다는 것을 알 수 있을 것이다. 즉, 이 문제는 X라는 10진수를 받아서 2진법으로 표현했을 때 비트가 1인게 몇개냐고 묻는 문제와 동일하다. 예를들어 23을 보자. 23을 2진법으로 표현하면, 23=16+4+2+1 이므로 다음과 같다. 23(10) = 0010111(2) 그럼 저 비트 1인 부분에 막대기가 하나씩 들어가주면 된다. 따라서 비트의 수를 세보면 4개이므로 4가 답이다. 이하 코드에서 자바의 경우엔 직접 비트를 세줬다. 그리고 코틀린으로는 Integer.bitCo.. 2022. 7. 20.
[자바] 백준 12100 - 2048 (Easy) (boj java) 문제 : boj12100 (상당히 귀찮은편인) 단순 시뮬레이션 문제이다. 최대 5번 이동이라고 했으므로, 처음 상태에서 상하좌우 4방향으로 움직이는걸 최대 5번 반복하면 된다. 즉, 최대 4^5번으로 모든 경우를 확인할 수 있다. 이 때 각 방향마다 NxN 칸의 모든 것들을 해당방향으로 움직여야 한다고 볼 수 있으므로 대략 O(N^2 x 4^5)의 시간복잡도가 된다. 그럼 남은건 상하좌우 방향으로 움직인다고 할 때, 문제에서 제시된 방법대로 동작만 되도록 시뮬레이션을 구현해주면 된다. 이 때 주의점은 예를들어 아래와 같은 경우를 보자. 2 0 0 2 0 0 2 0 0 위와 같은 경우 우측 방향으로 모두 이동시킨다고 했을 때, 우측으로 모두 붙어야 할 것이다. [A] 0 2 0 0 2 0 0 2 0 [B].. 2022. 7. 20.