https://www.acmicpc.net/problem/20125
20125번: 쿠키의 신체 측정
쿠키런은 데브시스터즈에서 제작한 모바일 러닝 액션 게임이다. 마녀의 오븐에서 탈출한 쿠키들과 함께 모험을 떠나는 게임으로, 점프와 슬라이드 2가지 버튼만으로 손쉽게 플레이할 수 있는
www.acmicpc.net
이 전까지 문자열을 입력으로 받아올 때 항상 String 배열을 사용했다. 문자열 2차원 배열을 받아온다 하면 묻지도 따지지도 않고 String [][]을 사용했는데 이 비용이 크다는 걸 깨달았다.
char [][]를 사용해서 한 줄로 들어온 String을 저장할 수 있었던 것이다!
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
String[][] square = new String[N][N];
int count=0;
int left_arm=0, right_arm=0, left_leg=0, right_leg=0, center=0;
Point head = new Point(-1,-1);
for(int i=0; i<N; i++){
square[i] = br.readLine().split("");
if(head.x == -1) {
for (int j = 0; j < N; j++) {
if (square[i][j].equals("*")) {
head.x = i+2;
head.y = j+1;
}
}
}
}
System.out.println(head.x + " " + head.y);
for(int i=0; i<N; i++){
if(square[head.x-1][i].equals("*")){
if(i < head.y-1)
left_arm++;
else if (i > head.y-1)
right_arm++;
}
}
for(int i=head.x; i<N; i++){
if(square[i][head.y-1].equals("*"))
center++;
if(square[i][head.y-1-1].equals("*"))
left_leg++;
if(square[i][head.y-1+1].equals("*"))
right_leg++;
}
System.out.print(left_arm + " " + right_arm + " " + center + " " + left_leg + " " + right_leg);
}
}
처음 제출했던 방식인데 String으로 2차원 배열을 생성해서 문자열을 담았다. 1트에 성공하긴 했으나 소요된 메모리와 시간이 워낙 커서 분석해 보다가 아마 String 때문이 아닐까 생각했는데 어느 정도 맞는 생각이었다.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
char[][] square = new char[N][N];
int count=0;
int left_arm=0, right_arm=0, left_leg=0, right_leg=0, center=0;
Point head = new Point(-1,-1);
for(int i=0; i<N; i++){
square[i] = br.readLine().toCharArray();
if(head.x == -1) {
for (int j = 0; j < N; j++) {
if (square[i][j] == '*') {
head.x = i+2;
head.y = j+1;
}
}
}
}
System.out.println(head.x + " " + head.y);
for(int i=0; i<N; i++){
if(square[head.x-1][i] == '*'){
if(i < head.y-1)
left_arm++;
else if (i > head.y-1)
right_arm++;
}
}
for(int i=head.x; i<N; i++){
if(square[i][head.y-1] == '*')
center++;
if(square[i][head.y-1-1] == '*')
left_leg++;
if(square[i][head.y-1+1] == '*')
right_leg++;
}
System.out.print(left_arm + " " + right_arm + " " + center + " " + left_leg + " " + right_leg);
}
}
두 번째로 낸 제출인데 char [][]로 toCharArray()를 사용했다.
배열 타입만 바꿨을 뿐인데 메모리는 5배 시간은 3배 줄어들었다. 앞으로 String은 피하고 단일 문자라면 char를 사용하자.
'알고리즘 문제 > 구현' 카테고리의 다른 글
[Java] 구현 (한 줄로 서기) (0) | 2023.02.18 |
---|---|
구현 (마법사 상어와 토네이도) (0) | 2022.07.01 |
구현 (누울 자리를 찾아라) (0) | 2022.04.27 |