
내가 생각했을때 문제에서 원하는부분
첫째 줄에 사용한 표기법의 번호와 변수명이 주어진다.
번호가 1인 경우는 카멜 표기법, 2인 경우는 스네이크 표기법, 3인 경우는 파스칼 표기법이다.
입력으로 주어지는 변수명의 길이는 100을 넘지 않는다.
카멜 표기법, 파스칼 표기법을 사용한 변수명은 알파벳 소문자와 대문자로만 이루어져 있고, 스네이크 표기법을 사용한 변수명은 알파벳 소문자와 언더바(_)로만 이루어져 있다.
또, 스네이크 표기법을 사용한 변수명의 첫 글자와 마지막 글자는 언더바가 아니고, 언더바가 연속해서 두 개 이상 사용하는 경우는 없다.
첫째 줄에 카멜 표기법을 사용한 경우, 둘째 줄에 스네이크 표기법을 사용한 경우, 셋째 줄에 파스칼 표기법을 사용한 경우를 출력한다.
내가 이 문제를 보고 생각해본 부분
입력 처리 및 준비:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: BufferedReader를 사용하여 표준 입력(콘솔)으로부터 효율적으로 데이터를 읽어올 준비를 한다.
대량의 입력을 처리할 때 더 빠르게 동작하는 방법이다.
String[] input = br.readLine().split(" ");: 한 줄의 입력을 읽어와 공백을 기준으로 나눈다.
예를 들어, "2 variable_n"이라는 입력이 들어오면 input 배열에는 "2"와 "variable_n"이 저장된다.
int type = Integer.parseInt(input[0]);: 분리된 첫 번째 요소("2")를 정수형으로 변환하여 type 변수에 저장한다.
이 type이 입력된 변수명이 어떤 표기법(1: 카멜, 2: 스네이크, 3: 파스칼)인지 알려준다.
String varName = input[1];: 분리된 두 번째 요소("variable_n")를 varName 변수에 저장한다.
이것이 바로 변환해야 할 원본 변수명이다.
변수명에서 '단어' 분리하기:
이 단계에서는 varName을 구성하는 의미 있는 '단어'들을 찾아 words라는 List<String>에 저장한다.
이 words 리스트가 모든 변환의 기준점이 된다.
List<String> words = new ArrayList<>();: 단어들을 저장할 동적인 리스트를 생성한다.
if(type == 1 || type == 3) { ... }: 만약 입력된 변수명이 카멜 표기법(1)이나 파스칼 표기법(3)이라면 이 블록이 실행된다.
이 두 표기법은 대문자를 통해 단어를 구분한다.
StringBuilder sb = new StringBuilder();: 현재 처리 중인 단어를 임시로 구성하기 위한 StringBuilder를 사용한다.
StringBuilder는 문자열을 자주 변경할 때 String보다 성능 면에서 유리한다.
for(int i = 0; i < varName.length(); i++) { char ch = varName.charAt(i); ... }: varName의 각 문자를 순회한다.
if(Character.isUpperCase(ch) && sb.length() > 0) { ... }: 현재 문자가 대문자이고, sb에 이미 글자가 채워져 있다면, 이는 새로운 단어의 시작을 의미한다.
words.add(sb.toString());: sb에 지금까지 모인 글자를 하나의 완성된 단어로 간주하고 words 리스트에 추가한다.
sb.setLength(0);: sb를 비워서 다음 단어를 모을 준비를 한다.
sb.append(ch);: 현재 문자를 sb에 추가한다.
if(sb.length() > 0) { words.add(sb.toString()); }: 반복문이 모두 끝난 후, sb에 마지막 단어가 남아있을 수 있으므로 이를 words 리스트에 추가한다.
else { ... }: type이 2, 즉 스네이크 표기법일 경우 이 블록이 실행됩니다. 스네이크 표기법은 언더바(_)로 단어를 구분한다.
String[] snakeWords = varName.split("_");: varName을 언더바(_)를 기준으로 분리하여 snakeWords 배열에 저장한다.
for(String s : snakeWords) { words.add(s); }: snakeWords 배열의 각 요소를 words 리스트에 추가한다.
이 과정을 통해 words 리스트에는 원본 변수명이 variableN이든, variable_n이든, VariableN이든 상관없이 ["variable", "N"]과 같은 형태의 단어들이 저장된다.
각 표기법으로 변환하여 출력:
이제 words 리스트를 이용하여 카멜, 스네이크, 파스칼 표기법 각각의 규칙에 맞게 문자열을 재조합하고 출력한다.
카멜 표기법(camelCaseBuilder):
StringBuilder camelCaseBuilder = new StringBuilder();: 카멜 표기법 문자열을 만들 StringBuilder를 준비한다.
for(int i = 0; i < words.size(); i++) { ... }: words 리스트의 각 단어를 순회한다.
if(i == 0) { camelCaseBuilder.append(word.toLowerCase()); }: 첫 번째 단어는 toLowerCase()를 사용하여 모든 문자를 소문자로 만들어 붙인다.
else { ... }: 두 번째 단어부터는 Character.toUpperCase(word.charAt(0))로 첫 글자만 대문자로, word.substring(1).toLowerCase()로 나머지 글자는 소문자로 만들어 이어 붙인다.
System.out.println(camelCaseBuilder.toString());: 완성된 카멜 표기법 변수명을 출력한다.
스네이크 표기법(snakeCaseBuilder):
StringBuilder snakeCaseBuilder = new StringBuilder();: 스네이크 표기법 문자열을 만들 StringBuilder를 준비한다.
for(int i = 0; i < words.size(); i++) { ... }: words 리스트의 각 단어를 순회한다.
snakeCaseBuilder.append(word.toLowerCase());: 모든 단어를 소문자로 만들어 붙인다.
if(i < words.size() - 1) { snakeCaseBuilder.append("_"); }: 마지막 단어가 아니라면 단어 뒤에 언더바(_)를 추가한다.
System.out.println(snakeCaseBuilder.toString());: 완성된 스네이크 표기법 변수명을 출력한다.
파스칼 표기법(pascalCaseBuilder):
StringBuilder pascalCaseBuilder = new StringBuilder();: 파스칼 표기법 문자열을 만들 StringBuilder를 준비한다.
for(String word : words) { ... }: words 리스트의 각 단어를 순회한다.
pascalCaseBuilder.append(Character.toUpperCase(word.charAt(0)));: 단어의 첫 글자를 대문자로 변환하여 붙인다.
pascalCaseBuilder.append(word.substring(1).toLowerCase());: 단어의 두 번째 글자부터는 모두 소문자로 변환하여 이어 붙인다.
파스칼 표기법은 모든 단어가 이런 규칙을 따른다.
System.out.println(pascalCaseBuilder.toString());: 완성된 파스칼 표기법 변수명을 출력한다.
br.close();: 마지막으로 BufferedReader 자원을 닫아준다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
// 백준 16205번 문제
public class Main1217 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int type = Integer.parseInt(input[0]); // 입력된 변수명의 표기법 타입 (1: 카멜, 2: 스네이크, 3: 파스칼)
String varName = input[1]; // 입력된 변수명
// 1. 입력된 변수명을 단어(word) 단위로 분리하여 리스트에 저장
List<String> words = new ArrayList<>();
if(type == 1 || type == 3) { // 카멜 또는 파스칼 (대문자로 단어 구분)
StringBuilder sb = new StringBuilder();
for(int i = 0; i < varName.length(); i++) {
char ch = varName.charAt(i);
// 현재 문자가 대문자이고, 이미 StringBuilder에 내용이 있다면 이전 단어를 추가
// (첫 글자가 대문자인 경우, sb가 비어있으므로 첫 단어는 통째로 들어감)
if(Character.isUpperCase(ch) && sb.length() > 0) {
words.add(sb.toString());
sb.setLength(0); // StringBuilder 초기화 (새 단어 시작)
}
sb.append(ch);
}
// 마지막 단어가 있다면 추가
if(sb.length() > 0) {
words.add(sb.toString());
}
} else { // type == 2 (스네이크, 언더바 '_' 로 단어 구분)
String[] snakeWords = varName.split("_");
for(String s : snakeWords) {
words.add(s);
}
}
// 2. 분리된 단어(words) 리스트를 기반으로 각 표기법에 맞게 변환하여 출력
// --- 2-1. 카멜 표기법으로 변환 (camelCase) ---
StringBuilder camelCaseBuilder = new StringBuilder();
for(int i = 0; i < words.size(); i++) {
String word = words.get(i);
if(i == 0) { // 첫 단어는 모두 소문자
camelCaseBuilder.append(word.toLowerCase());
} else { // 이후 단어들은 첫 글자만 대문자, 나머지는 소문자
camelCaseBuilder.append(Character.toUpperCase(word.charAt(0)));
camelCaseBuilder.append(word.substring(1).toLowerCase());
}
}
System.out.println(camelCaseBuilder.toString());
// --- 2-2. 스네이크 표기법으로 변환 (snake_case) ---
StringBuilder snakeCaseBuilder = new StringBuilder();
for(int i = 0; i < words.size(); i++) {
String word = words.get(i);
snakeCaseBuilder.append(word.toLowerCase()); // 모든 단어 소문자로
if(i < words.size() - 1) { // 마지막 단어 앞에는 언더바 추가
snakeCaseBuilder.append("_");
}
}
System.out.println(snakeCaseBuilder.toString());
// --- 2-3. 파스칼 표기법으로 변환 (PascalCase) ---
StringBuilder pascalCaseBuilder = new StringBuilder();
for(String word : words) {
// 모든 단어의 첫 글자는 대문자, 나머지는 소문자
pascalCaseBuilder.append(Character.toUpperCase(word.charAt(0)));
pascalCaseBuilder.append(word.substring(1).toLowerCase());
}
System.out.println(pascalCaseBuilder.toString());
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.