반응형

문제 링크

 

1946번: 신입 사원

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성

www.acmicpc.net

 

 

풀이 )

  서류 성적과 면접 성적 뭐가 되어도 상관 없지만 나는 서류 성적에 대해서 성적이 좋은 순서에서 안좋은 순서로 정렬해줬다.

 

  1등에 있는 사람은 서류 성적이 누구보다 높기 때문에 항상 뽑힐 수 있다.

  이후에 있는 사람은 1등보다 서류 성적은 떨어지기 때문에 면접 성적은 더 좋아야한다.

  그렇기 때문에 현재의 가장 낮은 면접 성적 커트라인을 cut에 저장하여 커트라인을 통과한다면, 커트라인을 현재 사람의 면접 성적과 비교하여 더 작은 값으로 갱신해주고, 정답을 한명 늘려준다.

 

import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        String[] in;

        int t = Integer.parseInt(br.readLine());
        while(t-- > 0){
            int n = Integer.parseInt(br.readLine());
            Point[] scores = new Point[n];
            for(int i = 0; i < n; ++i){
                in = br.readLine().split(" ");
                scores[i] = new Point(Integer.parseInt(in[0]), Integer.parseInt(in[1]));
            }
            Arrays.sort(scores, (o1, o2)->
                o1.x-o2.x
            );
            int ans = 0;
            int cut = (int)1e9;
            for(int i = 0; i < n; ++i){
                int cur = scores[i].y;
                if(cur < cut) {
                    ans++;
                    cut = Math.min(cur, cut);
                }
            }
            sb.append(ans).append('\n');
        }
        System.out.print(sb);
    }
}
반응형
반응형

문제 링크

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net

 

 

풀이 )

  가장 큰 수를 두개 뽑아 곱했을때가 다른 두 수를 곱했을 때보다 결과가 크기 때문에 우선 내림차순으로 정렬했다.

  이후 앞에서부터 두 수를 뽑아 곱한다.

 

  이 때 1과 0은 다른 양수와 곱해지는 경우 곱이 합보다 작아지게 되므로 1부터 예외처리해준다.

  n * 1 < n + 1, n * 0 < n + 0

 

  음수 2개를 곱하는 경우 양수가 되기 때문에 그 값을 최대로 만들기 위해 절댓값이 큰 끝부터 2개씩 곱하면서 더한다.

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(void){
    int n;
    cin >> n;
    vector<int> v(n);
    for(int i = 0; i < n; ++i)
        cin >> v[i];

    sort(v.begin(), v.end(), greater<int>());
    int ans = 0;

    int i = 0;
    for(; i < n; i+=2){
        if(v[i+1] <= 1)
            break;
        ans += v[i]*v[i+1];
    }
    for(; i < n; ++i){
        if(v[i] < 1)
            break;
        ans += v[i];
    }

    int j = n-1;
    for(; j > i; j-=2)
        ans += v[j]*v[j-1];
    if(i == j)
        ans += v[j];

    cout << ans << '\n';
}

 

반응형

'문제풀이 > 백준' 카테고리의 다른 글

[JAVA] 백준 - 13549 : 숨바꼭질3  (0) 2021.02.13
[JAVA] 백준 - 5052 : 전화번호 목록  (0) 2021.02.13
[C++] 백준 - 1963 : 소수 경로  (0) 2021.01.15
[C++] 백준 - 1744 : 수 묶기  (0) 2021.01.15
[C++] 백준 - 1068 : 트리  (0) 2021.01.13
반응형

문제 링크

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net

 

 

풀이 )

  가장 큰 두 수를 뽑아 곱하는 경우가 가장 큰 결과값이 나오기 때문에 먼저 입력받은 수열에 대해서 내림차순으로 정렬해주었다.

 

  • 앞에서부터 두 수가 모두 1보다 큰 경우에 대해서 두 수를 곱해준다.
  • 한자리씩 검사하여 1이 있는 경우 1은 다른 수와 곱했을 때 합이 최대가 될 수 없으므로 따로 분류해 둔다. (1+n > 1*n)
  • 음수 두 수를 곱하면 양수가 되므로 절댓값이 큰 뒤에서 부터 두 수를 곱해준다.
  • 음수가 홀수인 경우 마지막으로 남은 수를 처리한다.

