코딩테스트/백준 코딩

백준 / 시뮬레이션 / 아주 서바이벌 (boj23293, c11, python3)

견우직녀달 2023. 6. 22. 04:27

문제


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

 

23293번: 아주 서바이벌

때는 2021년, 대한민국에는 '아주 서바이벌'이라는 온라인 게임이 대 유행 중이다. 이 게임은 바다 한가운데의 섬, 아주 아일랜드에서 벌어지는 배틀로얄 게임으로 플레이어들은 아주 아일랜드의

www.acmicpc.net

 

입출력


입출력

 

해설


해당 문제는 굉장히 심플하다. 

 

하지만 티어가 낮아서인지 문제가 굉장히 주어지는 것이 적다. 그것을 하나하나 설명해보겠다.

 

이 문제에서 주의깊에 봐야하는 것이 뭐냐면

1. 부정행위가 무엇인지.

2. 차단행위가 무엇인지.

3. 부정행위를 했을 때?, 차단행위를 했을 때?

 

일단 위에 1,2,3번을 보기 전에 해당 문제를 초기 세팅을 보자.

1. 플레이어들은 모두 1번 지역에서 시작한다.

2. 모두 아이템은 안 들고 시작한다.

 

이제 주의 깊게 봐야하는 것들을 말해보겠다.

1. 부정행위는 무엇인가

이 문제에서 부정행위란?

1. 플레이어가 현재 위치에서 얻을 수 없는 아이템을 얻음 

2. 플레이어가 가지고 있지 않은 아이템을 이용해서 아이템 만듦

3. 플레이어가 다른 위치에 플레이어 공격

 

이 부분들을 잘 처리해줘야 한다.

1번과 3번 같은 경우는 잘 처리했을 것이다.

 

1번에서는 부정행위여도 얻어야 되는 것 처리.

 

하지만 2번 같은 경우는 다소 지문 자체에서 주어지는 정보가 적다고 생각이 든다.

 

사용해서 아이템을 만든다? <- 이 부분을 보고 사용하는 건 알겠는데 사용한 아이템은 사라지는 것인가? 라는 의문이 든다.

 

정답은 맞다. 사용을 하면 해당 아이템은 사라지는 것이다. 

그래서 이 사라지는 것까지 잘 처리해줘야 된다.

 

여기까지 했다면 차단행위에 대해 보자.

 

차단 행위가 무엇일까?

차단 행위는 다른 위치에 있는 플레이어를 공격하는 행위이다.

이것은 플레이어들끼리 위치를 비교하면 되기에 굉장히 심플하다.

 

 

그럼 마지막으로 부정행위나 차단행위를 했을때?

이것을 넣은 이유는 해당 차단행위나 부정행위를 했음에도 다음 로그들은 다 처리를 해줘야 되는지 의문이 들기 때문이다.

(같은 플레이어가 차단 됐으면 다음 로그는 처리해야 되나? 같은 의문)

 

로그들은 무조건 다 처리해야 된다.

플레이어가 차단이 됐든, 부정행위를 저질렀든 계속 다음 로그들은 다 처리해주면 된다.

 

정답코드


c

더보기
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
/*
 https://www.acmicpc.net/problem/23293
 23293번 아주 서바이벌
 총 53개의 지역 존재
 1번 지역에서 출발한다.
 플레이어:
    1. 이동
    2. 획득
    3. 조합
    4. 공격
 
 부정행위:
    1. 플레이어가 현재 위치한 지역에서 얻을 수 없는 소재 아이템 획득
    2. 플레이어가 가지고 있지 않은 소재 아이템 사용해 조합
    3. 플레이어가 다른 지역에 있는 상대 플레이어 공격
 
 1. 이동 : 다른 위치로 이동
 2. 획득 : 현재 위치한 지역 x 지역의 아이템만 획득가능
    1. 여러 번 획득 가능
 3. 조합 : 서로 다른 종류의 두 소재 아이템을 1개씩 사용해 장비를 만듦
 4. 공격 : 같은 위치에 있는 사람들끼리만 공격 가능
 */
typedef struct player{
    int item[54],x;//아이템 존재 여부, 현재 위치
    bool ban;
}player;
int t,n;
player players[100002];
void __init__(int n){
    for(int i=1;i<=n;i++){
        players[i].x=1;//현재 위치는 1에서 시작
    }
}
int log_t[200003];
int ban_player;
main(){scanf("%d %d",&t,&n),__init__(n);
    int log_t_idx=0;
    while(t--){
        int num,p,c;
        char a;scanf("%d %d %c %d",&num,&p,&a,&c);
        if(a=='M')players[p].x=c;
        else if(a=='F'){
            if(players[p].x!=c){//오류임.
                log_t[log_t_idx++]=num;
            }
            players[p].item[c]++;//부정행위라도 아이템은 얻어야됨.
        }else if(a=='C'){
            int temp;scanf("%d",&temp);//아이템 두개 이기에.
            if(!players[p].item[c] || !players[p].item[temp]){
                log_t[log_t_idx++]=num;
            }
            if(players[p].item[c])players[p].item[c]--;
            if(players[p].item[temp])players[p].item[temp]--;
        }else{//공격
            if(players[p].x != players[c].x){
                log_t[log_t_idx++]=num;
                if(!players[p].ban)ban_player++;
                players[p].ban=1;
            }
        }
    }
    printf("%d\n",log_t_idx );
    for(int i=0;i<log_t_idx;i++){
        printf("%d ",log_t[i]);
    }
    if(log_t_idx)printf("\n");
    printf("%d\n",ban_player);
    for(int i=1;i<=n;i++){
        if(players[i].ban)printf("%d ",i);
    }
}

python

더보기
import sys
input=sys.stdin.readline
logs=[]
ban_player=set()
t,n=map(int,input().split())
players=[{'item':{},'location':1}for _ in[0]*(n+1)]
for _ in[0]*t:
    num,player,code,*codenum=input().split()
    num,player,*codenum=map(int,[num,player]+codenum)
    if code=='M':players[player]["location"]=codenum[0]
    elif code=='F':
        if players[player]['location']!=codenum[0]:
            logs.append(num)
        players[player]['item'][codenum[0]]=players[player]['item'].get(codenum[0],0)+1
    elif code=='C':
        if not players[player]['item'].get(codenum[0],0) or not players[player]['item'].get(codenum[1],0):
            logs.append(num)
        if players[player]['item'].get(codenum[0],0):
            players[player]['item'][codenum[0]]-=1
        if players[player]['item'].get(codenum[1],0):
            players[player]['item'][codenum[1]]-=1
    elif code=="A":
        if players[player]['location']!=players[codenum[0]]['location']:
            logs.append(num)
            ban_player.add(player)
print(len(logs))
if logs:print(*logs)
print(len(ban_player))
if ban_player:print(*sorted(ban_player))