티스토리 뷰

반응형
백준 비밀번호 발음하기 (4659번) C++ 풀이

백준 등수 구하기 1205 C++


문제 설명


백준 온라인 저지 1205번 등수 구하기 문제는 다음과 같은 상황을 다룹니다.

  • 랭킹 리스트에는 최대 P개의 점수가 비오름차순(=내림차순)으로 저장되어 있습니다.
  • 새로운 점수가 들어왔을 때, 이 점수가 몇 등에 위치하게 되는지 구하는 문제입니다.
  • 만약 리스트가 꽉 차 있다면, 새 점수가 마지막 점수보다 커야만 들어갈 수 있습니다.
  • 동점일 경우에는 “같은 점수 중 가장 높은 순위”를 공유하게 됩니다.
  • 리스트에 들어갈 수 없다면 -1을 출력합니다.


접근 방법


  1. 입력 처리
    • N: 현재 리스트에 있는 점수 개수
    • new_score: 새 점수
    • P: 랭킹 리스트 최대 크기
  2. 등수 계산
    • 랭킹 리스트는 내림차순이므로, 위에서부터 차례대로 비교하면서 새 점수보다 큰 점수 개수만큼 등수를 밀립니다.
    • new_score < arr[i]이면 rank++
    • new_score ≥ arr[i]가 되는 순간 현재 rank가 확정됩니다.
  3. 출력 조건
    • 리스트가 비어 있다면 → 무조건 1등.
    • 리스트 크기 N < P라면 → 무조건 들어갈 수 있음.
    • 리스트 크기 N == P라면 → 마지막 점수(arr[N-1])보다 커야 들어갈 수 있음.
    • 들어갈 수 없으면 -1.


C++ 코드


#include <iostream>
#include <cstring>
using namespace std;

bool Check(char c)
{
    return (c=='a' || c=='e' || c=='i' || c=='o' || c=='u');
}

int main(void)
{
    while(true)
    {
        char arr[100];
        int cnt_mo=0, cnt_ja=0;
        bool mo=false, check=true;
        cin >> arr;

        if(strcmp(arr,"end")==0) break;

        for(int i=0; arr[i]!='\0'; i++)
        {
            if(Check(arr[i]))
            {
                mo = true;
                cnt_mo++;
                cnt_ja = 0;
            }
            else
            {
                cnt_ja++;
                cnt_mo = 0;
            }

            if(cnt_mo >= 3 || cnt_ja >= 3)
            {
                check = false;
                break;
            }

            if(i > 0 && arr[i] == arr[i-1] && arr[i] != 'e' && arr[i] != 'o')
            {
                check = false;
                break;
            }
        }

        if(mo && check)
            cout << "<" << arr << "> is acceptable." << endl;
        else
            cout << "<" << arr << "> is not acceptable." << endl;
    }
    return 0;
}


코드 설명


  • if (N == 0)
    리스트가 비어 있다면 새 점수가 무조건 1등입니다.
  • 등수 계산
    for문에서 내림차순 리스트를 순회하면서, 새 점수보다 큰 값이 나올 때마다 등수를 하나씩 밀립니다. 처음으로 new_score ≥ arr[i]가 되는 순간 그 자리에 들어갈 수 있으므로 break 합니다.
  • 리스트 크기 체크
    • N < P → 아직 자리가 남았으므로 들어갈 수 있습니다.
    • N == P → 마지막 원소 arr[N-1]보다 엄격히 커야 들어갈 수 있습니다.
    • 동점일 경우에는 -1을 출력해야 합니다.


핵심 포인트


  • 내림차순 정렬이므로, 등수를 찾을 때 끝까지 볼 필요가 없습니다.
  • 다만, **리스트가 꽉 찼을 때 마지막 원소와 비교하는 조건**이 중요합니다.
  • 이 조건을 놓치면 동점일 때 잘못된 답이 나옵니다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함
반응형