본문 바로가기
with my rubber duck/codingTest

[백준 7568] 덩치. 뭐가 틀렸다는거임 + 해결

by stilinski 2022. 7. 18.
728x90

https://www.acmicpc.net/problem/7568

 

7568번: 덩치

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩

www.acmicpc.net

//1. 사람수 입력받기
//2. 사람수 만큼 키 몸무게 입력받기
//3. 키 몸무게 공백으로 split하기
//4. split된 키 몸무개 객체로 만들어서 array로 만들기
//5. array들 객체 각각 자신보다 몸무게&&키 큰 객체의 수 세서 result array에 넣기
//6. 출력

import java.util.Scanner;


public class Main{

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //1. 사람수 입력받기
        int N = sc.nextInt();
        sc.nextLine();
        Info[] infos = new Info[N];
        
        for(int i=0;i<N;i++){
            //2. 사람수 만큼 키 몸무게 입력받기
            String infoText=sc.nextLine();
            //3. 키 몸무게 공백으로 split하기
            String[] infoTexts = infoText.split(" ");
            //4. split된 키 몸무개 객체로 만들어서 array로 만들기
            infos[i]=new Info(Integer.parseInt(infoTexts[0]),Integer.parseInt(infoTexts[1]));
        }
        
        //등수 출력
        int cnt=0;
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                if(infos[i].getWeight()<=infos[j].getWeight()
                  && infos[i].getHeight()<=infos[j].getHeight()){
                    cnt++;
                }
            }
            int rank = cnt;
            
            System.out.print(rank+" ");
            cnt=0;
        }
        
    }
}

    class Info{
        private int weight;
        private int height;

    Info(int weight,int height){
            this.weight = weight;
            this.height = height;
        }

     int getWeight(){
            return this.weight;
        }

     int getHeight(){
            return this.height;
        }
}

 

클래스 만들어서 풀어보고싶어서  해봤는데 계속 틀렸대 ㅡㅡ 

답은 잘만 나오는데 왜저러는거임?

혹시 프린트할때 공백이 문젠가 싶어서 배열에 넣어서 반복문 해봤는데도 안됨.

뭐가 틀렸다는건지 모르겠음

 

그래서 일단 2중배열로 풀고 때려치움;

 

 

 

 

 

+++

아 알았음

뭐가 틀렸는지

여기가 틀림. 나는 나중에 +1하지말고 그냥 자기자신 만나도 1을 추가해라는 생각으로 저렇게 했는데

자기자신이랑 같은 데이터가 있을 수 있다는 것을 간과해버림.;;;

저걸  < 로 바꾸고 나중에 rank에 +1을 해주니 잘됨 ㅜㅜ 젠즈앙

 

고침

//1. 사람수 입력받기
//2. 사람수 만큼 키 몸무게 입력받기
//3. 키 몸무게 공백으로 split하기
//4. split된 키 몸무개 객체로 만들어서 array로 만들기
//5. array들 객체 각각 자신보다 몸무게&&키 큰 객체의 수 세서 출력

import java.util.Scanner;


public class Main{

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //1. 사람수 입력받기
        int N = sc.nextInt();
        sc.nextLine();
        Info[] infos = new Info[N];
        
        for(int i=0;i<N;i++){
            //2. 사람수 만큼 키 몸무게 입력받기
            String infoText=sc.nextLine();
            //3. 키 몸무게 공백으로 split하기
            String[] infoTexts = infoText.split(" ");
            //4. split된 키 몸무개 객체로 만들어서 array로 만들기
            infos[i]=new Info(Integer.parseInt(infoTexts[0]),Integer.parseInt(infoTexts[1]));
        }
        
        //등수 출력

        for(int i=0;i<N;i++){
            int cnt=0;
            for(int j=0;j<N;j++){
                if(infos[i].getWeight()<infos[j].getWeight()
                  && infos[i].getHeight()<infos[j].getHeight()){
                    cnt++;
                }
            }
            int rank = cnt+1;
            System.out.print(rank+" ");

        }
        
    }
}

    class Info{
        private int weight;
        private int height;

    Info(int weight,int height){
            this.weight = weight;
            this.height = height;
        }

     int getWeight(){
            return this.weight;
        }

     int getHeight(){
            return this.height;
        }
    }

 

물론 2차원 배열로 하는게 더 속도도 빠르고 코드도 간결함!

복습때는 2차원 배열로 한걸로 올리겠움

 

 

++ 07/23 복습

 

 

 

 

stringBuilder 이용

//1. 사람수 N 입력받음
//2. 키 몸무게 입력받고 배열에 넣기
import java.util.Scanner;
class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[][] info = new int[N][2];
        sc.nextLine();
        for(int i=0;i<N;i++){
            String[] infos = sc.nextLine().split(" ");
            info[i][0]=Integer.parseInt(infos[0]);//몸무게
            info[i][1]=Integer.parseInt(infos[1]);//키 
        }
        
       int[] rank = new int[N];
       
        for(int i=0;i<N;i++){
             int cnt=0;
            for(int j=0;j<N;j++){
                if(info[i][0]<info[j][0] && info[i][1]<info[j][1]){
                  cnt++;  
                }
            }
            rank[i]=cnt+1;
        }
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i<N;i++){
            sb.append(rank[i]);
            sb.append(' ');
        }
        System.out.println(sb.toString());
    }
}

 

그냥 print out

//1. 사람수 N 입력받음
//2. 키 몸무게 입력받고 배열에 넣기
import java.util.Scanner;
class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[][] info = new int[N][2];
        sc.nextLine();
        for(int i=0;i<N;i++){
            String[] infos = sc.nextLine().split(" ");
            info[i][0]=Integer.parseInt(infos[0]);//몸무게
            info[i][1]=Integer.parseInt(infos[1]);//키 
        }
        
        for(int i=0;i<N;i++){
             int cnt=0;
            for(int j=0;j<N;j++){
                if(info[i][0]<info[j][0] && info[i][1]<info[j][1]){
                  cnt++;  
                }
            }
            int rank = cnt+1;
            System.out.print(rank + " ");
        }
       
    }
}

string builder가 코드도 더 길고 rank배열도 따로 생성해야해서 더 오래걸릴줄알았는데 더 적게 걸림.

 

rank 배열 생성안하고 stringbuilder이용

//1. 사람수 N 입력받음
//2. 키 몸무게 입력받고 배열에 넣기
import java.util.Scanner;
class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[][] info = new int[N][2];
        sc.nextLine();
        for(int i=0;i<N;i++){
            String[] infos = sc.nextLine().split(" ");
            info[i][0]=Integer.parseInt(infos[0]);//몸무게
            info[i][1]=Integer.parseInt(infos[1]);//키 
        }
        
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<N;i++){
             int cnt=0;
            for(int j=0;j<N;j++){
                if(info[i][0]<info[j][0] && info[i][1]<info[j][1]){
                  cnt++;  
                }
            }
            sb.append(cnt+1);
            sb.append(' ');
        }
        
        System.out.println(sb.toString());
    }
}

맨위에거가 이 코드로 한거. 제일 빠름. 뭐 rank배열 생성한거나 안한거나 속도차이는 크게 없지만 메모리 절약을 위해 불필요한 배열은 생성 안하는게 낫겠찌?

728x90

댓글