문제
https://swexpertacademy.com/main/solvingProblem/solvingProblem.do
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
접근
삼성은 이런 빡구현 문제들을 왜이렇게 좋아하는 걸까...! 삼성 코테 1주일간 준비했던 경험이 있어서 빡구현 문제의 패턴은 갈피가 잡히는 데 막상 시험장에 가면 잔실수도 많고 테스트케이스가 너무 많아서 내가 내 코드에서 허우적 거린적이 많은 것 같다.
삼성 코테의 좋은 점 = 쉽다(?) 알고리즘이 아닌 정말 쌩구현, 나쁜점 = 근데 어렵다
빡구현에서는 항상 이렇게 사용자 클래스를 정의하는 경우가 많다.
Comparable<클래스명>을 상속해야 list에서 sort를 할 수 있으니 꼭 활용하기! (+ compareTo 오버라이드 해줘야함)
static class Micro implements Comparable<Micro> {
int x;
int y;
int n;
int d;
public Micro(int x, int y, int n, int d) {
super();
this.x = x;
this.y = y;
this.n = n;
this.d = d;
}
@Override
public int compareTo(Micro o) {
if(this.x == o.x) {
if(this.y == o.y) {
return this.n - o.n;
}
return this.y - o.y;
}
return this.x - o.x;
}
@Override
public String toString() {
return "Micro [x=" + x + ", y=" + y + ", n=" + n + ", d=" + d + "]";
}
}
최종 코드
package ssafy;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.StringTokenizer;
class Ex1
{
static int[][] dir = {{-1,0}, {1,0},{0, -1},{0, 1}};
static class Micro implements Comparable<Micro> {
int x;
int y;
int n;
int d;
public Micro(int x, int y, int n, int d) {
super();
this.x = x;
this.y = y;
this.n = n;
this.d = d;
}
@Override
public int compareTo(Micro o) {
if(this.x == o.x) {
if(this.y == o.y) {
return this.n - o.n;
}
return this.y - o.y;
}
return this.x - o.x;
}
@Override
public String toString() {
return "Micro [x=" + x + ", y=" + y + ", n=" + n + ", d=" + d + "]";
}
}
public static void main(String args[]) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
//Testcase만큼 반복
for(int test_case=1; test_case <= T; test_case++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
List<Micro> list = new ArrayList<>();
for(int m=0; m < K; m++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int n = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
list.add(new Micro(x,y,n,d));
}
//M시간동안 반복
for(int i=0; i<M; i++) {
//이동 시키기
for(int j=0; j<list.size(); j++) {
Micro m = list.get(j);
m.x += dir[m.d -1][0];
m.y += dir[m.d -1][1];
//범위 벗어나면 -> 절반 죽고, 방향 바뀜
if(m.x <= 0 || m.y <= 0 || m.x >= N-1 || m.y >= N-1) {
//모두 죽었으면
if(m.n /2 == 0) {
list.remove(j);
j--;
}
else {
m.n /= 2;
switch(m.d) {
case 1:
m.d=2;
break;
case 2:
m.d=1;
break;
case 3:
m.d=4;
break;
case 4:
m.d=3;
break;
}
}
}
}
//같이 있는 미생물 합치기
Collections.sort(list);
// for(int a=0; a<list.size(); a++) {
// System.out.print(list.get(a).toString());
//
// }
// System.out.println();
//같은 곳에 있는 지 확인
for(int a=0; a<list.size()-1; a++) {
Micro m1 = list.get(a);
Micro m2 = list.get(a+1);
if(m1.x == m2.x & m1.y == m2.y) {
m2.n += m1.n;
m1.n=0;
}
}
// for(int a=0; a<list.size(); a++) {
// System.out.print(list.get(a).toString());
//
// }
// System.out.println();
}
//남아 있는 총 미생물 세기
int sum = 0;
for(Micro m : list) {
sum += m.n;
}
System.out.printf("#%d %d\n", test_case, sum);
}
}
}
'‡ CODING TEST STUDY ‡' 카테고리의 다른 글
(미완) 삼성 코테 기출 (마법의 숲 탐색, 루돌프의 반란, 미로) (0) | 2024.11.17 |
---|---|
[JAVA] SWEA | 1213. [S/W 문제해결 기본] 3일차 - String (0) | 2024.11.16 |
[JAVA] SWEA | 1204. [S/W 문제해결 기본] 1일차 - 최빈수 구하기 (0) | 2024.11.16 |
[Java] 소수 판별 - 에라토스테네스의 채 (0) | 2024.05.18 |