본문 바로가기

PS831

[ABC251] C - Poem Online Judge (AtCoder Beginner Contest 251 in Java) 문제 : abc251_c 만약 공통된 String 부분이 없다고 생각해보자. 그럼 단순히 입력 중 최대 T값이 인덱스를 출력해주면 될 것이다. 다만 이 문제에서는 S를 기준으로 중복된 값이 들어왔다면 해당 값은 무시해줘야 한다. 동일한 String이 들어왔는지 확인하는 가장 간단한 자료구조는 HashSet을 사용하는 것이다. 따라서 HashSet으로 이미 들어온 값이라면 무시하고, 그렇지 않다면 HashSet에 등록하고 최대값인지 체크하면 된다. 코드 : github ... private void solution() throws Exception { int n = nextInt(); HashSet hs = new HashSet(); int max = 0; int maxIdx = 0; for (int i .. 2022. 5. 15.
[ABC251] B - At Most 3 (Judge ver.) (AtCoder Beginner Contest 251 in Java) 문제 : abc251_b 1~3개의 합이 W이하인지 확인하는 문제이다. 최소 1개, 최대 3개를 모두 골라보면 된다. 따라서 모든 경우를 확인하는데 O(N^3)이 필요하며, N이 최대 300개이므로 시간은 널널하다. 중간에 합이 W보다 커지는 경우 해당 경우를 확인하지 않는 백트래킹 개념도 더하면 더 효율적으로 짤 수 있다. 주의점은 모든 경우 중, W이하를 만족하는 모든 경우를 구하는게 아니라 그러한 합계를 구해야 한다. 따라서 HashSet 등을 통해 중복된 값은 카운팅 하지 않도록 별도로 처리가 필요하다. 코드 : github ... int n, w, ans=0; int[] arr; boolean[] v; HashSet hs = new HashSet(); private void proc(int id.. 2022. 5. 15.
[ABC251] A - Six Characters (AtCoder Beginner Contest 251 in Java) 문제 : abc251_a S를 6/|S| 번 반복출력해주면 된다. 코드 : github ... private void solution() throws Exception { String s = nextLine(); String ans = ""; for (int i = 0; i < 6/s.length(); i++) { ans += s; } System.out.println(ans); } ... 2022. 5. 15.
그동안의 참여했던 백준 대회들 후기 어제 열린 곰곰컵을 참여하고 생각해보니 잡글로 하나정돈 써도 좋을 것 같아서 작성해본다. 백준 대회 (백준 플랫폼에 개최된 코딩 대회)는 지금까지 4번 참여했었다. 1. 실버컵 (2022-03-12) 결과 : 0솔 ㅠㅠ 실버컵이래서 실버문제 위주로 나올 줄 알았다. 설명에서도 '인류가 풀 수 있는 난이도를 지향'한댔는데.. 내 실력으론 하나도 못풀어서 인류가 아님을 인증받았다. 난이도는 젤 쉬운게 골드고, 나머진 플래 이상이었던걸로 기억한다. 실버컵이라면서 한 문제도 실버 문제가 없었어... ㅂㄷㅂㄷ 2. 진짜 최종 구데기컵 2 2 (2022-04-01~02) 결과 : 67등 / 805명 뼛속까지 공대생인 것 같은 출제진들의 이과적 변태력을 즐겁게 당할 수 있는 멋진 대회였다. '진짜' 이과 변태란 무엇.. 2022. 5. 15.
[자바] 백준 24155 - 得点 (Score) (boj java) 문제 : boj24155 다음의 표를 보자. (A)는 애초에 입력이 내림차순이고 겹치는 점수가 없는 경우이다. 이 경우 등수는 순서대로가 될 것이다. (B)는 내림차순이지만, 겹치는 점수가 있는 경우이다. 이 경우 이전과 점수가 같다면 등수도 이전과 동일하고, 이전과 점수가 다를 경우 현재 자신의 위치를 출력하면 순서대로 등수를 출력할 수 있다. 이 문제의 경우 처음에 정렬이 되어 들어오지 않는다. 따라서 (C)와 같이 정렬한 후 등수를 매겨보자. (A), (B)와 달리 '학생'부분의 숫자가 뒤죽박죽인 것을 알 수 있다. 정렬 후 등수를 매기는 것은 (A), (B)와 동일하다. 이후 (D)와 같이 학생 번호 순서대로 다시 정렬하면 처음 입력된 순서대로 등수를 출력할 수 있다. 코드 : github imp.. 2022. 5. 15.
[자바] 백준 10025 - 게으른 백곰 (boj java) 문제 : boj10025 x는 0부터 1000000까지의 좌표값이다. 그리고 [x-k, x+k] 구간내에 있는 얼음의 합을 구할 수 있다면, 모든 구간을 보면서 최대치만 찾으면 된다. 슬라이딩 윈도우 혹은 prefix sum을 계산해서 구하면 된다. prefix sum으로 할 경우, 좌표별로 prefix sum 배열(이하 ps[])을 만들고 이후 좌표 a에서 잡을 수 있는 얼음의 합은 ps[a+k]-ps[a-k-1]가 될 것이다. 따라서 a를 k부터 n-k까지 증가시키면서 각 O(1)로 a 위치에서의 얼음의 합을 구할 수 있으므로 O(|x|) (x의 크기는 1000000)으로 답을 구할 수 있다. 이하 코드는 슬라이딩 윈도우 방식으로 짠 코드이다. 슬라이딩 윈도우도 비슷하다. a를 k부터 n-k까지 증가.. 2022. 5. 14.
[자바] 백준 13552 - 구와 쿼리 (boj java) 문제 : boj13552 처음엔 시간 제한을 안보고 다음과 같이 생각했다. x,y,z값을 sqrt(1000000)정도씩 구간을 나눠서 연산을 줄이면 어찌저찌 되지 않을까 싶었다. 하지만, 시간 제한을 보니 출제 의도가 그냥 한번 해보라는 것 같았다. 모든 경우를 살펴본다고 하면, O(NM)으로 사실 무리가 있을 것 같긴 했는데, 시간 제한이 20초나 되므로 일단 해보기로 했다(자바의 경우 주어진 시간 x2+1초 이므로 총 41초 제한이다.). 그래도 만만치 않은 수치이므로 입출력 모두 빠르게 되도록 짰고, 연산이 느리고 불명확해서 틀릴 가능성이 있는 double을 사용하지 않도록 짰다. 참고로 3차원에서 두 점 (a,b,c), (x,y,z)의 거리는 (A)와 같이 구할 수 있다. 이 문제에서는 반지름이 .. 2022. 5. 13.
[자바] 백준 14425 - 문자열 집합 (boj java) 문제 : boj14425 해쉬에 대한 개념을 알고, HashSet 자료구조를 알고 있다면 간단하게 풀 수 있다. N개를 HashSet에 넣고, M개를 입력받으면서 HashSet에 존재하는지 확인하면 된다. 코드 : github import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.HashSet; import java.util.StringTokenizer; public class Main { private void solution() throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTok.. 2022. 5. 13.
[자바] 백준 25083 - 새싹 (boj java) 문제 : boj25083 예제 출력대로 자바에서 출력만 잘 해주면 된다. 여기서 주의할 점은 \을 출력하려면 \\를 작성해야 한다는 점과 "를 작성하려면 \"로 작성해야 한다는 점 이다. 다만 자바의 거의 모든 경우에 복붙하면 알아서 문자열을 잘 생성해주므로, 그냥 복붙만 해도 된다. 코드 : github public class Main { private void solution() throws Exception { System.out.println(" ,r'\"7\n" + "r`-_ ,' ,/\n" + " \\. \". L_r'\n" + " `~\\/\n" + " |\n" + " |"); } public static void main(String[] args) throws Exception { new .. 2022. 5. 13.
[자바] 백준 5591 - 最大の和 (boj java) 문제 : boj5591 n개의 데이터에서 연속된 k개의 합이 최대인 지점을 찾으면 된다. 두 가지 정도로 해볼 수 있다. 이하 예시는 다음 입력을 이용해 설명하겠다. 5 3 2 5 -4 10 3 1. 슬라이딩 윈도우 처음 k개의 합을 구한다(A). k개의 윈도우를 옆으로 옮겨다니듯이 생각하면 된다. 그럼 윈도우를 우측으로 한 칸 이동한다면, 직전 윈도우 위치의 첫번째 위치의 값을 빼고 이번에 새로 추가된 값을 더해주면 된다. 이런식으로 이동하면서 최대값을 구하면 된다. O(N) 2. prefix sum 입력을 받을 때 미리 누적합을 계산해둔다. 그렇다면 i번 인덱스에서 이전 k개 원소들의 합은 arr[i]-arr[i-k]가 된다. 이걸 i를 k부터(그래야 i-k가 0 미만으로 안내려갈테니) n까지 증가시.. 2022. 5. 12.