삐까냥의 파도타기

2383. 점심 식사시간 본문

코딩/SW Expert Academy

2383. 점심 식사시간

금손형아 2018. 4. 13. 22:57

2383. 점심 식사시간


https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5-BEE6AK0DFAVl&categoryId=AV5-BEE6AK0DFAVl&categoryType=CODE



하루종일 문제만 풀다보니,


너무나 풀기 싫었던 문제입니다.


근데 생각보다 어려웠다고 해야하나...?


근데 정답률은 47퍼.




정말 정말 풀기 싫어서


코드도 원래 스타일대로 안짰어요.


제가 봐도 개판 코드 입니다.



이 문제 만큼은 다른 사이트에서 보세요;;


2018년 4월 13일 - 다듬지 않은 코드


import java.util.LinkedList;

import java.util.Queue;

import java.util.Scanner;


public class Q2383 {


static int mapSize, result;

static LinkedList<person> peoples;

static int[][] exit = new int[2][3];

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int testCase = sc.nextInt();

for (int i = 1; i <= testCase; i++) {

peoples = new LinkedList<person>();

mapSize = sc.nextInt();

boolean isFirst = true;

for (int j = 0; j < mapSize; j++) {

for (int k = 0; k < mapSize; k++) {

int value = sc.nextInt();

if (value == 1) {

peoples.add(new person(j, k));

} else if (value > 1) {

if (isFirst) {

exit[0][0] = j;

exit[0][1] = k;

exit[0][2] = value;

isFirst = false;

} else {

exit[1][0] = j;

exit[1][1] = k;

exit[1][2] = value;

}

}

}

}

result = -1;

divPeople(0);

System.out.println("#" + i + " " + result);

}

}

static LinkedList<person> first = new LinkedList<person>();

static LinkedList<person> second = new LinkedList<person>();

static void divPeople(int num) {

if (num < peoples.size()) {

person temp = peoples.get(num);

first.add(temp);

divPeople(num+1);

first.remove(temp);

second.add(temp);

divPeople(num+1);

second.remove(temp);

} else {

LinkedList<person> tempFirst = (LinkedList<person>) first.clone();

LinkedList<person> tempSecond = (LinkedList<person>) second.clone();

// System.out.println("서치 " + tempFirst.size() + " / " + tempSecond.size());

for (int i = 0; i < tempFirst.size(); i++) {

tempFirst.get(i).setArrivalTime(exit[0][0], exit[0][1]);

}

for (int i = 0; i < tempSecond.size(); i++) {

tempSecond.get(i).setArrivalTime(exit[1][0], exit[1][1]);

}

int time = 0;

int firstStartPeople = 0;

int secondStartPeople = 0;

while(!tempFirst.isEmpty() || !tempSecond.isEmpty()) {

time += 1;

// System.out.println(time + " " + first.size() + " " + second.size());

for (int i = 0; i < tempFirst.size(); i++) {

person temp = tempFirst.get(i);

//끝났음

if (temp.finishTime == time) {

tempFirst.remove(temp);

firstStartPeople -= 1;

i -= 1;

}

}

for (int i = 0; i < tempFirst.size(); i++) {

if (firstStartPeople == 3) {

break;

}

person temp = tempFirst.get(i);

//내려가기 시작

if (firstStartPeople < 3 && -1 == temp.finishTime && temp.tempStartTime <= time) {

temp.finishTime = time+exit[0][2];

firstStartPeople += 1;

}

}

for (int i = 0; i < tempSecond.size(); i++) {

person temp = tempSecond.get(i);

if (temp.finishTime == time) {

tempSecond.remove(temp);

secondStartPeople -= 1;

i -= 1;

}

}

for (int i = 0; i < tempSecond.size(); i++) {

if (secondStartPeople == 3) {

break;

}

person temp = tempSecond.get(i);

//내려가기 시작

if (secondStartPeople < 3 && -1 == temp.finishTime && temp.tempStartTime <= time) {

temp.finishTime = time+exit[1][2];

secondStartPeople += 1;

}

}

}

if (result == -1 || result > time) {

result = time;

}

}

}

}


class person {

int y, x;

int tempStartTime = -1;

int finishTime = -1;

public person(int y, int x) {

this.y = y;

this.x = x;

}

public int getY() {

return y;

}

public int getX() {

return x;

}

public void setArrivalTime(int exitY, int exitX) {

int temp1 = y - exitY;

if (temp1 < 0) {

temp1 *= -1;

}

int temp2 = x - exitX;

if (temp2 < 0) {

temp2 *= -1;

}

tempStartTime = temp1 + temp2+1;

finishTime = -1;

}

}


'코딩 > SW Expert Academy' 카테고리의 다른 글

1953. 탈주범 검거  (0) 2018.04.15
2115. 벌꿀채취  (0) 2018.04.14
2382. 미생물 격리  (0) 2018.04.13
1949. 등산로 조성  (0) 2018.04.13
1767. 프로세서 연결하기  (0) 2018.04.12