일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 이분탐색
- MySQL
- Mendix
- 매개변수 탐색
- microflow
- lcap
- 집합
- 트리
- 재귀
- Sort
- dfs
- 그래프
- 스택
- 자료구조
- git
- SQL
- 완전탐색
- 멘딕스
- 가중치없는그래프
- 자바
- 프로그래머스
- 반효경교수님
- 알고리즘
- Recursion
- domain model
- 백트래킹
- 해시맵
- 정렬
- algorithm
- Bruteforce
- Today
- Total
mondegreen
[240218] 알고리즘 리부트 10일차 - 백준 10250, 1730 자바 본문
[240218] 알고리즘 리부트 10일차 - 백준 10250, 1730 자바
앙갱 2024. 2. 18. 17:36[Part1-Chpater04-Clip06]
- 백준 10250 ACM호텔
배열을 그리지 않고 계산으로 풀었다. 손님에게 방 배정하는 방식이 명료해서 n번째 손님을 층으로 나누면 어느 라인에 배정받을지 알 수 있다. 나머지가 0이라면 해당 정수 나눗셈의 몫인 라인에 배정받고 층은 최상층이다. 나머지가 0이 아니라면 몫에 1을 더한 라인에 배정받고 층은 나머지와 동일하다.
package BaekJoon.simulation;
import java.util.Scanner;
public class BJ10250 {
public static int t, h, w, n;
public static void main(String[] args) {
solve();
}
private static void solve() {
Scanner sc = new Scanner(System.in);
t = sc.nextInt();
while (t-- > 0) {
h = sc.nextInt();
w = sc.nextInt();
n = sc.nextInt();
int floor = 0;
int line = 0;
int mod = n % h;
int quot = n / h;
if (mod == 0) {
line = quot;
floor = h;
} else {
line = quot + 1;
floor = mod;
}
System.out.printf("%d%02d", floor, line);
System.out.println();
}
}
}
이렇게 한 줄에도 작성 가능하다.
[Part1-Chapter04-Clip07]
- 백준 1730 판화
이동 전, 후의 위치를 모두 처리해줘야 한다는 점이 번거로웠지만 구현하는데 크게 어려움은 없었다. 중간중간 자잘한 실수는 r,c를 매번 전달받아서 연속적으로 이동할 수 있게 해줘야 했던 것과 줄바꿈을 먼저 처리해 출력 형식이 오류났던 것이다.
그리고 마지막으로 런타임 에러를 발생하게 했던 것은 이상하게 로봇 팔의 움직임 횟수가 0이라는 제약이 없는데도 Scanner가 입력을 받지 못해 오류가 발생하는 것이었다. hasNext()로 확인 후 처리하게 해서 정답처리를 받았다. 강의에 따르면 명령의 수가 최대값 250이라는 것만 정의되어 있고 최소에 대한 설명이 없기 때문에 그렇다고 한다. No Such Element라는 오류가 난다면 읽을 값이 없다는 것이니까 잊지말자!
package BaekJoon.bruteforce;
import java.util.Scanner;
public class BJ1730 {
public static int n, r, c;
public static char[][] draw;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
draw = new char[n][n];
// 모든 배열을 '.'으로 채우기
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
draw[i][j] = (char) 46;
}
String commands = "";
if (sc.hasNext()) commands = sc.next();
int idx = 0;
r = 0;
c = 0;
int nr, nc;
int[] currentLoc;
while (idx < commands.length()) {
switch (commands.charAt(idx)) {
case 'U':
nr = r - 1;
nc = c;
currentLoc = fillTheArray(r, c, nr, nc, (char) 124);
r = currentLoc[0];
c = currentLoc[1];
break;
case 'D':
nr = r + 1;
nc = c;
currentLoc = fillTheArray(r, c, nr, nc, (char) 124);
r = currentLoc[0];
c = currentLoc[1];
break;
case 'L':
nr = r;
nc = c - 1;
currentLoc = fillTheArray(r, c, nr, nc, (char) 45);
r = currentLoc[0];
c = currentLoc[1];
break;
case 'R':
nr = r;
nc = c + 1;
currentLoc = fillTheArray(r, c, nr, nc, (char) 45);
r = currentLoc[0];
c = currentLoc[1];
break;
}
idx++;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(draw[i][j]);
}
System.out.println();
}
}
private static int[] fillTheArray(int r, int c, int nr, int nc, char direction) {
if (nr >= 0 && nc >= 0 && nr < n && nc < n) { // 경계 내부에 있는 경우에만 처리
//System.out.println("처리 전 r: " + r + "c: " + c + "nr: " + nr + "nc: " + nc);
change(r, c, direction);
change(nr, nc, direction);
r = nr;
c = nc;
//System.out.println("처리 후 r: " + r + "c: " + c + "nr: " + nr + "nc: " + nc);
}
return new int[]{r, c};
}
private static void change(int r, int c, char direction) {
switch (draw[r][c]) {
case (char) 46:
draw[r][c] = direction;
break;
case (char) 124:
if (direction != (char) 124) {
draw[r][c] = (char) 43;
}
break;
case (char) 45:
if (direction != (char) 45) {
draw[r][c] = (char) 43;
}
break;
}
}
}
강의에서는 수평 기록에 대한 논리값 배열과 수직 기록에 대한 논리값 배열을 각각 생성해서 두개가 모두 true 인 경우, 모두 false인 경우 둘 중 하나만 true인 경우에 따라 각각에 맞는 기호를 출력해줬다. 나는 한 개의 char 배열에서 값을 확인하고 변경하는 작업을 여러번 수행했다면 강의에서는 두개의 논리값 배열을 이용해서 알아보기 편하게 로직을 구현했다. 참 간단하게 푸셨다..
'알고리즘 풀이 및 리뷰 > [패캠] 핵심유형 20개로 한 번에 끝내는 알고리즘 코딩테스트 리뷰' 카테고리의 다른 글
[240220] 알고리즘 리부트 12일차 - 백준 2817 자바 (1) | 2024.02.20 |
---|---|
[240219] 알고리즘 리부트 11일차 - 백준 2840 자바 (1) | 2024.02.19 |
[240217] 알고리즘 리부트 9일차 - 백준 3085 자바 (0) | 2024.02.17 |
[240216] 알고리즘 리부트 8일차 - 백준 10448, 11005, 11068 자바 (0) | 2024.02.16 |
[240215] 알고리즘 리부트 7일차 - 백준 10989, 3273 자바 (0) | 2024.02.15 |