[ 기타 ]/코딩테스트

[백준/JAVA] 7568번 덩치 (브루트포스, 구현)

2023. 5. 18. 23:00
목차
  1. 문제 설명
  2. 풀이 1 전체 코드
  3. 풀이 2 전체 코드
  4. 풀이 1
  5. 풀이 2
  6. 결과

문제 설명

코딩테스트 초보라서.. 맨 처음에 Map으로 해야 하나.. List로 해야 하나 고민했다. (2차원배열을 쓰면 되는데..)
그러다가 그냥 Man이라는 클래스를 하나 만들어서 몸무게, 키, 나보다 큰 사람 수 세개의 필드를 만들고 입력받은 값으로 Man 객체를 생성해서 List에 넣고 for문을 돌며 비교하는 방법을 생각해 냈다. 이후에 다른 사람의 풀이를 찾아보니 간편하게 배열로 푸는 것을 보고 배열로도 풀어봤다.

입, 출력은 BufferedReader, StringTokenizer, StringBuilder를 이용해서 풀었다.


풀이 1 전체 코드

더보기
public class No7568 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());

        //list에 man 넣기
        List<Man> list = new ArrayList<>();
        for(int i=0;i<N;i++){
            st = new StringTokenizer(br.readLine());
            int tall = Integer.parseInt(st.nextToken());
            int weight = Integer.parseInt(st.nextToken());
            Man man = new Man(tall,weight);
            list.add(man);
        }
        //man의 count 설정
        for(int i=0;i<N;i++){
            Man thisMan = list.get(i);
            for(int j=0;j<N;j++){
                if(i == j)continue;
                Man compareMan = list.get(j);
                if(isSmaller(thisMan,compareMan)){
                    thisMan.count();
                }
            }
        }
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<N;i++){
            Man man = list.get(i);
            sb.append(man.count+1).append(" ");
        }
        System.out.println(sb);

    }

    public static boolean isSmaller(Man thisMan, Man compareMan){
        if(thisMan.tall<compareMan.tall && thisMan.weight<compareMan.weight){
            return true;
        }
        return false;
    }
    static class Man{
        int tall;
        int weight;
        int count;

        public Man(int tall, int weight) {
            this.tall = tall;
            this.weight = weight;
            this.count = 0;
        }
        public void count() {
            this.count++;
        }
    }
}

풀이 2 전체 코드

더보기
public class No7568_2 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());

        //배열에 man 넣기
        int[][] arr = new int[N][2];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int tall = Integer.parseInt(st.nextToken());
            int weight = Integer.parseInt(st.nextToken());
            arr[i][0] = tall;
            arr[i][1] = weight;
        }
        //비교
        for(int i=0;i<N;i++){
            int rank = 1;
            for(int j=0;j<N;j++){
                if(i==j) continue;
                if(isSmaller(arr[i],arr[j])){
                    rank++;
                }
            }
            sb.append(rank).append(" ");
        }
        System.out.println(sb);
    }
    public static boolean isSmaller(int[] thisMan, int[] compareMan){
        if(thisMan[0]<compareMan[0] && thisMan[1]<compareMan[1]){
            return true;
        }
        return false;
    }
}

풀이 1

우선 Man 클래스를 하나 만든다.

키, 몸무게, 나보다 큰 사람의 수 세개의 필드와 count를 하나 증가시켜 줄 메서드를 만들었다.

static class Man{
        int tall;//키
        int weight;//몸무게
        int count;//나보다 큰 사람의 수

        public Man(int tall, int weight) {
            this.tall = tall;
            this.weight = weight;
            this.count = 0;
        }
        public void count() {
            this.count++;
        }
    }

값을 입력받아서 Man 객체를 생성하고 List에 넣는다.

        List<Man> list = new ArrayList<>();
        for(int i=0;i<N;i++){
            st = new StringTokenizer(br.readLine());
            int tall = Integer.parseInt(st.nextToken());
            int weight = Integer.parseInt(st.nextToken());
            Man man = new Man(tall,weight);
            list.add(man);
        }

for문을 돌며 각각 자기자신(thisMan)을 제외한 다른 Man(compareMan)들과 비교하여

thisMan이 작을 경우 나보다 더 큰 사람의 수를 증가시킨다.

	for(int i=0;i<N;i++){
            Man thisMan = list.get(i);
            for(int j=0;j<N;j++){
                if(i == j)continue;
                Man compareMan = list.get(j);
                if(isSmaller(thisMan,compareMan)){
                    thisMan.count();
                }
            }
        }
        
