개발일기

백준 2246번 JAVA 풀이 - 콘도 선정 본문

알고리즘 문제풀이/백준

백준 2246번 JAVA 풀이 - 콘도 선정

한민기 2022. 6. 5. 15:12
반응형

문제 링크 : https://www.acmicpc.net/problem/2246

 

2246번: 콘도 선정

첫째 줄에 콘도의 개수를 나타내는 자연수 N(1 ≤ N ≤ 10,000)이 주어진다. 다음 N개의 줄에는 각 콘도에 대한 정보를 나타내는 두 정수 D(1 ≤ D ≤ 10,000), C(1 ≤ C ≤ 10,000)가 주어진다. D는 그 콘도의

www.acmicpc.net

문제

콘도를 선정할 때에는 가급적이면 싸고 바닷가에 가까운 곳으로 하려 한다. 이를 위해 우선 적당한 콘도 몇 곳을 후보로 선정하려 하는데, 다음 두 조건을 만족하는 콘도 X가 후보가 된다.

  1. X보다 바닷가에 더 가까운 콘도들은 모두 X보다 숙박비가 더 비싸다.
  2. X보다 숙박비가 더 싼 콘도들은 모두 X보다 바닷가에서 더 멀다.

각 콘도의 바닷가에서의 거리와 숙박비에 대한 정보가 주어졌을 때, 후보 콘도의 개수를 구해내는 프로그램을 작성하시오.

입력

첫째 줄에 콘도의 개수를 나타내는 자연수 N(1 ≤ N ≤ 10,000)이 주어진다. 다음 N개의 줄에는 각 콘도에 대한 정보를 나타내는 두 정수 D(1 ≤ D ≤ 10,000), C(1 ≤ C ≤ 10,000)가 주어진다. D는 그 콘도의 바닷가로부터의 거리를 나타내고, C는 그 콘도의 숙박비를 나타낸다. 서로 다른 두 콘도의 D 값과 C값이 모두 같은 입력은 주어지지는 않는다.

출력

첫째 줄에 후보가 될 수 있는 콘도의 수를 출력한다.

 

# 문제 풀이

해당 문제에는 하나의 속임수가 있다. 문제에서 제시된 2가지의 조건인

"X보다 바닷가에 더 가까운 콘도들은 모두 X보다 숙박비가 더 비싸다"

"X보다 숙박비가 더 비싼 콘도들은 모두 X보다 바닷가에서 더 멀다"

의 2가지 조건을 다시 풀어 쓰면 "X보다 더 가까운 콘도들은 X보다 싸면 안된다" "X보다 싸면 X보다 가까우면 안된다."

로 바꿔 해석할 수 있으며 해당 조건은 동일한 조건이기 때문에 조건문 1개로 두가지 조건을 처리할 수 있다.

 

1. 콘도들의 거리와 가격을 입력받아 2차원 배열에 담는다.

int[][] cond = new int[num][2];

for(int i = 0; i < num; i++){
	cond[i][0] = sc.nextInt();
	cond[i][1] = sc.nextInt();
}

 

2. index과 i의 숫자가 같으면 같은 콘도 이기 때문에 continue로 넘겨주고 그게 아닐경우 조건 1,2 에 충족한지 확인 후 

충족하지 않다면 false를 리턴한다. 

static boolean checkQ(int[][] arrs, int index){
	for(int i = 0; i < arrs.length; i++){
		if(i == index) continue;
        
		if(arrs[index][0] >= arrs[i][0] && arrs[index][1] >= arrs[i][1]) return false;
	}
	return true;
}

 

3. 조건에 충족하여 true가 리턴되었다면 answer의 값을 1 더해주어 조건에 충족하는 콘도의 갯수를 파악한다.

for(int i = 0; i < num; i++){
	if(checkQ(cond, i)) answer++; 
}

 

 

# 전체 코드

import java.util.*;

public class Main_2246 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        int num = sc.nextInt();
        int answer = 0;

        int[][] cond = new int[num][2];

        for(int i = 0; i < num; i++){
            cond[i][0] = sc.nextInt();
            cond[i][1] = sc.nextInt();
        }

        for(int i = 0; i < num; i++){
            if(checkQ(cond, i)) answer++; 
        }

        System.out.println(answer);
    }   
    
    static boolean checkQ(int[][] arrs, int index){
        for(int i = 0; i < arrs.length; i++){
            if(i == index) continue;

            if(arrs[index][0] >= arrs[i][0] && arrs[index][1] >= arrs[i][1]) return false;
        }
        return true;
    }
}
반응형
Comments