λͺ©λ‘μœΌλ‘œ
λ°±μ€€

BOJ - [Array - 2852 NBA 농ꡬ] - Silver IV πŸ₯ˆ

https://www.acmicpc.net/problem/2852 μ—­μ‹œ μ΅œκ·Όλ“€μ–΄ 온라인 μ €μ§€μ˜ λ¬Έμ œλ“€μ„ ν’€λŠ”κ²ƒμ„ κ²Œμ„λ¦¬ ν•˜μ˜€μ–΄μ„œ κ·ΈλŸ°μ§€ 이런 싀버정도 λ‚œμ΄λ„μ˜ λ¬Έμ œλ„ μ‹œκ°„μ΄ μ’€ μ‹œκ°„μ΄ 걸릴정도둝 μ‹€λ ₯이 많이 λ–¨μ–΄μ§„ 것 κ°™λ‹€. μ‘°κΈˆλ” λΆ„λ°œ ν•΄μ•Όν•  λ“― ν•˜λ‹€. πŸ˜…

1λΆ„ 읽기

문제

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

μ„€λͺ…

μ—­μ‹œ μ΅œκ·Όλ“€μ–΄ 온라인 μ €μ§€μ˜ λ¬Έμ œλ“€μ„ ν’€λŠ”κ²ƒμ„ κ²Œμ„λ¦¬ ν•˜μ˜€μ–΄μ„œ κ·ΈλŸ°μ§€ 이런 싀버정도 λ‚œμ΄λ„μ˜ λ¬Έμ œλ„ μ‹œκ°„μ΄ μ’€ μ‹œκ°„μ΄ 걸릴정도둝 μ‹€λ ₯이 많이 λ–¨μ–΄μ§„ 것 κ°™λ‹€. μ‘°κΈˆλ” λΆ„λ°œ ν•΄μ•Όν•  λ“― ν•˜λ‹€. πŸ˜…

이번 문제λ₯Ό ν’€λ©΄μ„œ μž‘μ„±ν•œ λ‚΄ μ½”λ“œμ—μ„œ μ €λ²ˆ 문제처럼 주의깊게 μ‚΄νŽ΄λ³Όλ§Œν•œ κΈ°λŠ₯은 크게 μ—†λŠ” 것 κ°™λ‹€. μ†ŒμŠ€κ°€ κΈΈμ–΄μ§ˆκ»„ λŒ€λΉ„ν•΄μ„œ 일뢀λ₯Ό ν•¨μˆ˜ν™” ν•˜μ—¬ λ”°λ‘œ λΉΌλ†“μ€λΆ€λΆ„λ§Œ μ œμ™Έν•˜κ³  말이닀.

