포스트

덩치(7568)

덩치(7568)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.io.*;
import java.util.*;

public class Main{
  public static void main(String[] args) throws IOException {
      
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    StringBuilder sb = new StringBuilder();
    
    int n = Integer.parseInt(br.readLine());
    
    int[] x = new int[n];
    int[] y = new int[n];
    
    for(int i = 0; i < n; i++){
      StringTokenizer st = new StringTokenizer(br.readLine());
      x[i] = Integer.parseInt(st.nextToken());
      y[i] = Integer.parseInt(st.nextToken());
    }
    
    for(int i = 0; i < n; i++){
      int cnt = 1;
      
      for(int j = 0; j < n; j++){
        if(i == j) continue;
        if(x[i] < x[j] && y[i] < y[j]) cnt++;
      }
      
      sb.append(cnt).append(" ");
    }
    
    bw.write(sb.toString());
    bw.flush();
    bw.close();
    br.close();
  }
}

풀이과정

1) 이차배열을 쓸까? 아니면 배열을 만들고 각 배열을 List에 넣을까 고민을 했다.
2) 순서가 정해져있고, 순서대로 값만 비교하면 된다는 생각에 직관적으로 보이게 풀기 위해 배열 2개를 사용하기로 하였다.

  • 성공
  • 메모리 : 14176 KB
  • 시간 : 124 ms

보안점

다른 사람의 코드를 보았는데 나랑 풀이 과정과 접근 방법이 같았는데 메모리와 응답시간의 차이가 났다.
1) 덩치를 비교하는 부분에서 x[i], y[i]를 담는 변수를 선언하여 그 변수랑 x[j], y[j]를 비교하는 것이었다.

  • 결론 : 이것은 크게 영향이 없었다.

2) 나는 sb.append(cnt + “ “) 이런식으로 자주 사용해왔는데 append를 두번써서 sb를 쌓아가는 것이었다.

  • 결론 : 메모리는 1000정도, 응답시간이 20 정도 감소하였다
  • sb.append(cnt + “ “) 이과정을 수행시 정수형 cnt를 문자열로 변환하고, 공백 문자와 결합하는 문자열 결합 연산을 수행한다. 이는 새로운 문자열을 생성하고 메모리에 저장한다고 한다. 따라서 반복문에서 계속하여 문자열 결합 연산을 수행하며, 새로운 문자열을 생성 메모리에 저장을 반복하기 때문에 메모리와 응답시간이 증가하는 모습을 보인것이다.
  • 반면에 append를 두번쓰게 되면 sb에 정수값을 직접 저장하고, 공백 문자열을 추가한다. 문자열 결합 연산을 수행하지 않기 때문에 메모리와 응답시간의 감소가 보인 것이다.

다른 풀이 과정.
1) Person이란 클래스를 만들고, 필드에 weight, height, rank를 선언해 준다.
2) Person 타입의 배열을 만들고 값을 넣는다.
3) 그 후, for문을 통해 비교 진행하며, Person[i].rank의 값을 증가시켰다.
4) 향상된 for문을 사용하여 배열에서 rank의 값들을 출력하였다.

  • 클래스를 만들고 인스턴스화 하여 사용한다는 생각을 해본적이 없었는데, 좋은 접근 방식이었던 것 같다. 다음번에는 클래스를 선언하여 접근하는 부분들도 생각해 봐야겠다.