[C++] 2012번: 등수 매기기

2023. 7. 14. 01:08·알고리즘 공부/백준

링크

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

 

2012번: 등수 매기기

첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 500,000) 둘째 줄부터 N개의 줄에 걸쳐 각 사람의 예상 등수가 순서대로 주어진다. 예상 등수는 500,000 이하의 자연수이다.

www.acmicpc.net

문제

2007년 KOI에 N명의 학생들이 참가하였다. 경시일 전날인 예비소집일에, 모든 학생들은 자신이 N명 중에서 몇 등을 할 것인지 예상 등수를 적어서 제출하도록 하였다.

KOI 담당조교로 참가한 김진영 조교는 실수로 모든 학생의 프로그램을 날려 버렸다. 1등부터 N등까지 동석차 없이 등수를 매겨야 하는 김 조교는, 어쩔 수 없이 각 사람이 제출한 예상 등수를 바탕으로 임의로 등수를 매기기로 했다.

자신의 등수를 A등으로 예상하였는데 실제 등수가 B등이 될 경우, 이 사람의 불만도는 A와 B의 차이 (|A - B|)로 수치화할 수 있다. 당신은 N명의 사람들의 불만도의 총 합을 최소로 하면서, 학생들의 등수를 매기려고 한다.

각 사람의 예상 등수가 주어졌을 때, 김 조교를 도와 이러한 불만도의 합을 최소로 하는 프로그램을 작성하시오.

입출력 예제

입력

첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 500,000) 둘째 줄부터 N개의 줄에 걸쳐 각 사람의 예상 등수가 순서대로 주어진다. 예상 등수는 500,000 이하의 자연수이다.

출력

첫째 줄에 불만도의 합을 최소로 할 때, 그 불만도를 출력한다.

예제 입력 1 복사
5
1
5
3
1
2
예제 출력 1 복사
3

코드

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <cmath>

using namespace std;

int main(void)
{
	vector<int> rank;
	int n;
	long long result = 0;
	cin >> n;

	for (int i = 0; i < n; i++)
	{
		int temp;
		cin >> temp;
		rank.push_back(temp);
	}

	sort(rank.begin(), rank.end());

	for (int i = 0; i < n; i++)
	{
		result += abs(rank[i] - (i + 1));

	}

	cout << result;
}

풀이

  • 그리디 알고리즘을 이용하였다.
  • 예상등수와 실제등수의 간격만큼 불만도가 늘어나니까 정렬을 이용해서 오름차순으로 정렬하고
    for문을 이용해 실제등수를 0부터 끝까지 카운팅하여 정렬된 예상등수와 함께 계산한다.
  • cmath의 abs함수를 이용해 절대값을 구해낸다.
저작자표시 (새창열림)

'알고리즘 공부 > 백준' 카테고리의 다른 글

[C++] 19941번: 햄버거 분배  (0) 2023.07.14
[C++] 13305번: 주유소  (0) 2023.07.14
[C++] 11399번: ATM  (0) 2023.07.13
[C++] 11047번: 동전 0  (0) 2023.07.13
[C++] 15904번: UCPC는 무엇의 약자일까?  (0) 2023.07.11
'알고리즘 공부/백준' 카테고리의 다른 글
  • [C++] 19941번: 햄버거 분배
  • [C++] 13305번: 주유소
  • [C++] 11399번: ATM
  • [C++] 11047번: 동전 0
람팜팜~
람팜팜~
:)
  • 람팜팜~
    RumPumPum
    람팜팜~
  • 전체
    오늘
    어제
    • 전체 (130) N
      • 🎵 일상 (3) N
      • JAVA (5)
        • 김영한의 자바 입문 (3)
      • JavaScript (16)
      • CS 공부 (5)
      • 알고리즘 공부 (60)
        • 프로그래머스 (8)
        • 백준 (52)
        • 개인 메모 (0)
      • ---------------------------.. (0)
      • [게임 개발] 포트폴리오 (2)
        • RPG (1)
        • 슈터-플랫포머 (1)
      • [게임 개발] 개발 일지 (28)
        • RPG (25)
        • TopDownProject (3)
      • [게임 개발] 언리얼엔진 공부 (9)
        • 이득우의 언리얼 프로그래밍 Part.1 (6)
        • 이득우의 언리얼 프로그래밍 Part.2 (1)
        • 개인 메모 (2)
      • [게임 개발] CPP 공부 (2)
        • 이것이 C++ 이다 (1)
        • Effective C++ (0)
        • Effective Modern C++ (0)
        • 홍정모 그래픽스 새싹코스 (1)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      브루트포스
      context switching
      메모리구조
      누적합
      문자열
      참조자
      해시
      스레드
      투포인터
      데드락
      dp
      역참조
      슬라이딩 윈도우
      그리디
      dfs
      프로세스
      우선순위 큐
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    람팜팜~
    [C++] 2012번: 등수 매기기
    상단으로

    티스토리툴바