지난 포스팅에 이어
코드업 100제를 풀면서
난해했던 문제들을 정리해볼까 한다.
문제 1097
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int[][] arr = new int[19][19];
int n;
int x,y;
//2차원 배열 입력받아 채우기
for(int i=0; i < arr.length;i++) {
for(int j=0; j < arr[i].length; j++) {
arr[i][j] = sc.nextInt();
}
}
n = sc.nextInt(); // 횟수 입력 받기
for(int count =0; count < n; count++) {
x = sc.nextInt() -1; //세로 좌표 입력받기
y = sc.nextInt() -1; //가로 좌표 입력받기
for(int i=0;i<arr[x].length;i++) {
if(arr[x][i] == 1) arr[x][i] = 0;
else arr[x][i] = 1;
}
for(int i=0;i<arr.length;i++) {
if(arr[i][y] == 1) arr[i][y] = 0;
else arr[i][y] = 1;
}
}
// 결과 출력하기
for(int i=0; i < arr.length;i++) {
for(int j=0; j < arr[i].length; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
어려웠다기 보다는 문제를 이해하기 난해했던 문제인것 같다.
십자뒤집기? 뭔 말이여~
문제 1099
https://codeup.kr/problem.php?id=1099
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int[][] arr = new int[10][10];
int x = 1 ,y = 1; //현재 좌표
int bx = 1, by =1; // 이전 좌표
//2차원 배열 입력받기
for(int i=0; i < arr.length;i++) {
for(int j=0; j < arr[i].length; j++) {
arr[i][j] = sc.nextInt();
}
}
// while 반복문 이용하여 개미 이동시키기
while(x != arr[0].length -2 || y != arr.length -2){ // 끝에 도달하면 종료
// 값이 0인 경우 오른쪽으로 이동
if(arr[y][x] ==0) {
arr[y][x] =9;
bx =x; by = y; // 이전 좌표에 좌표 저장
x++; // 좌표 저장 후 이동
}
// 값이 1인 경우 아래로 이동
else if(arr[y][x]==1) {
x = bx; y = by + 1; // 이전 좌표로 이동 후 아래로 한 칸 이동
}
// 값이 2인 경우 정지
else if(arr[y][x]==2) {
arr[y][x]=9;
break;
}
}
arr[y][x]=9;
// 출력하기
for(int i=0; i < arr.length;i++) {
for(int j=0; j < arr[i].length; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
<출력 결과>
코드를 짜면 두 부분에서 시간이 좀 걸렸다.
1. while( x != arr[0].length -2 || y != arr.length -2 )
종료지점(x=8,y=8)에 도달하면 반복문을 중지시켜야 했다. 조건의 결과가 false가나와야 while문을 탈출하니, 논리 그대로 처음에는 x != 8 && y != 8 로 작성했다.
!=는 ==의 결과의 반대를 뜻하니, x가 8이고 y도 8이면 둘 다 false가 나와서 &&로 false가 나와 while를 탈출할 것이라는 짧은 생각을 갖고 있었다. 하지만 생각이 정말 짧았다.
false && false = false
false && true = false
true && false = false
true&& true = true
내가 원하는 건 둘 다 false가 나와, 결과가 false가 되어 반복문을 탈출하는 거였는데, 둘 중 하나라도 false가 나오면 탈출해버려서 내가 원하는 결과가 나오지 않았다. 그래서 && 대신에 ||을 썼다. 이렇게 하면 내가 원하는 결과가 나온다.
false || false = false
false || true = true
true || false = true
true || true = true
2. 이전 좌표 만들기
다른 분들은 어떻게 하셨는지 모르겠지만 나는 현재좌표와 이전 좌표 이렇게 두 좌표 변수를 만들었다. 이렇게 만든 이유는 좌표의 값이 '1'이 나오는 경우 때문이다.
개미가 오른쪽으로 이동하다가 1을 만나면 아래로 내려가야한다. 그래서 현재 좌표의 좌표값이 1이면 다시 좌표를 뒤로 이동했다가 아래로 내려가야했다. 처음에는 x--, y++ 같이 증감연산자를 사용했다. 하지만 증감연산자를 사용하니 반복문이 돌면서 증감이 쌓이다가 결국 좌표가 인덱스 범위를 넘어서는 오류가 발생했다.
고쳐보려고 했지만 다양한 테스트 케이스에서 오류가 계속해서 검출되었다. 결국 증감연산자를 버리고 이전 좌표를 추가했다. 만약 현재 좌표의 좌표값이 1이면 현재 좌표에 이전 좌표를 넣어주어서 현재좌표를 이전 좌표로 이동시켰다. 그 후 아래로 이동하는 방식으로 코드를 짰다.
CodeUp
기초 종합 100제 느낀점
풀면서 엄청나게 어렵게
느껴지는 문제는 별로 없었다.
막혀도 구글링 좀 해주면
풀리는 문제가 거의 다였다.
풀면서 String의 중요성을 많이 느꼈다. 입력된 값을 String으로 조작하면 원하는 값으로 출력시킬 수 있었다. 기초는 기본이니 거의 무의식적으로 풀수 있어야 된다고 생각한다. 수학에 비유하면 기초 산수같은 부분인데 산수를 능수능란하게 사용하지 못하면 수학문제를 풀지 못하는 것과 같은 이치라 생각된다. 기초라고 한번 풀고 넘어가지말고 다양한 문제를 찾아 풀고 기반을 잘 다져야겠다.
'문제풀이' 카테고리의 다른 글
[JAVA] 백준 3052번 나머지 : 중복값 제거 (0) | 2021.07.10 |
---|---|
[JAVA] 백준 1546번 평균 : 교환, 결합, 분배법칙 (0) | 2021.07.10 |
[JAVA] 백준 2884번 알람시계 : 시간 (0) | 2021.07.10 |
[JAVA] 백준 4673번 셀프넘버 : 아리토스테네스의 체 (0) | 2021.07.10 |
[CODE UP 기초 종합 100제] 1023, 1082 with JAVA (0) | 2021.06.25 |