happy318
팽도리블로그
happy318
전체 방문자
오늘
어제
  • 전체글 (252)
    • 공부 (5)
      • Algorithm 정리 (0)
      • 논문리뷰 (1)
      • C++ (2)
      • Python (2)
      • Java (0)
      • Back-end (0)
      • Front-end (0)
      • Embedded (0)
    • 코딩테스트 (218)
      • Python 문제풀이 (100)
      • C++ 문제풀이 (108)
      • Python template (9)
      • C++ template (1)
    • 일상 (20)
      • 맛집 (13)
      • 쇼핑 (5)
      • 아무 일상 (2)
    • 게임 (9)
      • 메이플스토리 (9)

최근 글

인기 글

hELLO · Designed By 정상우.
happy318

팽도리블로그

코딩테스트/C++ 문제풀이

[백준] 참외밭

2022. 11. 27. 21:53

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

 

2477번: 참외밭

첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지

www.acmicpc.net

문제부터 간단하게 요약하면, 

 

ㄱ자를 회전 시킨 모양의 밭이 주어지고, 임의의 한 꼭짓점에서 반시계 방향으로 둘레의 변의 길이들이 주어집니다. 이 때, 밭의 넓이를 통해 밭에서 자라는 참외의 수를 구하는 문제입니다.

 

<Solution>

단위 면적당 자라는 갯수가 주어지므로, 넓이만 구하면 됩니다. 

 

물론 가장 긴변의 양옆 변을 통해 찾는등 다른 방법들도 많겠지만, 

그냥 주어진 변들을 이웃한 것들 끼리 모두 곱해서 더하고, 이 과정중 가장 큰 값을 기록합니다. 그리고 모두 더한 값에서 가장 큰 값을 두번 빼주면 넓이가 나옵니다.

 

그림을 통해 간단하게 그려보면, 

보라색 부분의 밭이 있다고 가정하고, 각각 이웃한 두변을 모두 곱해서 더해주면, 밭의 영역은 3번 더해졌고, 외곽은 두번 더해진 것을 알 수 있습니다. 따라서 가장 큰 계산값을 두번 빼주면 밭의 넓이를 계산할 수 있음을 알 수 있습니다.

 

코드 구현은 아래와 같습니다.

#include <iostream>
using namespace std;
 
int K;
int A[6+10];
int B[6+10];
void InputData(){
    cin >> K;
    for (int i=0 ; i<6 ; i++){
        cin >> A[i] >> B[i];
    }
}
int sol(){
    int tmp = 0;
    int max_k = 0;
    for(int i = 0; i<6; i++){
        int k = B[i]*B[(i+1)%6];
        tmp += k;
        max_k = max(max_k, k);
    }
    return (tmp - 2*max_k) * K;
}
 
int main(){
    int ans = -1;
    InputData();
 
    ans = sol();
    cout << ans << endl;
    return 0;
}
반응형

'코딩테스트 > C++ 문제풀이' 카테고리의 다른 글

[백준] 매직 스타  (0) 2022.11.29
[백준] Escaping the Farm  (1) 2022.11.29
[정올] Uniqueness  (0) 2022.11.27
[백준] 연속부분최대곱  (0) 2022.11.27
[백준] 빙고  (0) 2022.11.27
    '코딩테스트/C++ 문제풀이' 카테고리의 다른 글
    • [백준] 매직 스타
    • [백준] Escaping the Farm
    • [정올] Uniqueness
    • [백준] 연속부분최대곱
    happy318
    happy318

    티스토리툴바