✔ 난이도 - Bronze 1
한 줄에 최대 15문자가 들어갈 수 있다고 정해져있지만 메모리를 낭비하기 싫어서 유동적으로 입력받은 만큼 메모리를 차지하도록 했다.
그래서 우선 한 줄을 입력받고 toCharArray()로 문자형배열로 변환한 후, 이차원 배열에 추가해주었다.
입력받을때마다 maxLength를 재계산해서 할당해주었다.
그 후 순회하며 만약 해당 자리에 문자가 존재하면 sb에 추가해주는 식으로 했는데,
나는 입력받은 만큼만 메모리를 할당했기때문에 그냥 arr[j][i]로 하면 인덱스바운드에러가 난다.
따라서 문자가 존재하는지 확인해주기 위해서 현재 확인하려는 인덱스값이 현재 행의 길이보다 작을때 즉, 문자가 존재할때만 출력해주도록 하였다.
만약 애초에 char[5][15] 로 고정된 2차원배열을 만들고 거기에 넣어준다면 문자가 존재하는지 아닌지를
arr[j][i] != '/0'으로 판별해줄 수 있었을 것이다.
- Null 문자('\0') 방식
- (이 null 문자에 해당하는 유니코드는 0
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
char[][] arr = new char[5][];
int maxLength = 0;
for (int i = 0; i < 5; i++){
char[] charArr = br.readLine().toCharArray();
if (maxLength < charArr.length){
maxLength = charArr.length;
}
arr[i] = charArr;
}
// System.out.println(Arrays.deepToString(arr));
for (int i = 0; i < maxLength; i++){
for (int j = 0; j < 5; j++){
if (i < arr[j].length){
sb.append(arr[j][i]);
}
}
}
System.out.println(sb);
}
}
O(N)
N: 가장 긴 단어의 길이 (maxLength, 최대 15)
5번 반복은 상수이므로 무시
시간제한은 1초: 1초에 약 1억번(10^8)의 연산을 처리할 수 있음.
상수항을 빼는 이유
빅오(Big-O) 표기법의 핵심은 "입력 크기가 커질 때, 연산 횟수가 어떤 형태로 증가하는가"라는 성장 추세를 나타내는 데 있다.
- O(5 * N): 입력 N이 1, 2, 3으로 늘어날 때, 연산 횟수는 5, 10, 15로 늘어남
- O(N): 입력 N이 1, 2, 3으로 늘어날 때, 연산 횟수는 1, 2, 3으로 늘어남
두 경우 모두 N에 정비례하여 선형적(Linear) 으로 증가하는, 동일한 성장 패턴을 보인다. 빅오 표기법에서는 이 '선형적으로 증가한다'는 본질이 중요하기 때문에, 그 앞에 곱해진 상수 5는 영향력이 없다고 보고 제거한다.
Java에서 char 타입의 배열을 생성하면 모든 요소는 기본값인 '\0' 으로 자동 초기화된다.