#include <stdio.h>
int time_[100],home_sc=0,visitor_sc=0,win_t_home=0,win_t_vis=0,win_status=0,n;
// 득점 μ €μž₯λ³€μˆ˜, 1λ²ˆνŒ€ μŠ€μ½”μ–΄, 2λ²ˆνŒ€ μŠ€μ½”μ–΄, 1λ²ˆνŒ€μ΄ 이기고 있던 μ‹œκ°„(λ‹¨μœ„ : 초), 2λ²ˆνŒ€μ΄ 이기고 있던 μ‹œκ°„(λ‹¨μœ„ : 초), ν˜„μž¬ 이기고 μžˆλŠ” νŒ€ 번호,득점 상황 총 갯수 -> λͺ¨λ‘ μ „μ—­λ³€μˆ˜(Global Variable)둜 선언함.
void compare(int i) //이기고 있던 μ‹œκ°„μ„ κ΅¬λ³„ν•˜μ—¬ μ‹œκ°„μ„ λ”ν•΄μ£ΌλŠ” ν•¨μˆ˜
{
    if(i!=0)    //첫번째 μΌ€μ΄μŠ€λ§Œ μž…λ ₯된 μƒνƒœμ—μ„œλŠ” ν•΄λ‹Ήν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€.
    {
        switch(win_status)
        {
            case 1: //이번 λ“μ μ „κΉŒμ§€ 1λ²ˆνŒ€μ΄ 이기고 μžˆμ—ˆλ‹€λ©΄?
                win_t_home +=  time_[i]-time_[i-1]; //이기고 있던 μ‹œκ°„ 계산후 μΆ”κ°€ (1λ²ˆνŒ€)
                break;
            case 2: //μ•„λ‹˜ 2λ²ˆνŒ€μ΄ 이기고 μžˆμ—ˆλ‹€λ©΄?
                win_t_vis += time_[i]-time_[i-1];   //이기고 있던 μ‹œκ°„ 계산후 μΆ”κ°€ (2λ²ˆνŒ€)
                break;
        }
    }
}
int main() {
    scanf("%d",&n); //총 득점 횟수λ₯Ό μž…λ ₯λ°›μŒ.
    
    for(int i=0; i<n; i++) //총 득점 횟수만큼 μΌ€μ΄μŠ€ μž…λ ₯ λ°›κΈ°.
    {
        int team,tmp1,tmp2; //λ“μ ν•œ νŒ€λ²ˆν˜Έ, λ“μ ν•œ μ‹œκ°„(λΆ„,초)
        
        scanf("%d %d:%d",&team,&tmp1,&tmp2); //λ“μ ν•œ νŒ€κ³Ό 득점 μ‹œκ°„μ„ μž…λ ₯λ°›μŒ.
        switch(team)    //방금 μž…λ ₯된 μΌ€μ΄μŠ€κ°€ μ–΄λ–€νŒ€μ˜ 득점인지 ꡬ별
        {
            case 1: //1번 νŒ€
                time_[i] = tmp1*60 + tmp2; //뢄을 초둜 λ°”κΎΈμ–΄ μ €μž₯
                compare(i); //이기고 있던 μ‹œκ°„μ„ κ΅¬λ³„ν•˜μ—¬ μΆ”κ°€ν•˜κΈ°
                home_sc++;  //점수 1점 득점
                break;
            case 2: //2번 νŒ€
                time_[i] = tmp1*60 + tmp2;  //뢄을 초둜 λ°”κΎΈμ–΄ μ €μž₯
                compare(i); //이기고 있던 μ‹œκ°„μ„ κ΅¬λ³„ν•˜μ—¬ μΆ”κ°€ν•˜κΈ°
                visitor_sc++;   //점수 1점 득점
                break;
        }
        if(home_sc>visitor_sc) //ν˜„μž¬ 이기고 μžˆλŠ” νŒ€ μ €μž₯
            win_status=1;   //1λ²ˆνŒ€
        else if(home_sc<visitor_sc)
            win_status=2;   //2λ²ˆνŒ€
        else
            win_status=0;   //동점
        if(i==n-1) // μ΄λ²ˆνŒμ—μ„œ λ§ˆμ§€λ§‰ λ“μ μ˜ μΌ€μ΄μŠ€κ°€ μ£Όμ–΄μ§„ 경우 총 κ²½κΈ°μ‹œκ°„μ—μ„œ λ“μ μ‹œκ°„μ„ λΊ΄ λ§ˆμ§€λ§‰μœΌλ‘œ 이기고 있던 μ‹œκ°„μ— μΆ”κ°€ν•΄ μ£ΌκΈ°
        {
            if(home_sc>visitor_sc)  //μ΅œμ’…μ μΈ 점수둜 1λ²ˆνŒ€μ΄ μ΄κΈ°λŠ” 경우
                win_t_home += 48*60-time_[i];
            else if(visitor_sc>home_sc) // μ•„λ‹˜ 2λ²ˆνŒ€μ΄ μ΄κΈ°λŠ” 경우
                win_t_vis += 48*60-time_[i];
        }
    }
    printf("%02d:%02d\n%02d:%02d",win_t_home/60,win_t_home%60,win_t_vis/60,win_t_vis%60);
    //κ²°κ³Ό 좜λ ₯
    return 0;
}

이것이 이번 문제λ₯Ό ν’€λ©΄μ„œ μž‘μ„±ν•œ μ†ŒμŠ€μ˜ 원본이닀.

μ‹€λ²„λ¬Έμ œ 치고 μ†ŒμŠ€κ°€ κΈ΄κ²ƒλΊ΄κ³ λŠ” 크게 νŠΉλ³„ν•¨μ„ λŠλ‚„μˆ˜λŠ” 없을 것이닀.γ…‘_γ…‘;;


#include <stdio.h>
int time_[100],home_sc=0,visitor_sc=0,win_t_home=0,win_t_vis=0,win_status=0,n;
// 득점 μ €μž₯λ³€μˆ˜, 1λ²ˆνŒ€ μŠ€μ½”μ–΄, 2λ²ˆνŒ€ μŠ€μ½”μ–΄, 1λ²ˆνŒ€μ΄ 이기고 있던 μ‹œκ°„(λ‹¨μœ„ : 초), 2λ²ˆνŒ€μ΄ 이기고 있던 μ‹œκ°„(λ‹¨μœ„ : 초), ν˜„μž¬ 이기고 μžˆλŠ” νŒ€ 번호,득점 상황 총 갯수 -> λͺ¨λ‘ μ „μ—­λ³€μˆ˜(Global Variable)둜 선언함.
void compare(int i) //이기고 있던 μ‹œκ°„μ„ κ΅¬λ³„ν•˜μ—¬ μ‹œκ°„μ„ λ”ν•΄μ£ΌλŠ” ν•¨μˆ˜
{
    if(i!=0)    //첫번째 μΌ€μ΄μŠ€λ§Œ μž…λ ₯된 μƒνƒœμ—μ„œλŠ” ν•΄λ‹Ήν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€.
    {
        switch(win_status)
        {
            case 1: //이번 λ“μ μ „κΉŒμ§€ 1λ²ˆνŒ€μ΄ 이기고 μžˆμ—ˆλ‹€λ©΄?
                win_t_home +=  time_[i]-time_[i-1]; //이기고 있던 μ‹œκ°„ 계산후 μΆ”κ°€ (1λ²ˆνŒ€)
                break;
            case 2: //μ•„λ‹˜ 2λ²ˆνŒ€μ΄ 이기고 μžˆμ—ˆλ‹€λ©΄?
                win_t_vis += time_[i]-time_[i-1];   //이기고 있던 μ‹œκ°„ 계산후 μΆ”κ°€ (2λ²ˆνŒ€)
                break;
        }
    }
}
int main() {
    ...
}

