
Problem ๐ป
https://school.programmers.co.kr/learn/courses/30/lessons/120892
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก, ์ฑ์ฉ๊น์ง Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
๋ฌธ์ ์ค๋ช
๊ตฐ ์ ๋ต๊ฐ ๋จธ์ฑ์ด๋ ์ ์ ์ค ์ ๊ตฐ์ด ๋ค์๊ณผ ๊ฐ์ ์ํธ ์ฒด๊ณ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์์๋์ต๋๋ค.
- ์ํธํ๋ ๋ฌธ์์ด cipher๋ฅผ ์ฃผ๊ณ ๋ฐ์ต๋๋ค.
- ๊ทธ ๋ฌธ์์ด์์ code์ ๋ฐฐ์ ๋ฒ์งธ ๊ธ์๋ง ์ง์ง ์ํธ์ ๋๋ค.
๋ฌธ์์ด cipher์ ์ ์ code๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋ ํด๋ ๋ ์ํธ ๋ฌธ์์ด์ returnํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
- 1 ≤ cipher์ ๊ธธ์ด ≤ 1,000
- 1 ≤ code ≤ cipher์ ๊ธธ์ด
- cipher๋ ์๋ฌธ์์ ๊ณต๋ฐฑ์ผ๋ก๋ง ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- ๊ณต๋ฐฑ๋ ํ๋์ ๋ฌธ์๋ก ์ทจ๊ธํฉ๋๋ค.
์ ์ถ๋ ฅ ์ciphercoderesult
| "dfjardstddetckdaccccdegk" | 4 | "attack" |
| "pfqallllabwaoclk" | 2 | "fallback" |
์ ์ถ๋ ฅ ์ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
- "dfjardstddetckdaccccdegk" ์ 4๋ฒ์งธ, 8๋ฒ์งธ, 12๋ฒ์งธ, 16๋ฒ์งธ, 20๋ฒ์งธ, 24๋ฒ์งธ ๊ธ์๋ฅผ ํฉ์น "attack"์ returnํฉ๋๋ค.
์ ์ถ๋ ฅ ์ #2
- "pfqallllabwaoclk" ์ 2๋ฒ์งธ, 4๋ฒ์งธ, 6๋ฒ์งธ, 8๋ฒ์งธ, 10๋ฒ์งธ, 12๋ฒ์งธ, 14๋ฒ์งธ, 16๋ฒ์งธ ๊ธ์๋ฅผ ํฉ์น "fallback"์ returnํฉ๋๋ค.
Approach 1 โ - ๋์ ์ด๊ธฐ ์ ๊ทผ๋ฒ
1. String์ String ๋ฐฐ์ด๋ก ๋ฐ๊ฟ๊ฒ.
2. String ๋ฐฐ์ด์์ ์ซ์๋ intํ์ผ๋ก ๋ฐ๊ฟ๊ฒ.
3. ํด๋ ํ ์ํธ๋ฅผ ๋ด์ intํ ๋ฐฐ์ด์ ๋ง๋ค๊ฒ.
4. if๋ฌธ์ ์ฌ์ฉํด์ code์ ์ผ์นํ๋ค๋ฉด intํ ๋ฐฐ์ด์ ๋ด์๊ฒ
5. intํ ๋ฐฐ์ด์ ๋ฌธ์์ด๋ก ๋ฐ๊ฟ๊ฒ.
6. ๋ฌธ์์ด์ ๋ฆฌํดํ ๊ฒ.
Approach 2 โญ - ๋์ ์ด๊ธฐ ์ ๊ทผ๋ฒ์ ๋ํ ๋ฌธ์ ์
1. ๋ฌธ์ ๋ฅผ ์ดํดํ์ง ๋ชปํจ.
cipher๋ ๋ฌธ์์ด์ด๋ค. ๊ฐ ๋ฌธ์๋ ์ํธ์ ์ผ๋ถ์ด๋ฉฐ, ์ด๊ฒ์ ์ซ์๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ด ํ์ํ์ง ์๋ค.
code์ ๋ฐฐ์ ๋ฒ์งธ ๊ธ์๋ฅผ ์ฐพ๋๋ ์ซ์๋ก ๋ณํํ ํ์๊ฐ ์๋ค.
์๋ฅผ ๋ค์ด, cipher = "abcdef", code = 2์ผ๋, 2๋ฒ์งธ, 4๋ฒ์งธ, 6๋ฒ์งธ ๋ฌธ์๋ฅผ ์ฐพ์์ผ ํ๋ค.
๋ฌธ์์ด์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด ์ ๊ทผํ๋ฉด ์ถฉ๋ถํ๋ค.
2. ๋ถํ์ํ ๋ฐฐ์ด ์ฌ์ฉ :
String์ ๊ตณ์ด ๋ฐฐ์ด๋ก ๋ณํํ ํ์๊ฐ ์๋ค. ๋ฌธ์์ด์ charAt()๋ฉ์๋๋ฅผ ์ฌ์ฉํด ํน์ ์ธ๋ฑ์ค์ ์ ๊ทผํ ์ ์๋ค.
๋ฐ๋ผ์ ๋ฌธ์์ด์ ๋ฐฐ์ด๋ก ๋ณํํ์ง ์์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
3. ํด๋ ๋ ์ํธ ์ ์ฅ์ ์ํ int[]์ฌ์ฉ :
์ํธ ๋ฌธ์์ด์ ๋ฌธ์๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฏ๋ก, int[]๊ฐ ์๋ String์ด๋ StringBuilder๋ฅผ ์ฌ์ฉํด ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ ์ ํฉํ๋ค.
4. ์๋ชป๋ ์กฐ๊ฑด ๊ฒ์ฌ์ ์ ์ฒด ๋ก์ง ๋๋ฝ :
if๋ฌธ ์กฐ๊ฑด์ด ๋ถ์์ ํ๋ฉฐ, ์ ๋ฐ์ ์ธ ๋ก์ง์ด ๊ตฌํ๋์ง ์์๋ค. code์ ๋ฐฐ์ ๋ฒ์งธ ๋ฌธ์๋ฅผ ์ฐพ๋ ๋ฐ๋ณต๋ฌธ๊ณผ ๋ฌธ์์ด ์กฐํฉ์ด ํ์ํ๋ค.
Solution ๐ก
<๋ฌธ์ ํด๊ฒฐ์ ์ํ ๋ ผ๋ฆฌ์ ์ ๊ทผ>
1. ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด ๋ฌธ์ ์ ํ :
code์ ๋ฐฐ์ ๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๊ธฐ ์ํด for๋ฌธ์ ์ฌ์ฉํ๋ค.
๋ฌธ์์ด์ ์ธ๋ฑ์ค๋ 0๋ถํฐ ์์ํ๋ฏ๋ก, (i + 1) % code == 0 ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฌธ์๋ง ์ ํํ๋ค.
2. ๋ฌธ์๋ฅผ ์กฐํฉ :
์ ํ๋ ๋ฌธ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํด StringBuilder๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ๋ฌธ์์ด ์กฐํฉ์ ํจ์จ์ ์ด๋ค.
3. ๊ฒฐ๊ณผ ๋ฐํ :
์ต์ข ์ ์ผ๋ก StringBuilder๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ๋ฐํํ๋ค.
class Solution {
public String solution(String cipher, int code) {
StringBuilder decoded = new StringBuilder(); //ํด๋
๋ ์ํธ๋ฅผ ์ ์ฅํ StringBuilder
//๋ฌธ์์ด์ ๊ฐ ๋ฌธ์๋ฅผ ํ์ธ
for (int i = 0; i < cipher.length(); i++) {
if ((i + 1)% code == 0) { //์ธ๋ฑ์ค +1์ด code์ ๋ฐฐ์์ธ์ง ํ์ธ
decoded.append(cipher.charAt(i)); // ๋ฐฐ์์ธ ๊ฒฝ์ฐ ๋ฌธ์ ์ถ๊ฐ
}
}
return decoded.toString(); //StringBuilder๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ๋ฐํ
}
}
< ์ฝ๋ ์ค๋ช >
1. StringBuilder decoded :
ํด๋ ๋ ์ํธ๋ฅผ ์ ์ฅํ๋ ๋ฌธ์์ด ๊ฐ์ฒด์ด๋ค. StringBuilder๋ ๋ฌธ์์ด ์กฐํฉ ์์ ์ ํจ์จ์ ์ด๋ค.
2. for ๋ฐ๋ณต๋ฌธ :
๋ฌธ์์ด์ ๊ธธ์ด๋งํผ ๋ฐ๋ณตํ๋ฉฐ, ๊ฐ ๋ฌธ์์ ์ ๊ทผํ๋ค.
3. (i + 1) % code == 0 ์กฐ๊ฑด:
์ธ๋ฑ์ค๋ 0๋ถํฐ ์์ํ๋ฏ๋ก i+1์ ์ฌ์ฉํด 1 - based(1๋ถํฐ ์์ํ๋) ์ธ๋ฑ์ค๋ก ๋ณํํ๋ค.
code์ ๋ฐฐ์์ธ์ง ํ์ธํ์ฌ ํด๋น ๋ฌธ์๋ฅผ ์ ํํ๋ค.
4. decoded.append() :
์กฐ๊ฑด์ ๋ง๋ ๋ฌธ์๋ฅผ StringBuilder์ ์ถ๊ฐํ๋ค.
5. decoded.toString() :
์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ๋ฐํํ๋ค.