대망의 구현 뿌수기다. 가장 기본이면서 가장 중요하고 문제도 가장 많다.
긴 여정이 될 것 같다.
2167 2차원 배열의 합 - 실버5
https://www.acmicpc.net/problem/2167
2167번: 2차원 배열의 합
첫째 줄에 배열의 크기 N, M(1 ≤ N, M ≤ 300)이 주어진다. 다음 N개의 줄에는 M개의 정수로 배열이 주어진다. 배열에 포함되어 있는 수는 절댓값이 10,000보다 작거나 같은 정수이다. 그 다음 줄에는
www.acmicpc.net
- 누적합 냄새가 너무 나서 그렇게 풀었다
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[][] arr = new int[N+1][M+1];
for (int i =1; i<N+1; i++) {
st = new StringTokenizer(br.readLine());
for (int j =1; j<M+1; j++)
arr[i][j] = Integer.parseInt(st.nextToken()) + arr[i-1][j] + arr[i][j-1] - arr[i-1][j-1];
}
int cnt = Integer.parseInt(br.readLine());
for (int c=0; c<cnt; c++) {
st = new StringTokenizer(br.readLine());
int i = Integer.parseInt(st.nextToken());
int j = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
System.out.println(arr[x][y] - arr[x][j-1] - arr[i-1][y] + arr[i-1][j-1]);
}
}
}
- 역시나 맞았다
2563 색종이 - 실버5
https://www.acmicpc.net/problem/2563
2563번: 색종이
첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변
www.acmicpc.net
- 진짜 너무 안풀려서 힘들었다
- 결국 풀이를 찾아봤는데 허무했음..
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cnt = Integer.parseInt(br.readLine());
StringTokenizer st;
int[][] arr = new int[100][100];
for (int i =0; i<cnt; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
for (int j=0; j<10; j++) {
if (x+j == 100)
break;
for (int k=0; k<10; k++) {
if (y+k == 100)
break;
arr[x+j][y+k] = 1;
}
}
}
int result = 0;
for (int i =0; i<100; i++) {
for (int j =0; j<100; j++) {
if (arr[i][j] == 1)
result += 1;
}
}
System.out.println(result);
}
}
- 짜증나서 설명은 생략한다
1158 요세푸스 문제 - 실버4
https://www.acmicpc.net/problem/1158
1158번: 요세푸스 문제
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
www.acmicpc.net
- 좋은 방법이 떠오르지 않아 큐에다 무작정 넣고 뺐다
- 시간초과가 나길 바랐지만 시간초과는 나지 않았다
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
Queue<Integer> queue = new LinkedList<>();
for (int i= 1; i<=n; i++) {
queue.add(i);
}
int[] arr = new int[n];
int idx = 0;
while (idx != n) {
for (int i =0; i<k-1; i++) {
queue.add(queue.poll());
}
arr[idx] = queue.poll();
idx++;
}
StringBuilder sb = new StringBuilder();
sb.append("<");
for (int i =0; i<arr.length; i++) {
sb.append(arr[i]);
if (i != arr.length-1) {
sb.append(", ");
}
}
sb.append(">");
System.out.println(sb);
}
}
1244 스위치 켜고 끄기 - 실버4
https://www.acmicpc.net/problem/1244
1244번: 스위치 켜고 끄기
첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩
www.acmicpc.net
- 여자의 경우 현재 바뀐 값이 꼭 필요하기 때문에 하라는 대로 다 바꿔줬다
public class Main {
static boolean[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cnt = Integer.parseInt(br.readLine());
arr = new boolean[cnt+1];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i =1; i<arr.length; i++) {
int value = Integer.parseInt(st.nextToken());
if (value == 1)
arr[i] = true;
}
int studentCnt = Integer.parseInt(br.readLine());
for (int i =0; i<studentCnt; i++) {
st = new StringTokenizer(br.readLine());
int gender = Integer.parseInt(st.nextToken()); //1이면 남자, 2면 여자
int number = Integer.parseInt(st.nextToken());
if (gender == 1)
manChange(number);
else
womanChange(number);
}
StringBuilder sb= new StringBuilder();
for (int i=1; i<arr.length; i++) {
if (arr[i] == true)
sb.append("1");
else
sb.append("0");
if (i % 20 == 0)
sb.append("\n");
else
sb.append(" ");
}
System.out.println(sb);
}
private static void womanChange(int number) {
arr[number] = !arr[number];
for (int a = 1; a<arr.length; a++) {
if (number - a >= 1 && number + a < arr.length && arr[number -a] == arr[number +a]) {
arr[number -a] = !arr[number -a];
arr[number +a] = !arr[number +a];
} else {
break;
}
}
}
private static void manChange(int number) {
int n= number;
while (n < arr.length) {
arr[n] = !arr[n];
n += number;
}
}
}
- 출력형식에서 20마다 라인을 바꿔야한다는 것만 조심하면 될 것 같다(정답률 20퍼의 원인인듯)
1748 수 이어 쓰기 1 - 실버4
https://www.acmicpc.net/problem/1748
1748번: 수 이어 쓰기 1
첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.
www.acmicpc.net
- 분명 그냥 세면 시간초과가 날 것 같아서 규칙을 찾았다
- 1~9까지 : 1자릿수이고 9개
- 10~99까지 : 2자릿수이고 90개
- 100~999까지 : 3자릿수이고 900개
- 1000~9999까지: 4자릿수이고 9000개
- 이 식으로 풀어내면 어렵지 않게 풀어낼 수 있음
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
int n = Integer.parseInt(input);
int size = input.length();
long result = 0L;
long cntNumber = 9;
int start = 1;
int currentSize = 1;
while (currentSize < size) {
result += cntNumber * currentSize;
cntNumber *= 10;
start *= 10;
currentSize++;
}
result += (n - start + 1) * currentSize;
System.out.println(result);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
| [JAVA] 백준 MST 뿌수기 1 (0) | 2024.02.25 |
|---|---|
| [JAVA] 백준 위상정렬 뿌수기 (0) | 2024.02.20 |
| [JAVA] 백준 비트마스킹 뿌수기2 (0) | 2024.01.06 |
| [JAVA] 백준 골드 모음(13023 ABCDE, 2170 선 긋기, 1976 여행 가자, 9251 LCS, 11729 하노이 탑 이동 순서) (1) | 2023.12.31 |
| [JAVA] 백준 트리 뿌수기4 (0) | 2023.12.23 |