이것이 compare ν•¨μˆ˜μ΄λ‹€. μ›λž˜λŠ” λ”°λ‘œ μ΄λ ‡κ²Œ λ³„λ„μ˜ ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ„œ μ†ŒμŠ€λ₯Ό μ§€ κ³„νšμ€ μ—†μ—ˆλ‹€.

int main()
{
	...
			switch(team)    //방금 μž…λ ₯된 μΌ€μ΄μŠ€κ°€ μ–΄λ–€νŒ€μ˜ 득점인지 ꡬ별
        {
            case 1: //1번 νŒ€
                time_[i] = tmp1*60 + tmp2; //뢄을 초둜 λ°”κΎΈμ–΄ μ €μž₯
                compare(i); //이기고 있던 μ‹œκ°„μ„ κ΅¬λ³„ν•˜μ—¬ μΆ”κ°€ν•˜κΈ°
                home_sc++;  //점수 1점 득점
                break;
            case 2: //2번 νŒ€
                time_[i] = tmp1*60 + tmp2;  //뢄을 초둜 λ°”κΎΈμ–΄ μ €μž₯
                compare(i); //이기고 있던 μ‹œκ°„μ„ κ΅¬λ³„ν•˜μ—¬ μΆ”κ°€ν•˜κΈ°
                visitor_sc++;   //점수 1점 득점
                break;
        }
...
}

κ·ΈλŸ¬λ‚˜ compareν•¨μˆ˜κ°€ μ‚¬μš©λœ 곳을 ν™•μΈν•˜λ©΄ λ‚΄κ°€ μ™œ μ΄λ ‡κ²Œ λ§Œλ“€μ—ˆλŠ”μ§€ μ§μž‘ν•  수 μžˆλ‹€. home_sc와 visitor_scλŠ” 1λ²ˆνŒ€κ³Ό 2λ²ˆνŒ€μ˜ 점수λ₯Ό μ €μž₯ν•˜λŠ” λ³€μˆ˜μΈλ° 이 점수λ₯Ό 카운트 ν•˜κΈ°μ „μ— compareν•¨μˆ˜ μ•ˆμ— μžˆλŠ” μž‘μ—…μ΄ μ΄λ£¨μ–΄μ Έμ•Όν•œλ‹€. κ·ΈλŸ¬κΈ°μ—λŠ” ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ λ˜‘κ°™μ€ μ†ŒμŠ€λ₯Ό 두 μΌ€μ΄μŠ€μ˜ κ²½μš°μ— λͺ¨λ‘ μ§‘μ–΄λ„£μ–΄μ•Ό ν•˜κΈ°λ•Œλ¬Έμ— 맀우 λΉ„νš¨μœ¨μ μ΄κ³ , 그외에도 ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ§€ μ•ŠλŠ” 효율적인 방법이 μžˆμ„κ±°λΌκ³  μƒκ°λ˜μ–΄μ§€μ§€λ§Œ λ‚΄κ°€ 문제λ₯Ό ν’€λ©΄μ„œ κ·Έλ‚˜λ§ˆ νš¨μœ¨μ μ΄λ©΄μ„œ μˆ˜κ³ κ°€ λœλ“œλŠ” 방법은 ν•¨μˆ˜λ₯Ό λ³„λ„λ‘œ λ§Œλ“€μ–΄ 반볡적인 μž‘μ—…μ„ λ³„λ„λ‘œ λΉΌλ‚΄μ–΄ λ§Œλ“œλŠ” κ²ƒμ΄μ—ˆλ‹€.

κ·Έμ™Έμ˜ 각 μ†ŒμŠ€μ— λŒ€ν•œ μ„€λͺ…은 μœ„ ν’€ μ†ŒμŠ€μ— ν•˜λ‚˜ν•˜λ‚˜ 주석을 달아 λ†“μ•˜μœΌλ―€λ‘œ 관심이 μžˆμœΌμ‹  뢄듀은 ν•œλ²ˆ μ½μ–΄λ³΄λŠ” 것도 쒋을 것 κ°™λ‹€.

결과 링크 : http://boj.kr/13564ed262734bf98d53f41795a6f043

λŒ“κΈ€