728x90

문제

아름이를 포함하여 총 N명의 사람이 돌 던지기 게임을 하고 있다.

이 돌 던지기 게임은 앞으로 돌을 던져 원하는 지점에 최대한 가깝게 돌을 던지는 게임이다.

정확하게 말하면 밀리미터 단위로 -100,000에서 100,000까지의 숫자가 일렬로 써져 있을 때, 사람들은 숫자 100,000이 써져 있는 위치에 서서 최대한 0에 가까운 위치로 돌을 던지려고 한다.

N명의 사람들이 던진 돌이 떨어진 위치를 측정한 자료가 주어질 때, 가장 0에 가깝게 돌이 떨어진 위치와 0 사이의 거리 차이와 몇 명이 그렇게 돌을 던졌는지를 구하는 프로그램을 작성하라.

 

입력

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 테스트 케이스의 첫 번째 줄에는 돌을 던지는 사람의 수 N(1≤N≤1,000)이 주어진다.

두 번째 줄에는 각 사람이 돌을 던졌을 때 돌이 떨어진 위치를 나타내는 N개의 정수가 공백으로 구분되어 주어진다.

모든 사람이 돌을 그럭저럭 잘 던졌기 때문에, 돌이 떨어지는 위치는 항상   -100,000에서 100,000사이 범위의 정수이다. (-100,000과 100,000도 돌이 떨어질 수 있다.)

 

출력

각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,

돌이 가장 0에 가깝게 떨어진 곳과 0 사이의 거리 차이와 그렇게 던진 사람이 몇 명인지 나타내는 정수를 공백 하나로 구분하여 출력한다.

 

예제

[입력] [출력]
2
2
-100 100
3
-5 -1 3
#1 100 2
#2 1 1

 

문제 해결 방법

  • @N@개의 거리들을 입력 받아 @abs@ 함수를 이용하여 절댓값으로 변환 후 벡터(@distances@) 객체에 넣는다.
  • 그리고 절댓값 거리의 최솟값(@min_num@)을 찾은 후, 최솟값과 똑같은 수들의 개수(@cnt@)들을 벡터(@distances@) 안에서 찾는다.
  • 최종적으로 최솟값(@min_num@)과 최솟값과 똑같은 수들의 개수(@cnt@)를 출력해준다.
for (int test_case = 1; test_case <= T; test_case++) {
    cin >> N;

    distances.clear();  

    for (int j = 0; j < N; j++) {
        cin >> dist;

        distances.push_back(abs(dist));    // 절댓값으로 넣기
    }

    // 오름차순 정렬
    sort(distances.begin(), distances.end());
    int min_num = distances[0];

    int cnt = 0;
    for (int i = 0; i < N; i++) {
        if (distances[i] == min_num) {
            cnt++;
        }
    }

    cout << "#" << test_case << " " << min_num << " " << cnt << '\n'; 
}

 

코드

C++ 코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;

int T, N, dist;
vector<int> distances;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> T;

    for (int test_case = 1; test_case <= T; test_case++) {
        cin >> N;

        distances.clear();  
        
        for (int j = 0; j < N; j++) {
            cin >> dist;

            distances.push_back(abs(dist));    // 절댓값으로 넣기
        }
        
        // 오름차순 정렬
        sort(distances.begin(), distances.end());
        int min_num = distances[0];

        int cnt = 0;
        for (int i = 0; i < N; i++) {
            if (distances[i] == min_num) {
                cnt++;
            }
        }

        cout << "#" << test_case << " " << min_num << " " << cnt << '\n'; 
    }

    return 0;
}

 

Python 코드

T = int(input())

for test_case in range(1, 1 + T):
    N = int(input())
    locations = list(map(int, input().split()))

    distances = []
    for loc in locations:
        distance = abs(loc)
        distances.append(distance)
    
    distances.sort()    # 오름차순 정렬
    num_min = distances[0]    # 최솟값 선택

    count = 0
    for dist in distances:
        if dist == num_min:
            count += 1
    
    print(f"#{test_case} {num_min} {count}")

 

참고

  • 난이도: D2
728x90