https://www.acmicpc.net/problem/12100
느낀점
1.배운점.
제가 원래 정답 코드를 외우고 받아쓰는 방식을 싫어합니다.
코드를 이해하고, 왜 이 순서인지, 왜 이런 방법으로 구현하는것인지 하나하나 알아가고 이해하는 재미로 공부하기 때문입니다.
(배운점)
이 방식을 통해 이 문제를 풀며 배운건
며칠동안 풀었기에 기억나는 하나만 적어보자면
--
전역변수를 선언하고 재귀함수에서 크기선언을 하면 -> 매 재귀마다 덮어쓰기가 됨.
재귀함수에서 전역변수를 선언,배열크기할당까지 하면 -> 매 재귀마다 이름은 같은 다른 변수가 만들어짐
--
이걸 배우게 되어 좋은 경험이 된듯 합니다.
함수 내 에서만 쓰는 변수를 전역변수로 쓰면,
메모리낭비나, 가시성의 문제정도만 있을까 싶었는데
새로운 문제를 알게되어 신선했습니다.
느낀점
2. 백준에서 맞게 코드를 써도 틀리게 나오는듯 합니다.
2.1 눈으로 하나하나봐도 틀린게없음.
2.2 gpt로 정답코드와, 제 코드를 비교해봐도, 이상한 소리만 나오고, 틀린부분은 이미 다 고침
2.3 해봤자 변수이름이나, 저장하는 순서차이 정도만 있는데,
아무리 봐도 이게 왜 틀렸다는 말이 나오는지 이해가 가지 않는 순서차이입니다.
예를 보여드리자면
block = 0;
map[j][i] = 0;
이 두 코드의 순서차이 정도입니다.
정말 아무리 생각해도 이해가 안가며,
이렇게 생각해도, 계속 생각하다보면 제가 틀린부분이 있을때도 있지만
정말 아무리 봐도 없는데 자꾸 틀리는 경우들이 종종 자주 생겨서 마음이 너무 아픕니다
이런 이유로 성취감을 잘 못느끼는 느낌이네요 ㅠㅠ 아쉽습니다
물론 제가 이후에 경험이 쌓이고, 실력이 쌓여서
이 말을 부끄러워하고 지우러올수도있지만...
아무리 생각해도 지금은 제가 잘못된것 같지 않습니다.
이로 인해,
제가 코드를 쓰며 생각하고 다르게 풀어봤던 그런 흔적들에 저는 자부심을 가지는데,
결국 백준의 정답처리를 받기위해 정답코드로 제출하고,
블로그를 쓰기 망설여집니다.
그럼에도 이번엔 올려보기로 했고,
저의 코드로 제출하면 오답이 나올것입니다.
혹시 누군가 저의 코드에서 문제점을 찾으신다면
댓글로 남겨주시면 감사하겠습니다.
이런 일로 낭비되는 시간이 너무 아깝네요 ㅠㅠ
이유모를 오답의 이유를 찾는데 쓰는 시간을 포기하고, 앞으로는 새 문제에 빠르게 집중할까도 고민중입니다.
다들 개발공부 화이팅 하시길 바라며,
밑에는 저의 코드를 한번 추가해보겠습니다.
물론 공부한 다른분의 코드와 정말 비슷하긴 합니다.. 하하
//@ 은 그 아래부터 공부 이어 하라는 나의 표시
import java.io.BufferedReader;
import java.io.InputStreamReader;
//ioexception 안쓰더라 // 아마 정해진 형식 입력 외의 입력 오류도 방지하기 위해
import java.util.StringTokenizer;
public class Main {
static int n;
static int map[][];
static int result;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
//int 초기화 이 코드 맞았나?
map = new int[n][n];
StringTokenizer stz;
for(int i = 0; i < n; i++) {
stz = new StringTokenizer(br.readLine());
for(int j = 0; j < n; j++)
map[i][j] = Integer.parseInt(stz.nextToken());
}
game(0);
System.out.print(result);
}
public static void game(int count) {
if(count == 5) {
findMax();
return;
}
int copy[][] = new int[n][n];
for(int i = 0; i < n; i++)
copy[i] = map[i].clone();
for(int i = 0; i < 4; i++) {
move(i);
game(count+1);
for ( int a = 0; a < n; a++)
map[a] = copy[a].clone();
}
}
public static void move(int dir) {
switch(dir) {
case 0:
/*index(들어갈 인덱스 숫자)와 block(최근 추가된 블록)을 이용하여
뭔가를 움직임
*/
for ( int i = 0; i < n; i++ ) {
int index = 0;
int block = 0;
for ( int j = 0; j < n; j++) {
if ( map[j][i] != 0) {
if ( map[j][i] == block ) {
map[index-1][i] = block * 2;
map[j][i] = 0;
block = 0;
}
else {
block = map[j][i];
map[index][i] = block;
map[j][i] = 0;
index++;
}
}
}
}
break;
case 1:
for ( int i = 0; i < n; i++) {
int index = n-1;
int block = 0;
for ( int j = n-1; j >= 0; j--) {
if ( map[j][i] != 0 ) {
if ( map[j][i] == block) {
map[index + 1][i] = block * 2;
block = 0;
map[j][i] = 0;
}
else {
block = map[j][i];
map[index][i] = block;
map[j][i] = 0;
index--;
}
}
}
}
break;
case 2:
for ( int i = 0; i < n; i++) {
int index = 0;
int block = 0;
for ( int j = 0; j < n; j++) {
if ( map[i][j] != 0) {
if ( block == map[i][j]) {
//매번하던거 그냥 좌로 가는겨
map[i][index-1] = block * 2;
block = 0;
map[i][j] = 0;
}
else {
block = map[i][j];
map[i][index] = block;
map[i][j] = 0;
index++;
}
}
}
}
break;
case 3:
for ( int i = 0; i < n; i++) {
int index = n-1;
int block = 0;
//우로가는거니깐 큰수에서 작게
for ( int j = n - 1; j >= 0; j--) {
if ( map[i][j] != 0) {
if ( block == map[i][j]) {
map[i][index+1] = block * 2;
block = 0;
map[i][j] = 0;
}
else {
block = map[i][j];
map[i][index] = block;
map[i][j] = 0;
index--;
}
}
}
}
break;
}
}
public static void findMax() {
//2중포문과 math.max로 result에 최댓값 요소하나씩 체크해서 넣기
for ( int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
result = Math.max(result, map[i][j]);
}
}
return;
}
}
작은 포인트
1. 매 이동마다 한번의 합침만 이뤄지기에 위의 if에서 block 은 0이 됩니다.(아니라면 2배가 된 값을 넣을것이라 예상합니다)
참고한 블로그
https://jellyinghead.tistory.com/53
[백준 12100] 2048 (Easy) (자바)
https://www.acmicpc.net/problem/12100 12100번: 2048 (Easy) 첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모
jellyinghead.tistory.com
'알고리즘' 카테고리의 다른 글
| [알고리즘-java] 부분수열 (문제는 없음) (0) | 2025.03.22 |
|---|---|
| [알고리즘-java] 1339 단어 수학 (0) | 2025.03.06 |
| [알고리즘] 시간복잡도에 대하여 (1) | 2025.03.01 |
| [알고리즘-JAVA] 16234 인구 이동 (0) | 2025.02.23 |
| [알고리즘-JAVA] 1520 내리막 길 (0) | 2025.02.10 |