위의 4가지를 순서대로 구현했다.

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(void){
    int n;
    cin >> n;
    vector<int> v(n);
    for(int i = 0; i < n; ++i)
        cin >> v[i];

    sort(v.begin(), v.end(), greater<int>());
    int ans = 0;
    int idx = 0;

    int i = 0;
    for(; i < n; i+=2){
        if(v[i+1] <= 1)
            break;
        ans += v[i]*v[i+1];
    }
    for(; i < n; ++i){
        if(v[i] < 1)
            break;
        ans += v[i];
    }

    int j = n-1;
    for(; j > i; j-=2)
        ans += v[j]*v[j-1];
    if(i == j)
        ans += v[j];

    cout << ans << '\n';
}
반응형

'문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 - 1744 : 수 묶기  (0) 2021.01.26
[C++] 백준 - 1963 : 소수 경로  (0) 2021.01.15
[C++] 백준 - 1068 : 트리  (0) 2021.01.13
[C++] 백준 - 2580 : 스도쿠  (0) 2021.01.13
[C++] 백준 - 10942 : 팰린드롬?  (0) 2021.01.13
반응형

문제 링크

 

17828번: 문자열 화폐

첫 번째 줄에 문자열의 길이 N(1 ≤ N ≤ 5,000,000)과, 문자열의 가치를 나타내는 정수 X(1 ≤ X ≤ 500,000,000)가 공백으로 구분되어 주어진다.

www.acmicpc.net

 

풀이 )

  사전 순이기 때문에 앞에 최대한 작은 알파벳이 들어가야되기 때문에 뒤쪽으로 최대한 큰 알파벳을 배치하면 된다.

  즉, 앞쪽에는 가능하면 'A'를 뒤쪽에는 가능하면 'Z'를 배치하면 된다.

 

  먼저 가치를 모두 'A'로 나타내는 가치보다 작은 경우와 모두 'Z'로 나타내는 가치보다 큰 경우는 만족하는 문자열이 없으므로 '!'를 출력한다.

  이후 각 자리에 'A'를 배치하고 뒤에서부터 'Z'를 채워 넣기 위해 처음에 문자열의 길이만큼 빼서 'A'를 분배한다.

  'Z'가 가능한만큼 현재 남은 가치에서 25씩 빼간다. 남은 가치가 25미만인 경우 남은 가치를 마지막에 더해주고 마지막에 'A'를 빈자리에 채워준다.

 

  '+=' 연산 시 의도와 달리 뒤로 문자를 추가해가기 때문에 마지막에 reverse( )를 취한다.

 

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main(void){
    int n, x;
    cin >> n >> x;
    if(x < n || x > n*26){
        cout << "!\n";
        return 0;
    }

    string ans;
    x -= n;
    while(x >= 25){
        ans += 'Z';
        x-=25;
    }
    if(x)
        ans += 'A'+x;

    int len = ans.length();
    for(int i = len; len < n; ++len)
        ans += 'A';
    reverse(ans.begin(), ans.end());
    cout << ans << '\n';
}

 

주의 )

  위와 같이 구현했을 때, 'Z'를 채워 넣은 후 남은 가치를 넣는 경우 조건문을 넣지 않는 경우 "ZZZZ"와 같이 'Z'로만 이루어져 남은 가치가 0이 되면 'A'가 추가되어 "AZZZZ"가 되기 때문에 조건문을 추가해줘야된다.

반응형
반응형

문제 링크

 

4796번: 캠핑

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.

www.acmicpc.net

 

풀이 )

  연속된 휴가가 p 일중에서 가장 앞에 연속된 l 일이라고 두고 풀면된다. 

 

#include <iostream>
#include <algorithm>

using namespace std;

int main(void){
    int l, p, v;
    int c = 0;
    while(1){
        c++;
        int ans = 0;
        cin >> l >> p >> v;
        if(l == 0 || p == 0 || v == 0){
            return 0;
        }
        while(v > p){
            ans += l;
            v -= p;
        }
        ans += min(l, v);
        cout << "Case " << c << ": " << ans << endl;
    }
}

 

주의 )

  마지막에 남은 휴가 일수가 p보다 적어져 안에 있는 while문을 탈출한 경우 마지막으로 l과 비교하여 더 적은 값만큼 캠핑장을 사용할 수 있다.

반응형

+ Recent posts