//isSmaller 메서드
public static boolean isSmaller(Man thisMan, Man compareMan){
        if(thisMan.tall<compareMan.tall && thisMan.weight<compareMan.weight){
            return true;
        }
        return false;
    }

이후에는 List에서 순서대로 Man 객체를 하나씩 꺼내서 그 Man 객체의 count +1 값을 출력한다.


풀이 2

값을 입력받아서 2차원 배열에 넣어준다.

arr[][0]은 키, arr [][1]은 몸무게이다.

 //배열에 값 넣기
        int[][] arr = new int[N][2];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int tall = Integer.parseInt(st.nextToken());
            int weight = Integer.parseInt(st.nextToken());
            arr[i][0] = tall;
            arr[i][1] = weight;
        }

rank는 순위이고, 나보다 큰사람이 하나 나올 때마다 1씩 증가시켜 준다.

여기서는 초기화할 때 미리 1로 초기화해서 출력할 때 그대로 출력하면 된다.

//비교
        for(int i=0;i<N;i++){
            int rank = 1;
            for(int j=0;j<N;j++){
                if(i==j) continue;
                if(isSmaller(arr[i],arr[j])){
                    rank++;
                }
            }
            sb.append(rank).append(" ");
        }

이제 StringBuilder sb를 출력하면 된다.


결과

위가 2차원 배열을 이용한 방법, 아래가 Man클래스를 이용한 방법이다.

생각보다 메모리, 시간 차이가 크지 않았다!

반응형
저작자표시 (새창열림)

'[ 기타 ] > 코딩테스트' 카테고리의 다른 글

[백준/JAVA] 2805번 : 나무 자르기 (이분탐색)  (0) 2023.06.03
[백준/JAVA] 1966번 : 프린터 큐  (0) 2023.05.19
[백준 / JAVA] 1260번 : DFS와 BFS  (0) 2023.05.08
[백준 / JAVA] (DFS) 2023번 : 신기한 소수  (0) 2023.05.08
[백준 / JAVA] (greedy) 2839번 : 설탕배달  (0) 2023.05.08
  1. 문제 설명
  2. 풀이 1 전체 코드
  3. 풀이 2 전체 코드
  4. 풀이 1
  5. 풀이 2
  6. 결과
'[ 기타 ]/코딩테스트' 카테고리의 다른 글
  • [백준/JAVA] 2805번 : 나무 자르기 (이분탐색)
  • [백준/JAVA] 1966번 : 프린터 큐
  • [백준 / JAVA] 1260번 : DFS와 BFS
  • [백준 / JAVA] (DFS) 2023번 : 신기한 소수
HSRyuuu
HSRyuuu
Web Backend Developer happyhsryu
HSRyuuu
HS_dev_log
HSRyuuu
전체
오늘
어제
  • 전체 글 보기 (233)
    • Java (25)
    • Spring (27)
    • JPA & QueryDSL (13)
    • Database (17)
    • 자료구조 & 알고리즘 (30)
    • DevOps (10)
    • [ Computer Science ] (47)
      • Web & Network (14)
      • 프로그래밍 이론 (11)
      • 운영체제 (3)
      • 데이터베이스 이론 (5)
      • Linux 리눅스 (7)
    • [ Frontend ] (17)
      • Vue.js & Nuxt.js (9)
      • JSP_Thymeleaf (7)
    • [ 기타 ] (47)
      • 오픈소스 라이브러리 (5)
      • 코딩테스트 (13)
      • Trouble Shooting (7)
      • Tech Interview (6)
      • Book Review (9)
      • 끄적끄적... (5)
      • 개인 프로젝트 (2)

블로그 메뉴

  • 홈
  • 태그
  • github

공지사항

  • GitHub
  • 공부한 내용을 정리하고 기록하는 블로그 입니다.

인기 글

태그

  • 기술면접
  • Linux
  • SQL
  • Redis
  • 백엔드스쿨
  • TechInterview
  • cleancode
  • JPA
  • 클린코드
  • 백엔드
  • HTTP
  • 트랜잭션
  • 제로베이스
  • 백엔드기술면접
  • 백엔드공부
  • Java
  • 자료구조
  • 개발자
  • Spring
  • springsecurity
  • Redisson
  • web
  • mybatis
  • MySQL
  • 백준
  • SpringBoot
  • Database
  • Nuxt3
  • vue3
  • 리눅스

최근 댓글

최근 글

hELLO · Designed By 정상우.
HSRyuuu
[백준/JAVA] 7568번 덩치 (브루트포스, 구현)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.