일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MySQL
- 자바
- 모의해킹
- 위클리챌린지
- 오라클
- 이클립스
- 알고리즘
- c언어
- SQL 문법
- 빅데이터
- 토이프로젝트
- 스프링부트
- 기초
- 프로그래머스
- 스프링
- SQL 정리
- 스파크
- 데이터베이스
- 파이썬
- 엘라스틱서치
- 문법
- SQL
- 백준
- 문제풀이
- 데이터프로그래밍
- 해킹실습
- 필기
- 코딩테스트
- 리눅스마스터 2급 2차
- 프로그래밍
- Today
- Total
개발일기
백준 2246번 JAVA 풀이 - 콘도 선정 본문
문제 링크 : 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가 후보가 된다.
- X보다 바닷가에 더 가까운 콘도들은 모두 X보다 숙박비가 더 비싸다.
- 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;
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
백준 4108번 JAVA 풀이 - 지뢰찾기 (0) | 2022.06.07 |
---|---|
백준 2822번 JAVA 풀이 - 점수 계산 (0) | 2022.06.06 |
백준 1969번 JAVA 풀이 - DNA (0) | 2022.06.04 |
백준 1925번 JAVA 풀이 - 삼각형 (0) | 2022.06.03 |
백준 3711번 JAVA 풀이 - 학번 (0) | 2022.06.02 |