문제풀이

[CODE UP 기초 종합 100제] 1095, 1099 with JAVA

IT록흐 2021. 6. 27. 10:36
반응형

 

 

지난 포스팅에 이어

코드업 100제를 풀면서

난해했던 문제들을 정리해볼까 한다.

 

 

 

문제 1097

 

 

[기초-2차원배열] 바둑알 십자 뒤집기(설명)

C언어기초100제v1.2 : @컴퓨터과학사랑, 전국 정보(컴퓨터)교사 커뮤니티/연구회 - 학교 정보(컴퓨터)선생님들과 함께 수업/방과후학습/동아리활동 등을 통해 재미있게 배워보세요.  - 모든 내용

codeup.kr

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 

 

[기초-2차원배열] 성실한 개미

C언어기초100제v1.2 : @컴퓨터과학사랑, 전국 정보(컴퓨터)교사 커뮤니티/연구회 - 학교 정보(컴퓨터)선생님들과 함께 수업/방과후학습/동아리활동 등을 통해 재미있게 배워보세요.  - 모든 내용

codeup.kr

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으로 조작하면 원하는 값으로 출력시킬 수 있었다. 기초는 기본이니 거의 무의식적으로 풀수 있어야 된다고 생각한다. 수학에 비유하면 기초 산수같은 부분인데 산수를 능수능란하게 사용하지 못하면 수학문제를 풀지 못하는 것과 같은 이치라 생각된다. 기초라고 한번 풀고 넘어가지말고 다양한 문제를 찾아 풀고 기반을 잘 다져야겠다.

 

 

반응형