베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

[java] 23293번: 아주 서바이벌

2022. 8. 20. 18:47

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

 

23293번: 아주 서바이벌

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

www.acmicpc.net

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.StringTokenizer;
import java.util.TreeSet;
import java.util.Vector;

public class java_23293 {

    static class Player {
        // 플레이어의 현재 위치
        int place;
        // 플레이어가 갖고 있는 아이템 목록
        // <아이템 번호, 아이템 갯수>
        HashMap<Integer, Integer> item;

        public Player() {
            item = new HashMap<>();
            place = 1;
        }

        public int getPlace() {
            return place;
        }

        public void setPlace(int place) {
            this.place = place;
        }

    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());

        // 로그의 줄 수
        int T = Integer.parseInt(st.nextToken());
        // 플레이어의 수
        int N = Integer.parseInt(st.nextToken());

        Vector<Player> players = new Vector<>();
        for (int i = 0; i < N; i++) {
            players.add(new Player());
        }

        // 벤할 사람 목록
        TreeSet<Integer> result = new TreeSet();

        //
        TreeSet<Integer> illegalLogCount = new TreeSet();

        // 로그의 줄 수(T) 만큼 반복
        for (int i = 0; i < T; i++) {
            st = new StringTokenizer(br.readLine());
            // 로그 번호
            int number = Integer.parseInt(st.nextToken());
            // 플레이어 번호
            int playerNumber = Integer.parseInt(st.nextToken()) - 1;
            // 행동 코드
            char actCode = st.nextToken().charAt(0);

            // craft의 경우 1개의 인자를 더 받음
            int craftParam = -1;
            if (actCode == 'C') {
                craftParam = Integer.parseInt(st.nextToken());
            }
            // 행동 인자
            int actParam = Integer.parseInt(st.nextToken());

            // 규칙 1 : 플레이어가 현재 위치한 지역에서 얻을 수 없는 소재 아이템을 획득한 경우
            // 행동 코드가 F인가?
            //
            Player nowPlayer = players.get(playerNumber);

            switch (actCode) {
                // 이동 처리
                case 'M':
                    // // 같은 곳으로 이동하면 오류 발생
                    // if (nowPlayer.getPlace() == actParam) {
                    // System.out.println("ERROR!");
                    // }
                    nowPlayer.setPlace(actParam);
                    break;
                case 'F':
                    // 현재 위치와 파밍하는 위치가 다르면 오류발생
                    if (nowPlayer.getPlace() != actParam) {
                        // result.add(playerNumber);
                        illegalLogCount.add(number);
                    }
                    // 이전에 획득한 적이 있으면
                    // 기존 값에서 + 1

                    if (nowPlayer.item.get(actParam) != null) {
                        int itemCount = nowPlayer.item.get(actParam) + 1;
                        nowPlayer.item.put(actParam, itemCount);
                    }
                    // 이전에 획득한 적이 없으면 1개 추가
                    else {
                        nowPlayer.item.put(actParam, 1);
                    }

                    break;
                case 'C':
                    // 1개 이상 있어야 함
                    if (nowPlayer.item.get(actParam) != null) {
                        if (nowPlayer.item.get(actParam) >= 1) {
                            nowPlayer.item.put(actParam, nowPlayer.item.get(actParam) - 1);

                        } else {
                            illegalLogCount.add(number);
                        }

                    } else {
                        illegalLogCount.add(number);
                    }
                    if (nowPlayer.item.get(craftParam) != null) {
                        if (nowPlayer.item.get(craftParam) >= 1) {
                            nowPlayer.item.put(craftParam, nowPlayer.item.get(craftParam) - 1);
                        }
                        // 갯수가 모자르면
                        else {
                            // result.add(playerNumber);
                            illegalLogCount.add(number);
                        }
                        // 아이템이 존재하지 않으면

                    } else {
                        // result.add(playerNumber);
                        illegalLogCount.add(number);
                    }

                    break;
                case 'A':
                    Player targetPlayer = players.get(actParam - 1);
                    // 현재 플레이어 위치와 상대 플레이어의 위치가 다르면 오류 발생
                    if (nowPlayer.getPlace() != targetPlayer.getPlace()) {
                        result.add(playerNumber);
                        illegalLogCount.add(number);
                    }

                    break;
            }

        }

        if (illegalLogCount.isEmpty()) {
            bw.write("0\n");
        } else {
            bw.write(illegalLogCount.size() + "\n");
            for (Integer logNumber : illegalLogCount) {
                bw.write(logNumber + " ");
            }
            bw.write("\n");
        }

        if (result.isEmpty()) {
            bw.write("0\n");
        } else {
            bw.write(result.size() + "\n");
            for (Integer playerNumber : result) {
                bw.write((playerNumber + 1) + " ");
            }
            bw.write("\n");
        }

        br.close();
        bw.close();
    }
}

'Coding Test > BOJ' 카테고리의 다른 글

[BOJ/JAVA] 5021번: 왕위 계승  (0) 2022.08.21
[java] 2015번: 수들의 합 4  (0) 2022.08.20
[java] 11286번: 절댓값 합  (0) 2022.08.20
[java] 2225번: 합분해  (0) 2022.08.20
15817번: 배수 공사  (0) 2022.08.20
    'Coding Test/BOJ' 카테고리의 다른 글
    • [BOJ/JAVA] 5021번: 왕위 계승
    • [java] 2015번: 수들의 합 4
    • [java] 11286번: 절댓값 합
    • [java] 2225번: 합분해
    베오
    베오

    티스토리툴바