Skip to content

Commit 6898352

Browse files
committed
[Gold V] Title: 사다리 타기, Time: 120 ms, Memory: 14648 KB -BaekjoonHub
1 parent d9c2d1c commit 6898352

File tree

2 files changed

+135
-0
lines changed

2 files changed

+135
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# [Gold V] 사다리 타기 - 2469
2+
3+
[문제 링크](https://www.acmicpc.net/problem/2469)
4+
5+
### 성능 요약
6+
7+
메모리: 14648 KB, 시간: 120 ms
8+
9+
### 분류
10+
11+
구현, 문자열
12+
13+
### 제출 일자
14+
15+
2025년 2월 11일 16:58:02
16+
17+
### 문제 설명
18+
19+
<p>k명의 참가자들이 사다리 타기를 통하여 어떤 순서를 결정한다. 참가자들은 알파벳 대문자 첫 k개로 표현되며, 사다리 타기를 시작할 때의 순서는 아래 그림과 같이 항상 알파벳 순서대로이다. </p>
20+
21+
<p>k=10 인 예를 들어 보자. 10명의 A, B, C, D, E, F, G, H, I, J 참가자들이 사다리 타기를 준비한다. 아래 그림은 10개의 세로 줄과 5개의 가로 줄을 가지고 있는 사다리의 한 예를 보여주고 있다. </p>
22+
23+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/4fe4986f-aff1-4327-9ce0-a89d8ebeb571/-/preview/" style="width: 259px; height: 193px;"></p>
24+
25+
<p>이 사다리에서 점선은 가로 막대가 없음을, 굵은 가로 실선은 옆으로 건너갈 수 있는 가로 막대가 있음을 나타내고 있다. </p>
26+
27+
<p>따라서 위에 제시된 사다리를 타면 그 최종 도달된 순서는 왼쪽으로부터 A, C, G, B, E, D, J, F, I, H 가 된다. </p>
28+
29+
<p>사다리 타기는 세로 막대를 타고 내려오는 중에 가로막대를 만나면 그 쪽으로 옮겨 가면서 끝까지 내려가는 과정이다. 따라서 사다리 타기의 규칙 특성상 아래 그림과 같이 두 가로 막대가 직접 연결될 수는 없으므로 이 상황은 이 문제에서 고려할 필요가 없다.</p>
30+
31+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/58fff896-8c40-4251-9e1b-93c8256beb7c/-/preview/" style="width: 44px; height: 48px;"></p>
32+
33+
<p>우리는 하나의 가로 줄이 감추어진 사다리를 받아서 그 줄의 각 칸에 가로 막대를 적절히 넣어서 참가자들의 최종 순서가 원하는 순서대로 나오도록 만들려고 한다. </p>
34+
35+
<p>입력에서 사다리의 전체 모양은 각 줄에 있는 가로 막대의 유무로 표현된다. 각 줄에서 가로 막대가 없는 경우에는 ‘<code>*</code>’(별)문자, 있을 경우에는 ‘<code>-</code>’(빼기) 문자로 표시된다. 그리고 감추어진 특정 가로 줄은 길이 k-1인 ‘<code>?</code>’ (물음표) 문자열로 표시되어 있다. </p>
36+
37+
### 입력
38+
39+
<p>첫 줄에는 참가한 사람의 수 k가 나온다(3 ≤ k ≤ 26). 그 다음 줄에는 가로 막대가 놓일 전체 가로 줄의 수를 나타내는 n이 나온다(3 ≤ n ≤ 1,000). 그리고 세 번째 줄에는 사다리를 타고 난 후 결정된 참가자들의 최종 순서가 길이 k인 대문자 문자열로 들어온다. </p>
40+
41+
<p>k와 n, 그리고 도착순서 문자열이 나타난 다음, 이어지는 n개의 줄에는 앞서 설명한 바와 같이 ‘<code>*</code>’와 ‘<code>-</code>’ 문자로 이루어진 길이 k-1인 문자열이 주어진다. 그 중 감추어진 가로 줄은 길이가 k-1인 ‘<code>?</code>’ 문자열로 표시되어 있다.</p>
42+
43+
### 출력
44+
45+
<p>입력 파일 세 번째 줄에서 지정한 도착순서가 해당 사다리에서 만들어질 수 있도록 감추어진 가로 줄을 구성해야 한다. </p>
46+
47+
<p>여러분은 감추어진 가로 줄의 상태를 재구성하여 이를 ‘<code>*</code>’(별) 문자와 ‘<code>-</code>’(빼기) 문자로 구성된 길이 k-1인 문자열로 만들어 출력하면 된다.</p>
48+
49+
<p>그런데 어떤 경우에는 그 감추어진 가로 줄을 어떻게 구성해도 원하는 순서를 얻을 수 없는 경우도 있다. 이 경우에는 ‘<code>x</code>’(소문자 엑스)로 구성된 길이 k-1인 문자열을 출력해야 한다.</p>
50+
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
5+
public class Main {
6+
static int K,N;
7+
static char[][] ladder;
8+
static int blankLine;
9+
public static void main(String[] args) throws IOException {
10+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
11+
StringBuilder sb = new StringBuilder();
12+
13+
K = Integer.parseInt(br.readLine());
14+
N = Integer.parseInt(br.readLine());
15+
16+
17+
char [] origin = new char[K];
18+
for (int i = 0; i < K; i++) {
19+
origin[i] = (char)('A' + i);
20+
}
21+
22+
char [] result = br.readLine().toCharArray(); //string으로 받고 for문으로 char배열에 넣었는데 toCharArray() 사용하면 한번에..
23+
24+
ladder = new char[N][K - 1];
25+
26+
for (int i = 0; i < N; i++) {
27+
String input = br.readLine();
28+
29+
//?로 채워진 blank 찾아두기
30+
if (input.charAt(0) == '?') {
31+
blankLine = i;
32+
continue;
33+
}
34+
ladder[i] = input.toCharArray();
35+
}
36+
37+
38+
// 위에서 아래로
39+
for (int i = 0; i < blankLine; i++) {
40+
for (int j = 0; j < K - 1; j++) {
41+
// 가로 막대를 만났을 때 swap
42+
if (ladder[i][j] == '-') {
43+
char tmpChar = origin[j];
44+
origin[j] = origin[j + 1];
45+
origin[j + 1] = tmpChar;
46+
}
47+
}
48+
}
49+
50+
//아래에서 위로
51+
for (int i = N - 1; i > blankLine; i--) {
52+
for (int j = 0; j < K - 1; j++) {
53+
if (ladder[i][j] == '-') {
54+
char tmpChar = result[j];
55+
result[j] = result[j + 1];
56+
result[j + 1] = tmpChar;
57+
}
58+
}
59+
}
60+
61+
//최종 두 결과를 비교
62+
for (int i = 0; i < K - 1; i++) {
63+
// 서로 같으면 *
64+
if (origin[i] == result[i]) {
65+
sb.append("*");
66+
}
67+
// 인덱스 하나 차이라면 가로막대를 놔야하므로 -
68+
else if (origin[i] == result[i + 1]) {
69+
sb.append("-");
70+
// 그대로 진행하면 다음 반복에서 또 가로막대를 놓기 때문에 swap
71+
char tmpChar = origin[i];
72+
origin[i] = origin[i + 1];
73+
origin[i + 1] = tmpChar;
74+
}
75+
//2칸 이상 차이나서 swap이 안되는 경우 x로 채우고 리턴
76+
else {
77+
sb = new StringBuilder(); //기존 sb 버퍼를 공유하므로 새로운 객체 만들어 초기화 후 출력
78+
sb.append("x".repeat(K - 1)); //반복하여 채울때 for루프 대신 repeat으로
79+
break;
80+
}
81+
}
82+
System.out.print(sb);
83+
}
84+
85+
}

0 commit comments

Comments
 (0)