본문 바로가기
프로그래밍/C++ :: 백준

[C/C++] 백준 3009 : 네 번째 점 / 15894 : 수학은 체육과목 입니다 / 9063 : 대지

by 항해 2023. 5. 8.
 

3009번: 네 번째 점

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

www.acmicpc.net

#include <iostream>

int main(){
    int arr[4][2];
    for(int i=0; i<3; i++){
        for(int j=0; j<2; j++){
            std::cin >> arr[i][j];
        }
    }
    
    if(arr[0][0] == arr[1][0])  //x좌표  
        arr[3][0] = arr[2][0];
    else if(arr[0][0] == arr[2][0])
        arr[3][0] = arr[1][0];
    else
        arr[3][0] = arr[0][0];
    
    if(arr[0][1] == arr[1][1])  //y좌표  
        arr[3][1] = arr[2][1];
    else if(arr[0][1] == arr[2][1])
        arr[3][1] = arr[1][1];
    else
        arr[3][1] = arr[0][1];
    
    std::cout << arr[3][0] << " " << arr[3][1];
   
}

 

배열로 풀어봤다. 두 점 씩 x 좌표 수가 같다는 점을 이용해서 풀었다.

 

 

15894번: 수학은 체육과목 입니다

성원이는 수학을 정말 못 하는 고등학생이다. 수학을 못하는 대신 근성과 팔 힘이 뛰어난 성원이는 수학 시험에서 수학 지식을 사용하지 않고 근성과 체력을 사용해 문제를 푼다. 지난 시험에서

www.acmicpc.net

 

가장 아랫부분의 정사각형 개수 n은 총 줄의 개수와 같고, 실선으로 이루어진 도형의 둘레 길이는 맨 아랫줄의 도형 둘레와 같다. 간단하게 4n이다.

처음에 틀린 이유는 int n으로 초기화해서. long long n으로 초기화하고 맞았다.

 

#include <iostream>

int main(){
    long long n;
    std::cin >> n;
    
    std::cout << 4*n;
    return 0;
}

 

 

 

 

9063번: 대지

첫째 줄에는 점의 개수 N (1 ≤ N ≤ 100,000) 이 주어진다. 이어지는 N 줄에는 각 점의 좌표가 두 개의 정수로 한 줄에 하나씩 주어진다. 각각의 좌표는 -10,000 이상 10,000 이하의 정수이다. 

www.acmicpc.net

 

가장 가장자리의 x, y좌표들을 알면 구할 수 있다.

 

#include <iostream>

int main(){
    int N;
    std::cin >> N;
    
    int b[N][2];
    std::cin >> b[0][0] >> b[0][1];
    int maxX = b[0][0], maxY = b[0][1];
    int minX = b[0][0], minY = b[0][1];
    
    for(int i=1; i<N; i++){
        for(int j=0; j<2; j++){
            std::cin >> b[i][j];
            if(j=0 && minX > b[i][j]) minX = b[i][j];
            if(j=1 && minY > b[i][j]) minY = b[i][j];
            if(j=0 && maxX < b[i][j]) maxX = b[i][j];
            if(j=1 && maxY < b[i][j]) maxY = b[i][j];
        }
    }
    
    std::cout << (maxX-minX) * (maxY-minY);
    
    return 0;
}

 

첨엔 이렇게 구성했는데, 시간초과가 계속 났다.

 

#include <iostream>

int main(){
    int N;
    std::cin >> N;
    
    int b[N][2];
      
    for(int i=0; i<N; i++){ 
        for(int j=0; j<2; j++){
            std::cin >> b[i][j]; //좌표 입력
        }
    }

    int maxX = b[0][0], maxY = b[0][1];
    int minX = b[0][0], minY = b[0][1]; // max min 초기화
    
    for(int i=0; i<N; i++){ 
        if(maxX < b[i][0])
            maxX = b[i][0];
        if(minX > b[i][0])
            minX = b[i][0];
    }
    
    for(int i=0; i<N; i++){
        if(maxY < b[i][1])
            maxY = b[i][1];
        if(minY > b[i][1])
            minY = b[i][1];
    }
    
    std::cout << (maxX-minX) * (maxY-minY);
    
    return 0;
}

 

그래서 그냥 아예 따로 비교해줬다.

 

#include <iostream>

int main(){
    int N;
    std::cin >> N;
    
    int b[N][2];
    std::cin >> b[0][0] >> b[0][1];
    int maxX = b[0][0], maxY = b[0][1];
    int minX = b[0][0], minY = b[0][1];
    
    for(int i=1; i<N; i++){
        for(int j=0; j<2; j++){
            std::cin >> b[i][j];
            if(j==0){
                if(minX > b[i][j])
                    minX = b[i][j];
                if(maxX < b[i][j])
                    maxX = b[i][j];
            }
            
            else{
                if(minY > b[i][j])
                    minY = b[i][j];
                if(maxY < b[i][j])
                    maxY = b[i][j];
            }
        }
    }
    
    std::cout << (maxX-minX) * (maxY-minY);
    
    return 0;
}

 

지금 보니까 논리 연산자가 처리 속도가 느린걸까? for for if 구조로 해도 풀리긴하네..

댓글