https://school.programmers.co.kr/learn/courses/30/lessons/42860
๋ฌธ์
- ์กฐ์ด์คํฑ์ผ๋ก ์ํ๋ฒณ ์ด๋ฆ์ ์์ฑํ์ธ์. ๋งจ ์ฒ์์ A๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- ex) ์์ฑํด์ผ ํ๋ ์ด๋ฆ์ด ์ธ ๊ธ์๋ฉด AAA, ๋ค ๊ธ์๋ฉด AAAA
- ์กฐ์ด์คํฑ์ ๊ฐ ๋ฐฉํฅ์ผ๋ก ์์ง์ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- โฒ - ๋ค์ ์ํ๋ฒณ
- โผ - ์ด์ ์ํ๋ฒณ (A์์ ์๋์ชฝ์ผ๋ก ์ด๋ํ๋ฉด Z๋ก)
- โ - ์ปค์๋ฅผ ์ผ์ชฝ์ผ๋ก ์ด๋ (์ฒซ ๋ฒ์งธ ์์น์์ ์ผ์ชฝ์ผ๋ก ์ด๋ํ๋ฉด ๋ง์ง๋ง ๋ฌธ์์ ์ปค์)
- โถ - ์ปค์๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ (๋ง์ง๋ง ์์น์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋ฉด ์ฒซ ๋ฒ์งธ ๋ฌธ์์ ์ปค์)
- ์ด๋ฆ์ ๋ํด ์กฐ์ด์คํฑ ์กฐ์ ํ์์ ์ต์๊ฐ์ return ํ๊ธฐ
์๋ฅผ ๋ค์ด ์๋์ ๋ฐฉ๋ฒ์ผ๋ก "JAZ"๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
- ์ฒซ ๋ฒ์งธ ์์น์์ ์กฐ์ด์คํฑ์ ์๋ก 9๋ฒ ์กฐ์ํ์ฌ J๋ฅผ ์์ฑํฉ๋๋ค.
- ์กฐ์ด์คํฑ์ ์ผ์ชฝ์ผ๋ก 1๋ฒ ์กฐ์ํ์ฌ ์ปค์๋ฅผ ๋ง์ง๋ง ๋ฌธ์ ์์น๋ก ์ด๋์ํต๋๋ค.
- ๋ง์ง๋ง ์์น์์ ์กฐ์ด์คํฑ์ ์๋๋ก 1๋ฒ ์กฐ์ํ์ฌ Z๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ฐ๋ผ์ 11๋ฒ ์ด๋์์ผ "JAZ"๋ฅผ ๋ง๋ค ์ ์๊ณ , ์ด๋๊ฐ ์ต์ ์ด๋์ ๋๋ค.
์ ํ ์ฌํญ
- name์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- name์ ๊ธธ์ด๋ 1 ์ด์ 20 ์ดํ์ ๋๋ค.
ํ์ด1 : ๊ทธ๋ฆฌ๋ (=ํ๋ฆฐ ํ์ด)
์ฒ์์๋ ์๊ณ ๋ฆฌ์ฆ ํ์ด๋ฒ์ด ํ์๋ฒ(Greedy)๋ก ๋ถ๋ฅ๊ฐ ๋์ด์์ด์ ๊ทธ๋ฆฌ๋ํ ๋ฐฉ๋ฒ์ผ๋ก ํ์๋ค.
- intํ์ ๋ฐฐ์ด์ ๊ฐ ๋ฌธ์๋ณ๋ก A์์ ํด๋น ๋ฌธ์๊ฐ ๋๊ธฐ ์ํด ์กฐ์ํด์ผ ํ๋ ํ์๋ฅผ ์ ์ฅํ๋ค.
- ๊ทธ๋ฆฌ๋ํ ๋ฐฉ๋ฒ์ผ๋ก (ํ์ฌ ์์น์์ ํด๋น ์ซ์๊น์ง์ ์ด๋ ํ์ + ์กฐ์ ํ์)๊ฐ ์์ ๊ฒ๋ถํฐ ์กฐ์ํ๋ค.
- ์กฐ์๋ ์์น๋ 0์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
- ๋ฌธ์๋ฅผ ๋ค ์กฐ์ํ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
์คํจ ์ฝ๋
class Solution {
public int solution(String name) {
int[] times = new int[name.length()]; //ํด๋น ๋ฌธ์๊ฐ ๋๊ธฐ ์ํด์ ์กฐ์ํด์ผ ํ๋ ํ์
int count = 0; //์กฐ์๋ ๋ฌธ์ ์
for(int i = 0; i < name.length(); i++) {
char ch = name.charAt(i);
int up = ch - 65; //์๋ก ์ฌ๋ ธ์ ๋ ํ์
int down = 90 - ch + 1; //์๋๋ก ๋ด๋ ธ์ ๋ ํ์
times[i] = Math.min(up, down);
if(times[i] == 0) { //์ด๋ฏธ A์ด๋ฉด ์กฐ์๋ ๋ฌธ์ ๊ฐ์์ ์ฌ๋ฆฌ๊ธฐ
count++;
}
}
//๊ตฌํ
int answer = 0; //์ ๋ต : ์กฐ์ ํ์
int cursor_now = 0; //์ปค์ ์์น
while(count < name.length()) {
// for(int n : times) {
// System.out.print(n + " ");
// }
//์์์ผ๋ก ์ด๋ํด์ ๊ฐ ์ ์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์กฐ์ ์๋ ์์น ๊ตฌํ๊ธฐ
int cursor_left = cursor_now;
int left_count = 0;
while(true) { //0(์กฐ์ ์๋ฃ)์ด ์๋ ๋๊น์ง
if(times[cursor_left] != 0) break;
cursor_left--; //์ผ์ชฝ์ผ๋ก ์ด๋
left_count++;
if(cursor_left == -1) { //๋์ ๋๋ฌํ๋ฉด
cursor_left = name.length() - 1; //๋์ผ๋ก
}
}
int cursor_right = cursor_now;
int right_count = 0;
while(true) { //0(์กฐ์ ์๋ฃ)์ด ์๋ ๋๊น์ง
if(times[cursor_right] != 0) break;
cursor_right++; //์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
right_count++;
if(cursor_right == name.length()) { //๋์ ๋๋ฌํ๋ฉด
cursor_right = 0; //์ฒ์์ผ๋ก
}
}
// System.out.print("ํ์ฌ: " + cursor_now + " ์ผ์ชฝ: " + cursor_left + " ์ค๋ฅธ์ชฝ: " + cursor_right);
//ํ์ฌ ์์น ~ ํด๋น ์์น๊น์ง ์ด๋ ํ์ + ์กฐ์ ํ์ ๊ตฌํ๊ธฐ
int left = left_count + times[cursor_left];
int right = right_count + times[cursor_right];
//์กฐ์ ํ์๊ฐ ์์ ์์น๋ก ์ด๋
if(left < right) {
// System.out.println(" ์ผ์ชฝ ์กฐ์ํ์: " + left_count + "+" + times[cursor_left]);
cursor_now = cursor_left;
answer += left; //์กฐ์ ํ์ ์ฆ๊ฐ
} else {
// System.out.println(" ์ค๋ฅธ์ชฝ ์กฐ์ํ์: " + right_count + "+" + times[cursor_right]);
cursor_now = cursor_right;
answer += right; //์กฐ์ ํ์ ์ฆ๊ฐ
}
times[cursor_now] = 0; //์กฐ์ ์๋ฃ
count++;
}
return answer;
}
}
์คํจ ๊ฒฐ๊ณผ
ํ์ง๋ง ์ด๋ ๊ฒ ํ์๋๋ ๋ชจ๋ TC๋ฅผ ํต๊ณผํ์ง ๋ชปํ์ฌ 59์ ์ด ๋์๋ค. ๊ฒ์ํ์ ๋ณด๋ ์์ ์๋ ๊ทธ๋ฆฌ๋๋ก ํ๋ ธ๋ค๊ณ ํ์ง๋ง, TC๊ฐ ์ถ๊ฐ๋๋ฉด์ ๋ฌธ์ ๊ฐ ๊ทธ๋ฆฌ๋๋ก๋ ํ ์ ์๊ฒ ๋ฐ๋ ๊ฒ ๊ฐ๋ค๊ณ ํ๋ค. ๊ทธ๋ฆฌ๋๋ผ๋ ์นดํ ๊ณ ๋ฆฌ์ ์์ง ๋ง์!
๊ฒ์ํ์์ ์ฐพ์ ๋ฐ๋ก๊ฐ ์๋ค.
"ABAAABB”์ธ ๊ฒฝ์ฐ, ์ฒ์ ์์น์ธ 0์์ ์ผ์ชฝ์ด๋ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ชจ๋ 1ํ ์ด๋์ด ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ์ผ์ชฝ์ผ๋ก ๊ฐ๊ฒ ๋ ๊ฒฝ์ฐ ์ดํ, ์ผ1, ์ผ1, ์ค3์ผ๋ก ์ด 5ํ,
์ค๋ฅธ์ชฝ์ผ๋ก ์์ํ ๊ฒฝ์ฐ ์ดํ, ์ค1, ์ผ2, ์ผ1๋ก ์ด 4ํ๊ฐ ๋์ค๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๋ํ ๋ฐฉ๋ฒ์ด ์ ์ฉ๋์ง ์๋๋ค.
ํ์ด2 : ๋ถ๋ฅดํธํฌ์ค, ํฌํฌ์ธํฐ
๊ทธ๋ผ ๊ทธ๋ฆฌ๋๊ฐ ์๋๋ผ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ธํ๋ ๋ถ๋ฅดํธํฌ์ค(์์ ํ์) ๋ฐฉ์์ผ๋ก ํ์ด์ผ ๋ชจ๋ TC๋ฅผ ํต๊ณผํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ์ค ์กฐ์ ํ์์ ์ํฅ์ ์ฃผ๋ ๊ฒ์ ์์๋๋ก ์์ง์ด๋ ํ์๊ฐ ์๋๋ผ ์ข์ฐ๋ก ์์ง์ด๋ ํ์์ด๋ค. ์ ์๋๋ก ์กฐ์ํ๋ ํ์๋ '์๋ก ์กฐ์ํ์ ๋์ ์๋๋ก ์กฐ์ํ์ ๋์ ์ต์๊ฐ'์ผ๋ก ์ ํด์ ธ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์๋๋ก ์์ง์ด๋ ํ์๋ ๋ฐ๋ก ๊ณ์ฐํ๊ณ , ์ข์ฐ๋ก ์์ง์ด๋ ํ์์ ์ต์๊ฐ๋ง ์ ๊ฒฝ์ ์ฐ๋ฉด ๋๋ค.
์ข์ฐ๋ก ์์ง์ด๋ ๊ฒฝ์ฐ์ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ฐฉํฅ ์ ํ ์์ด ์ค๋ฅธ์ชฝ์ผ๋ก ๊ณ์ ์์ง์ด๋ ๊ฒฝ์ฐ
- ๋ฐฉํฅ ์ ํ ์์ด ์ผ์ชฝ์ผ๋ก ๊ณ์ ์์ง์ด๋ ๊ฒฝ์ฐ
- ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋ค๊ฐ ์ผ์ชฝ์ผ๋ก ๋ฐฉํฅ์ ์ ํํด ์์ง์ด๋ ๊ฒฝ์ฐ
- ์ผ์ชฝ์ผ๋ก ์ด๋ํ๋ค๊ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐฉํฅ์ ์ ํํด ์์ง์ด๋ ๊ฒฝ์ฐ
ํ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ๋์ ๊ฐ์ (Name์ ๊ธธ์ด - 1)๋ก, ์ต๋๊ฐ์ด ๋๋ค.
ํ์ง๋ง ์์ TC์ ๊ฒฝ์ฐ์๋, ์ค๊ฐ์ ๋ฐฉํฅ ์ ํ์ ํ๊ฒ ๋๋ ๊ฒฝ์ฐ์๋ ๋ ์ ์ ์กฐ์ ํ์๋ก ๊ฐ๋ฅํ๋ค.
์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ ๊ฒฝ์ฐ, A๋ฅผ ๋ง๋๋ฉด ๋ฐฉํฅ ์ ํ์ ํด์ ์ผ์ชฝ์ผ๋ก ๊ฐ๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ด ์กฐ์ ํ์๋ (์์์ ๋ถํฐ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ ๋์ ๊ธธ์ด * 2) + (์์์ ์์ ์ผ์ชฝ์ผ๋ก ๊ฐ ๋์ ๊ธธ์ด)๊ฐ ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์ผ์ชฝ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ ๊ฒฝ์ฐ, A๋ฅผ ๋ง๋๋ฉด ๋ฐฉํฅ ์ ํ์ ํด์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ด ์กฐ์ ํ์๋ (์์์ ๋ถํฐ ์ผ์ชฝ์ผ๋ก ๊ฐ ๋์ ๊ธธ์ด * 2) + (์์์ ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ ๋์ ๊ธธ์ด)
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์๋ ค๋ฉด, ์์์ ์ 0๋ถํฐ Name์ ๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง ์ต์ ์กฐ์ ํ์๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.
์์์ ๊ณผ ๋์ ์ด ์๊ณ , ์์์ ๊ณผ ๋์ ์ ์ธ๋ฑ์ค๋ฅผ ๋๋ ค๊ฐ๋ฉด์ ํธ๋ ๋ฐฉ์์ด ํฌํฌ์ธํฐ์ ์ ์ฌํ๋ค.
- ์์์ ์ 0๋ถํฐ ๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง ๋ชจ๋ ๋๊ณ
- ์์์ ์ ๊ธฐ์ค์ผ๋ก 3๊ฐ์ง ๊ฒฝ์ฐ์ ์์ ๋ํด ๊ฐ๊ฐ ์กฐ์ ํ์๋ฅผ ๊ตฌํ๋ค.
- 3๊ฐ์ง ๊ฒฝ์ฐ ์ค, ์ต์ ์กฐ์ ํ์๊ฐ ์์์ ์ผ๋ก๋ถํฐ์ ์ด๋ํ์๊ฐ ๋๋ค.
- ๋ชจ๋ ์์์ ์ ๋ํด ์ต์๊ฐ์ ๊ตฌํ์ฌ ๊ฐฑ์ ํด์ค๋ค.
์ฝ๋
class Solution {
public int solution(String name) {
int answer = 0; //์ ๋ต : ์กฐ์ ํ์
int length = name.length();
int move = length - 1; //์ข์ฐ ์์ง์ ์ : ์ต๋๋ ๊ธธ์ด - 1
for(int start = 0; start < length; start++) {
//์ํ ์ด๋ ํ์ ๊ตฌํ๊ธฐ
char ch = name.charAt(start);
int up = ch - 'A'; //์๋ก ์ฌ๋ ธ์ ๋ ํ์
int down = 'Z' - ch + 1; //์๋๋ก ๋ด๋ ธ์ ๋ ํ์
answer += Math.min(up, down);
//์ข์ฐ ์ด๋ ํ์ ๊ตฌํ๊ธฐ
int end = start + 1; //๋ค์ A๊ฐ ์๋ ๋ฌธ์์ ์ธ๋ฑ์ค
while(end < length && name.charAt(end) == 'A'){ //A๊ฐ ์๋ ๋ฌธ์๋์ค๊ธฐ ์ ๊น์ง ํ์
end++;
}
int l1 = start; //์ ๋ถ๋ถ์ ๊ธธ์ด
int l2 = length - end; //๋ท ๋ถ๋ถ์ ๊ธธ์ด
//์ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ๋์
//์ ๋ฐฉํฅ ๊ฐ๋ค๊ฐ ์ญ๋ฐฉ๋ฑก ๊ฐ๋ ๊ฒฝ์ฐ, ์ญ๋ฐฉํฅ ๊ฐ๋ค๊ฐ ์ ๋ฐฉํฅ ๊ฐ๋ ๊ฒฝ์ฐ ๋น๊ต
move = Math.min(move, l1 + l2 + Math.min(l1, l2));
}
return answer + move;
}
}
๊ฒฐ๊ณผ
์ฐธ๊ณ
'Algorithm > ํ๋ก๊ทธ๋๋จธ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค - ๋ณด์ ์ผํ (0) | 2024.01.09 |
---|---|
ํ๋ก๊ทธ๋๋จธ์ค - ๊ทค ๊ณ ๋ฅด๊ธฐ (0) | 2023.11.10 |
ํ๋ก๊ทธ๋๋จธ์ค - ๋ ํ ํฉ ๊ฐ๊ฒ ๋ง๋ค๊ธฐ (0) | 2023.10.19 |
ํ๋ก๊ทธ๋๋จธ์ค - ๊ฐ์ฅ ํฐ ์ (0) | 2023.09.07 |
ํ๋ก๊ทธ๋๋จธ์ค - ์ด์ง ๋ณํ ๋ฐ๋ณตํ๊ธฐ (0) | 2023.08.30 |