나 자신을 다스리는 자가 세상을 다스린다.

선수의 수와 그 선수가 싫어하는 선수의 정보를 입력받아
두 개의 팀으로 구성하여라.

예)
1번째 선수의 정보를 입력하세요(싫어하는 선수의 번호, ...)
3
2번째 선수의 정보를 입력하세요(싫어하는 선수의 번호, ...)
1
3번째 선수의 정보를 입력하세요(싫어하는 선수의 번호, ...)
----------------
A Team : 1
B Team : 2 3

싫어하는 선수가 여러명일 경우 1,2 ... 와 같이 , 로 구분하여 입력받는다.


=================================================================================

나는 아래와 같이 작성하였다.

알고리즘을 생각하는데 많은 시간이 걸렸다..

처음에는 단순하게 for 문 돌리면서 넣었다 뺐다 하면 되겠지 생각했는데...

생각보다 쉽지가 않았다.

코드 작성 초기에는 TDD 도 익힐 겸 JUnit 제대로 적용하고 Exception 처리도 말끔히 해볼까 했는데...

회사에서 눈치보면서 한 것이라 막 코딩이 되어버렸다. ㅠ.ㅠ

그래도 재미있는 문제였다.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Test{

    private final int POSSIBLE = 1; // 위치한 자리

    private final int IMPOSSIBLE = -1; // 불가 자리

    private final int HOLD = 0; // 빈 자리

    int[] aTeam; // A Team

    int[] bTeam; // B Team

    int[] otherTeam; // Other

    String[][] playerInfo = null; // 싫어하는 선수 정보

    private void doProcess(InputStream is) {
        while (true) {
            System.out.println("선수의 수를 입력하십시요 : ");
            int totalNum = readTotal(is);

            if (totalNum > 0) {

                playerInfo = new String[totalNum][];
                aTeam = new int[totalNum];
                bTeam = new int[totalNum];
                otherTeam = new int[totalNum];
                // 선수 정보 입력
                for (int i = 1; i < totalNum + 1; i++) {
                    System.out.println(i + "번째 선수의 정보를 입력하세요(싫어하는 선수의 번호, ...)\n싫어하는 선수가 없을 시에는 Enter");
                    playerInfo[i - 1] = readPlayerInfo(is);
                }

                makeTeam();
                System.out.println("결과는 다음과 같습니다.");
                System.out.println("A Team : " + printTeam(aTeam));
                System.out.println("B Team : " + printTeam(bTeam));
                System.out.println("Not Team : " + printTeam(otherTeam));
                System.exit(0); // 종료
            } else {
                System.out.println("잘못된 입력입니다.\n 다시 입력하여 주십시요.");
            }
        }
    }

    /**
     * 전체 선수의 수 읽어오기
     * @param is
     * @return
     */
    private int readTotal(InputStream is) {
        String total = null;
        int totalNum = 0;
        try {
            total = readLine(is);
            if ("exit".equalsIgnoreCase(total)) {
                System.out.println("프로그램을 종료합니다.");
                System.exit(0);
            }
            totalNum = Integer.parseInt(total); // 전체 player
        } catch (NumberFormatException nfe) {
            // nothing doto
        }
        return totalNum;
    }

    /**
     * player 정보 입력
     * @param is
     * @return
     */
    private String[] readPlayerInfo(InputStream is) {
        String info = readLine(is);
        return ("".equals(info.trim())) ? null : info.trim().split(",");
    }

    /**
     * make Team
     *
     */
    private void makeTeam() {
        for (int i = 0; i < playerInfo.length; i++) {
            boolean conBoolean = true;

            // aTeam check
            conBoolean = checkTeam(playerInfo[i], aTeam, i);

            if (conBoolean) // aTeam 자격 안되면 bTeam 체크
                conBoolean = checkTeam(playerInfo[i], bTeam, i);

            if (conBoolean) // aTeam, bTeam 둘다 자격 안되면 otherTeam
                otherTeam[i] = POSSIBLE;
        }
    }

    /**
     * Team check
     *
     * @param pInfos
     * @param team
     * @param i
     * @return
     */
    private boolean checkTeam(String[] pInfos, int[] team, int i) {
        boolean retVal = true;
        if (team[i] == HOLD) { // 해당 자리 있을 경우에만
            if (pInfos == null) { // 싫어하는 선수 없으면 현재 team 소속
                team[i] = POSSIBLE;
                retVal = false; // 다음 team 작업 중지
            } else { // 싫어하는 선수 리스트 있으면...
                if (checkHate(team, pInfos)) { // 싫어하는 선수 중에 이미 자리잡은 경우가 있는지 체크, 없을 경우 아래 작업 진행
                    for (int j = 0; j < pInfos.length; j++) {
                        int hateNum = Integer.parseInt(pInfos[j]) - 1;
                        team[hateNum] = IMPOSSIBLE; // 싫어하는 선수의 자리 불가로 표시..
                        team[i] = POSSIBLE; // 현재 team 소속
                        retVal = false; // 다음 team 작업 중지
                    }
                }

            }
        }
        return retVal;
    }

    /**
     * team 에 싫어하는 선수가 자리 잡고 있는지 체크
     *
     * @param team
     * @param infos
     * @return 해당 팀에 들어갈 수 있는지 여부 return
     */
    private boolean checkHate(int[] team, String[] infos) {
        for (int i = 0; i < infos.length; i++) {
            if (team[i] == POSSIBLE) { // 현재 team 에 싫어하는 사람 있는 경우
                return false; // 해당 팀에 들어갈 수 없음
            }
        }
        return true;
    }

    /**
     * InputStream 으로 부터 read Line
     * @param is
     * @return
     */
    private String readLine(InputStream is) {
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);

        String retVal = null;
        try {
            retVal = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("프로그램에 오류가 발생하였습니다.");
            System.exit(1);
        }
        return retVal;
    }

    /**
     * team print
     *
     * @param team
     * @return
     */
    private String printTeam(int[] team) {
        StringBuffer retVal = new StringBuffer();
        for (int i = 0; i < team.length; i++) {
            if (team[i] == POSSIBLE)
                retVal.append(i + 1).append(" ");
        }
        return retVal.toString();
    }

    public static void main(String[] args) {
        System.out.println("프로그램을 시작합니다.");
        Test t = new Test();
        t.doProcess(System.in);
    }
}
TAG
Posted by trypsr Trackback 0 Comment 0


티스토리 툴바