๋ฌธ์ ์ค๋ช
https://school.programmers.co.kr/learn/courses/30/lessons/160586
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก์ Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
ํด๋ํฐ์ ์ํ์ ์ปดํจํฐ ํค๋ณด๋ ์ํ๊ณผ๋ ๋ค๋ฅด๊ฒ ํ๋์ ํค์ ์ฌ๋ฌ ๊ฐ์ ๋ฌธ์๊ฐ ํ ๋น๋ ์ ์์ต๋๋ค. ํค ํ๋์ ์ฌ๋ฌ ๋ฌธ์๊ฐ ํ ๋น๋ ๊ฒฝ์ฐ, ๋์ผํ ํค๋ฅผ ์ฐ์ํด์ ๋น ๋ฅด๊ฒ ๋๋ฅด๋ฉด ํ ๋น๋ ์์๋๋ก ๋ฌธ์๊ฐ ๋ฐ๋๋๋ค.
์๋ฅผ ๋ค์ด, 1๋ฒ ํค์ "A", "B", "C" ์์๋๋ก ๋ฌธ์๊ฐ ํ ๋น๋์ด ์๋ค๋ฉด 1๋ฒ ํค๋ฅผ ํ ๋ฒ ๋๋ฅด๋ฉด "A", ๋ ๋ฒ ๋๋ฅด๋ฉด "B", ์ธ ๋ฒ ๋๋ฅด๋ฉด "C"๊ฐ ๋๋ ์์ ๋๋ค.
๊ฐ์ ๊ท์น์ ์ ์ฉํด ์๋ฌด๋ ๊ฒ๋ ๋ง๋ ํด๋ํฐ ์ํ์ด ์์ต๋๋ค. ์ด ํด๋ํฐ ์ํ์ ํค์ ๊ฐ์๊ฐ 1๊ฐ๋ถํฐ ์ต๋ 100๊ฐ๊น์ง ์์ ์ ์์ผ๋ฉฐ, ํน์ ํค๋ฅผ ๋๋ ์ ๋ ์ ๋ ฅ๋๋ ๋ฌธ์๋ค๋ ๋ฌด์์๋ก ๋ฐฐ์ด๋์ด ์์ต๋๋ค. ๋, ๊ฐ์ ๋ฌธ์๊ฐ ์ํ ์ ์ฒด์ ์ฌ๋ฌ ๋ฒ ํ ๋น๋ ๊ฒฝ์ฐ๋ ์๊ณ , ํค ํ๋์ ๊ฐ์ ๋ฌธ์๊ฐ ์ฌ๋ฌ ๋ฒ ํ ๋น๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ์ฌ์ง์ด ์์ ํ ๋น๋์ง ์์ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ช๋ช ๋ฌธ์์ด์ ์์ฑํ ์ ์์ ์๋ ์์ต๋๋ค.
์ด ํด๋ํฐ ์ํ์ ์ด์ฉํด ํน์ ๋ฌธ์์ด์ ์์ฑํ ๋, ํค๋ฅผ ์ต์ ๋ช ๋ฒ ๋๋ฌ์ผ ๊ทธ ๋ฌธ์์ด์ ์์ฑํ ์ ์๋์ง ์์๋ณด๊ณ ์ ํฉ๋๋ค.
1๋ฒ ํค๋ถํฐ ์ฐจ๋ก๋๋ก ํ ๋น๋ ๋ฌธ์๋ค์ด ์์๋๋ก ๋ด๊ธด ๋ฌธ์์ด๋ฐฐ์ด keymap๊ณผ ์ ๋ ฅํ๋ ค๋ ๋ฌธ์์ด๋ค์ด ๋ด๊ธด ๋ฌธ์์ด ๋ฐฐ์ด targets๊ฐ ์ฃผ์ด์ง ๋, ๊ฐ ๋ฌธ์์ด์ ์์ฑํ๊ธฐ ์ํด ํค๋ฅผ ์ต์ ๋ช ๋ฒ์ฉ ๋๋ฌ์ผ ํ๋์ง ์์๋๋ก ๋ฐฐ์ด์ ๋ด์ return ํ๋ solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
๋จ, ๋ชฉํ ๋ฌธ์์ด์ ์์ฑํ ์ ์์ ๋๋ -1์ ์ ์ฅํฉ๋๋ค.
์ ํ ์ฌํญ
- 1 ≤ keymap์ ๊ธธ์ด ≤ 100
- 1 ≤ keymap์ ์์์ ๊ธธ์ด ≤ 100
- keymap[i]๋ i + 1๋ฒ ํค๋ฅผ ๋๋ ์ ๋ ์์๋๋ก ๋ฐ๋๋ ๋ฌธ์๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด keymap[0] = "ABACD"์ธ ๊ฒฝ์ฐ 1๋ฒ ํค๋ฅผ ํ ๋ฒ ๋๋ฅด๋ฉด A, ๋ ๋ฒ ๋๋ฅด๋ฉด B, ์ธ ๋ฒ ๋๋ฅด๋ฉด A ๊ฐ ๋ฉ๋๋ค.
- keymap์ ์์์ ๊ธธ์ด๋ ์๋ก ๋ค๋ฅผ ์ ์์ต๋๋ค.
- keymap์ ์์๋ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- 1 ≤ targets์ ๊ธธ์ด ≤ 100
- 1 ≤ targets์ ์์์ ๊ธธ์ด ≤ 100
- targets์ ์์๋ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
์ ์ถ๋ ฅ ์
| keymap | targets | result |
| ["ABACD", "BCEFD"] | ["ABCD", "AABB"] | [9, 4] |
| ["AA"] | ["B"] | [-1] |
| ["AGZ", "BSSS"] | ["ASA", "BGZ"] | [4, 6] |
์ ์ถ๋ ฅ ์ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
- "ABCD"์ ๊ฒฝ์ฐ,
1๋ฒ ํค ํ ๋ฒ → A
2๋ฒ ํค ํ ๋ฒ → B
2๋ฒ ํค ๋ ๋ฒ → C
1๋ฒ ํค ๋ค์ฏ ๋ฒ → D
๋ฐ๋ผ์ ์ดํฉ์ธ 9๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ ์ ์ฅํฉ๋๋ค. - "AABB"์ ๊ฒฝ์ฐ,
1๋ฒ ํค ํ ๋ฒ → A
1๋ฒ ํค ํ ๋ฒ → A
2๋ฒ ํค ํ ๋ฒ → B
2๋ฒ ํค ํ ๋ฒ → B
๋ฐ๋ผ์ ์ดํฉ์ธ 4๋ฅผ ๋ ๋ฒ์งธ ์ธ๋ฑ์ค์ ์ ์ฅํฉ๋๋ค. - ๊ฒฐ๊ณผ์ ์ผ๋ก [9,4]๋ฅผ return ํฉ๋๋ค.
์ ์ถ๋ ฅ ์ #2
- "B"์ ๊ฒฝ์ฐ, 'B'๊ฐ ์ด๋์๋ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ -1์ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ ์ ์ฅํฉ๋๋ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก [-1]์ return ํฉ๋๋ค.
์ ์ถ๋ ฅ ์ #3
- "ASA"์ ๊ฒฝ์ฐ,
1๋ฒ ํค ํ ๋ฒ → A
2๋ฒ ํค ๋ ๋ฒ → S
1๋ฒ ํค ํ ๋ฒ → A
๋ฐ๋ผ์ ์ดํฉ์ธ 4๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ ์ ์ฅํฉ๋๋ค. - "BGZ"์ ๊ฒฝ์ฐ,
2๋ฒ ํค ํ ๋ฒ → B
1๋ฒ ํค ๋ ๋ฒ → G
1๋ฒ ํค ์ธ ๋ฒ → Z
๋ฐ๋ผ์ ์ดํฉ์ธ 6์ ๋ ๋ฒ์งธ ์ธ๋ฑ์ค์ ์ ์ฅํฉ๋๋ค. - ๊ฒฐ๊ณผ์ ์ผ๋ก [4, 6]์ return ํฉ๋๋ค.
๋ด๊ฐ ์์ฑํ ์ฝ๋
import java.util.*;
class Solution {
public int[] solution(String[] keymap, String[] targets) {
// ๊ฐ ์ํ๋ฒณ์ ์ต์ ์
๋ ฅ ํ์ ์ ์ฅ (A ~ Z)
int[] minCount = new int[26];
// ์ฒ์์๋ ๊ฐ์ฅ ํฐ ๊ฐ ์ ์ฅ
Arrays.fill(minCount, Integer.MAX_VALUE);
// keymap์ ํ์ฉํด ์ต์ ์
๋ ฅ ํ์ ํ์ธ
for (String key : keymap) {
for (int i = 0; i < key.length(); i++) {
char c = key.charAt(i);
// ๊ฐ ์ํ๋ฒณ์ ์ธ๋ฑ์ค ํ์ธ
int idx = c - 'A';
// ๊ฐ์ ๋ฌธ์๊ฐ ์ฌ๋ฌ keymap์ ์์ ์ ์์ผ๋ ์ต์๊ฐ์ผ๋ก ์ ์ง
minCount[idx] = Math.max(1, Math.min(minCount[idx], i + 1));
}
}
// ํธ์๋ฅผ ์ํด targets์ ๊ธธ์ด ์ ์ฅ
int len = targets.length;
int[] answer = new int[len];
// ๊ฐ target ๋ฌธ์์ด์ ํ์ํ ์
๋ ฅ ํ์ ๊ณ์ฐ
for (int i = 0; i < len; i++) {
String s = targets[i];
int count = 0;
// ์
๋ ฅ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ฅผ ์ํ ๋ณ์ ์์ฑ
boolean possible = true;
for (int j = 0; j < s.length(); j++) {
char c = s.charAt(j);
int idx = c - 'A';
// ์กฐ๊ฑด์ ํด๋นํ๋ฉด ์ด๋ค ํค์์๋ ๋ง๋ค ์ ์์
if (idx < 0 || idx >= 26 || minCount[idx] == Integer.MAX_VALUE) {
possible = false;
break;
}
// ๋ฌธ์์ ํ์ํ ์
๋ ฅ ํ์ ํฉ์ฐ
count += minCount[idx];
}
// ์์ฑ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ -1 ์ ์ฅ
answer[i] = possible ? count : -1;
}
// ์ ๋ต ๋ฐํ
return answer;
}
}
๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ์๊ฐํ ๋ฐฉํฅ
์ฒ์ ๋ฌธ์ ๋ฅผ ๋ดค์ ๋, ๊ฐ ํ๊ฒ ๋ฌธ์์ด์ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ์ต์ ํค ์ ๋ ฅ ํ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ผ๊ณ ์ดํดํ์ผ๋ฉฐ, ํต์ฌ์ ๋งค๋ฒ keymap์ ์ ๋ถ ํ์ํ์ง ์๊ณ ๋ฌธ์๋ณ ์ต์ ์ ๋ ฅ ํ์๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐํด ๋๋ ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค๊ณ ํ๋จํ๋ค.
์กฐ๊ฑด์ ๋ถ์ํด ๋ณด๋ฉด, ๊ฐ์ ๋ฌธ์๊ฐ ์ฌ๋ฌ ํค๋งต์ ์๋ก ๋ค๋ฅธ ์์น์ ๋ฑ์ฅํ ์ ์์ผ๋ฏ๋ก ํด๋น ๋ฌธ์๋ฅผ ๋๋ฅด๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ํ์๋ “๋ฑ์ฅ ์์น + 1” ๊ฐ๋ค ์ค ์ต์๊ฐ์ด ๋์ด์ผ ํ๋ค๋ ์ ์ด ์ค์ํ๋ค. ๋ํ ์ด๋ค ๋ฌธ์๋ keymap ์ด๋์๋ ์๋ค๋ฉด ๊ทธ ๋ฌธ์๊ฐ ํฌํจ๋ ํ๊ฒ์ ์ ์ด์ ๋ง๋ค ์ ์์ผ๋ฏ๋ก ๊ฒฐ๊ณผ๋ฅผ -1๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค.
์๋ฃ๊ตฌ์กฐ๋ ์ํ๋ฒณ ๋๋ฌธ์๋ง ๋ค๋ฃจ๋ฏ๋ก HashMap ๋์ ๊ธธ์ด 26์ง๋ฆฌ int[]๋ฅผ ์ ํํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ ํ๋จํ๋ค. ๋ฐฐ์ด ์ธ๋ฑ์ฑ์ด ํด์๋ณด๋ค ๋น ๋ฅด๊ณ , ๊ณต๊ฐ๋ ๊ณ ์ ์ ์ด๋ฉฐ ๋จ์ํ๋ค. ์ด๊ธฐ๊ฐ์ Integer.MAX_VALUE๋ก ์ฑ์ ๋์ด ์์ง ๊ด์ธก๋์ง ์์ ๋ฌธ์๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ๊ตฌ๋ถํ๊ณ , ๊ด์ธก๋ ๋๋ง๋ค min ๊ฐฑ์ ์ผ๋ก ์ต์ ์ ๋ ฅ ํ์๋ฅผ ์ ์งํ๋๋ก ํ๋ค.
๋ก์ง ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค. ๋จผ์ ์ ์ฒ๋ฆฌ ๋จ๊ณ์์ ๋ชจ๋ keymap ๋ฌธ์์ด์ ์ํํ๋ฉฐ ๊ฐ ๋ฌธ์ c๊ฐ i๋ฒ์งธ ์์น์ ์์ผ๋ฉด minCount[c-'A'] = min(minCount[c-'A'], i+1)๋ก ๊ฐฑ์ ํ๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฐ targets[i]์ ๋ํด ๋ฌธ์๋ฅผ ์ผ์ชฝ๋ถํฐ ๋ณด๋ฉฐ minCount์์ ํด๋น ๋ฌธ์์ ์ต์ ์ ๋ ฅ ํ์๋ฅผ ํฉ์ฐํ๋ค. ์ด๋ ๊ฐ์ด ์ฌ์ ํ Integer.MAX_VALUE๋ผ๋ฉด ํด๋น ๋ฌธ์๋ ์ด๋ค ํค์์๋ ๋ง๋ค ์ ์๋ค๋ ๋ป์ด๋ฏ๋ก ์ฆ์ ๋ถ๊ฐ๋ฅ ํ๋๊ทธ๋ฅผ ์ธ์ฐ๊ณ ๊ฒฐ๊ณผ๋ฅผ -1๋ก ๊ธฐ๋กํ๋ค. ์ ๋ถ ์ ํจํ๋ค๋ฉด ๋์ ํฉ์ ๊ทธ๋๋ก ๋ต์ ๋ฃ์๋ค.
'๐ฆ ํ๋ก๊ทธ๋๋จธ์ค > ๐๏ธ ์๊ณ ๋ฆฌ์ฆ ํ์ด(Java)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] ์ฑ๊ฒฉ ์ ํ ๊ฒ์ฌํ๊ธฐ (0) | 2025.10.23 |
|---|---|
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] ์ซ์ ๋ณํํ๊ธฐ (0) | 2025.10.22 |
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] ์ฃผ์ฐจ ์๊ธ ๊ณ์ฐ (0) | 2025.10.17 |
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] ํ๋ฐฐ์์ (0) | 2025.10.16 |
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] ๋ ๋ฐ๋จน๊ธฐ (0) | 2025.10.13 |