2024. 7. 4. 11:20ใ๐์๊ณ ๋ฆฌ์ฆ ํผ๋๋ฐฑ/์ฝํ ๊ด๋ จ ๊ฐ์ข

import java.util.*;
import java.io.*;
class Main {
public void solution() throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
String lowerCase = str.toLowerCase();
String upperCase = str.toUpperCase();
for(int i=0; i<str.length(); i++){
if(str.charAt(i)==lowerCase.charAt(i)){
str.charAt(i) = upperCase.charAt(i); //์ฝ๋ ์๋ฌ
}else{
str.charAt(i) = lowerCase.charAt(i); //์ฝ๋ ์๋ฌ
}
}
System.out.println(str);
}
public static void main(String[] args) throws Exception{
new Main().solution();
}
}
[ charAt() ์ด๋? ]
์ฝ๋์์ ์ฌ์ฉํ BufferedReader ๋ ๊ฐํ๋ฌธ์๋ง ๊ฒฝ๊ณ๋ก ์ธ์ํ๊ณ , ์ ๋ ฅ๋ฐ์ ๋ฐ์ดํฐ๊ฐ String์ผ๋ก ๊ณ ์ ๋๋ค
-> charํ์ ์ ์ฌ์ฉํ ์ ์๋ ๋ฌธ์
charํ์ ์ ํ ๊ธ์๋ง ์ ์ฅํ ์ ์๋ ๋ณ์์ธ๋ฐ, BufferedReader๋ก ์ ๋ ฅ ๋ฐ์ ๋๋ Stringํ์ ์ผ๋ก๋ฐ์ ๋ฐ์ ์ ์๋ค
- ๋ฌธ์์ด.charAt(์ธ๋ฑ์ค) : String์ผ๋ก ์ ์ฅ๋ ๋ฌธ์์ด ์ค์์ ํ ๊ธ์๋ง ์ ํํด์ charํ์ ์ผ๋ก ๋ณํํด์ค๋ค!
Stringํ์ ์ ์ฐธ์กฐ๋ณ์ ๋ค์ ๋ถ์ฌ์ ์ฌ์ฉํ๊ฑฐ๋,
br.readLine().charAt(0) ์ ๊ฐ์ ์์ผ๋ก ์ ๋ ฅ๋ฐ๋ ๊ณณ์ ๋ฐ๋ก ๋ถ์ฌ์๋ ์ฌ์ฉํ ์ ์๋ค.
[StringBuilder ๋?]
์๋ฐ์์ ๋ฌธ์์ด์ ๋ํ ๋ ๊ฐ๋จํ๊ฒ + ๋ฅผ ์ด์ฉํด์ ์ฐ๊ฒฐํ ์ ์๋ค.
String๊ฐ์ฒด๋ผ๋ฆฌ ๋ํ๋ ๋ฐฉ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ๋ฅผ ๋ฐ์์ํค๋๋ฐ, ๋ง์ ์ฐ์ฐ์ด ๋ง์์ง๋ค๋ฉด ๋นํจ์จ์ ์ธ ์ฝ๋๊ฐ ๋๋ค!
์๋ฐ์์ String ๊ฐ์ฒด๋ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ํ๋์ ๋ฌธ์์ด์ ๋ค๋ฅธ ๋ฌธ์์ด๊ณผ ์ฐ๊ฒฐํ๋ฉด ์ ๋ฌธ์์ด์ด ์์ฑ๋๊ณ , ์ด์ ๋ฌธ์์ด์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ก ๋ค์ด๊ฐ๋ค. ๋ฌธ์์ด๋ผ๋ฆฌ ์ฐ๊ฒฐํ๋ ์์ ์์๋ ๋ด๋ถ์ ์ผ๋ก ์ฌ๋ฌ ์์ ์ด ๋ฐ์ํ๊ณ , ๊ธฐ์กด ๋ฌธ์์ด ๊ฐ์ ๊ธธ์ด์ ์ถ๊ฐ๋ ๋ฌธ์์ด์ ํฌ๊ธฐ๋ฅผ ๋ํ ํฌ๊ธฐ์ ์๋ก์ด ๋ฌธ์์ด์ด ์์ฑ๋๋ค. ์ด ์์ ์ด ๋ง์์ง๋ฉด, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ก์๋จน๊ฒ ๋๋ค
- StringBuilder -> ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ฌธ์์ด์ ๋ง๋ค์ด์ค๋ค.
Stirng์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๋ฌธ์์ด์ ์์ฑํ์ง๋ง StringBuilder๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ฌธ์์ด์ ๋ง๋ค์ด ์ฃผ๊ธฐ ๋๋ฌธ์, String์ ํฉ์น๋ ์์ ์ ํ๋์ ๋์์ด ๋ ์ ์๋ค.
[StringBuilder ์ฌ์ฉ ๋ฐฉ๋ฒ]
public class Main
{
public static void main(String[] args)
{
StringBuilder stringBuilder = new StringBuilder(); //๊ฐ์ฒด ํธ์ถ
stringBuilder.append("๋ฌธ์์ด ").append("์ฐ๊ฒฐ"); //๋ฌธ์์ด ์ฐ๊ฒฐ
// String str = stringBuilder; // String์ StringBuilder๋ฅผ ๊ทธ๋๋ก ๋ฃ์ ์ ์๋ค. toString()์ ๋ถ์ฌ์ผ ํ๋ค
String str = stringBuilder.toString(); //String๋ณ์์ ๋ฃ์๋๋ toString()์ฌ์ฉํ ๊ฒ!!
// ๋ println()์ ๊ฐ์ ๊ฐ์ ์ถ๋ ฅํ๋ค
System.out.println(stringBuilder);
System.out.println(str);
}
}
๋จผ์ StringBuilder์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ, append()์ ์ธ์๋ก ์ฐ๊ฒฐํ๊ณ ์ ํ๋ ๋ฌธ์์ด์ ๋ฃ์ด์ StringBuilder์ ๊ฐ์ฒด๋ฅผ ํตํด ํธ์ถํ๋ค.
์ถ๋ ฅ ์์, String ๋ณ์์ ๋ฃ์ ๋๋ .toString()์ ์ฌ์ฉํด์ผํ๋ค!
- [ํต๊ณผ]
import java.io.*;
public class Main {
public void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
// StringBuilder๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ๊ตฌ์ฑ
StringBuilder result = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
// ๋๋ฌธ์์ธ ๊ฒฝ์ฐ ์๋ฌธ์๋ก ๋ณํํ์ฌ ์ถ๊ฐ
if (Character.isUpperCase(ch)) {
result.append(Character.toLowerCase(ch));
}
// ์๋ฌธ์์ธ ๊ฒฝ์ฐ ๋๋ฌธ์๋ก ๋ณํํ์ฌ ์ถ๊ฐ
else if (Character.isLowerCase(ch)) {
result.append(Character.toUpperCase(ch));
}
// ์ํ๋ฒณ์ด ์๋ ๊ฒฝ์ฐ(๊ณต๋ฐฑ ๋ฑ) ๊ทธ๋๋ก ์ถ๊ฐ
else {
result.append(ch);
}
}
// ๊ฒฐ๊ณผ ๋ฌธ์์ด ์ถ๋ ฅ
System.out.println(result.toString());
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
- [๋ค๋ฅธ ๋ฐฉ๋ฒ] -> ํฅ์๋ for๋ฌธ, str.toCharArray() ์ฌ์ฉ
- [ ๋ ๋ฐฉ๋ฒ ๋น๊ต] -> chatGPT ์ฌ์ฉ
๋ ๊ฐ์ Java ์ฝ๋๋ฅผ ๋น๊ตํ ๋, ๋ฌธ์์ด์ ๊ฐ ๋ฌธ์์ ๋์๋ฌธ์๋ฅผ ํ ๊ธํ๋ ํจ์จ์ฑ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
[ ์ฒซ ๋ฒ์งธ ์ฝ๋ (StringBuilder ์ฌ์ฉ) ]
- ๋ฐฉ์: `BufferedReader`๋ฅผ ์ฌ์ฉํด ์ ๋ ฅ์ ๋ฐ๊ณ , `StringBuilder`์ธ `result`๋ฅผ ์ฌ์ฉํด ์์ ๋ ๋ฌธ์์ด์ ํจ์จ์ ์ผ๋ก ๊ตฌ์ฑํฉ๋๋ค. ๊ฐ ๋ฌธ์์ ๋์๋ฌธ์๋ฅผ ํ ๊ธํ๊ณ , ์ํ๋ฒณ์ด ์๋ ๋ฌธ์๋ ๊ทธ๋๋ก ์ถ๊ฐํฉ๋๋ค.
- ํจ์จ์ฑ ์ฅ์ :
- StringBuilder์ ํจ์จ์ฑ : `StringBuilder`๋ ๊ฐ๋ณ(mutable)ํ๋ฉฐ ๋ฌธ์์ด ์กฐ์์ ์ต์ ํ๋์ด ์์ต๋๋ค. ๋ฐ๋ณต๋ฌธ ์์์ ๋ฌธ์๋ฅผ ์ถ๊ฐํ ๋ ์๋ก์ด ๋ฌธ์์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ๋ด๋ถ ๋ฒํผ์ ์ง์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ํจ์จ์ ์ ๋๋ค.
- ์๊ฐ ๋ณต์ก๋ : ์ ๋ ฅ ๋ฌธ์์ด์ ๊ธธ์ด์ ์ ํ์ ๋น๋กํ๋ O(n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค. ๊ฐ ๋ฌธ์ ์ฒ๋ฆฌ๋ ์์ ์๊ฐ์ด ์์๋๋ฉฐ, `StringBuilder`์ ๋ฌธ์ ์ถ๊ฐ๋ ์ํธํ๋ ์์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
[ ๋ ๋ฒ์งธ ์ฝ๋ (String๊ณผ ๋ฌธ์์ด ์ฐ๊ฒฐ ์ฌ์ฉ) ]
- ๋ฐฉ์: ์ ๋ ฅ ๋ฌธ์์ด์ ๊ฐ ๋ฌธ์๋ฅผ ๋ฐ๋ณตํ๋ฉฐ, ์๋ฌธ์์ธ์ง ๋๋ฌธ์์ธ์ง ํ์ธํ์ฌ ASCII ์ฝ๋๋ฅผ ์ด์ฉํด ๋์๋ฌธ์๋ฅผ ํ ๊ธํ ํ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ธ `answer`์ ์ถ๊ฐํฉ๋๋ค.
- ํจ์จ์ฑ ๊ณ ๋ ค ์ฌํญ:
- ๋ฐ๋ณต๋ฌธ ๋ด ๋ฌธ์์ด ์ฐ๊ฒฐ: ๋ฐ๋ณต๋ฌธ ์์์ `String`์ ๋ฌธ์์ด์ ์ฐ๊ฒฐํ๋ (`answer += ...`) ๋ฐฉ์์ Java์์ `String`์ด ๋ถ๋ณ(immutable)ํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค. ๊ฐ ์ฐ๊ฒฐ ์ฐ์ฐ์ ์๋ก์ด `String` ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ๋ณต์ฌ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์๊ฐ ๋ณต์ก๋ : ์ต์ ์ ๊ฒฝ์ฐ O(n^2)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค. ์ฌ๊ธฐ์ n์ ์ ๋ ฅ ๋ฌธ์์ด์ ๊ธธ์ด์ ๋๋ค. ๊ฐ ์ฐ๊ฒฐ ์ฐ์ฐ์ด ๊ธฐ์กด ๋ฌธ์์ด์ ๋ด์ฉ์ ์๋ก์ด ๋ฌธ์์ด๋ก ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ๋ง์ด ์๋ชจ๋ ์ ์์ต๋๋ค.
[๊ฒฐ๋ก ]
`StringBuilder`๋ฅผ ์ฌ์ฉํ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ด ๋ฌธ์์ด์ ๋์๋ฌธ์๋ฅผ ํ ๊ธํ๋ ๋ฐ ๋ ํจ์จ์ ์ ๋๋ค. `String` ์ฐ๊ฒฐ ์ฐ์ฐ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๊ณผ ์คํ ์๊ฐ ๋ฉด์์ ๋ ํจ์จ์ ์ด๋ฉฐ, ์ค์ ๋ก ๊ธด ๋ฌธ์์ด์์๋ ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ฅํฉ๋๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ์ํฉ์์ `StringBuilder`๋ฅผ ์ฌ์ฉํ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ด ๋ ์ข์ ์ ํ์ ๋๋ค.
[ Character.isUpperCase() ๋ฅผ ์ด์ฉํ ๋น๊ต vs. ๋ฌธ์์ ASCII ์ฝ๋๋ฅผ ๋น๊ต ]
์ผ๋ฐ์ ์ผ๋ก๋ Character.isUpperCase(ch)์ Character.isLowerCase(ch)๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ๋ ๊ถ์ฅ๋ฉ๋๋ค. ์ด ๋ฐฉ์์ ๊ฐ๋ ์ฑ์ด ์ข๊ณ , ์ฝ๋์ ์๋๊ฐ ๋ช ํํ ๋๋ฌ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ํ ์ฑ๋ฅ ์ฐจ์ด๋ ๋๋ถ๋ถ ๋ฏธ๋ฏธํ๋ฉฐ, ๋๋ถ๋ถ์ ์ํฉ์์๋ ๋ฌด์ํ ์ ์์ ์ ๋์ ๋๋ค. ๋ฐ๋ผ์, ์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ์์๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
[Scanner vs BufferedReader ์ ๋ํด์ ๋ ์์๋ณด๊ธฐ]
https://juno-juno.tistory.com/99
[charAt() ์ ๋ฆฌ ์ฐธ๊ณ ์๋ฃ]
https://colossus-java-practice.tistory.com/31
[StringBuilder ์ ๋ฆฌ ์ฐธ๊ณ ์๋ฃ]