본문 바로가기

JAVA

< (JAVA) 코드업 1091 ~ 1099 >

 

 

 

 

 

 

 

 

 

1091 : [기초-종합] 수 나열하기3

 

< 문제 설명 >

-  어떤 규칙에 따라 수를 순서대로 나열한 것을 수열이라고 한다.

- 예를 들어
1 -1 3 -5 11 -21 43 ... 은 1부터 시작해 이전에 만든 수에 -2를 곱한 다음 1을 더해 다음 수를 만든 수열이다.

 - 이런 이상한 수열을 알게 된 영일이는 또 궁금해졌다. "그럼.... 13번째 나오는 수는 뭘까?" 영일이는 물론 수학을 아주 잘하지만 이런 문제는 본 적이 거의 없었다... 그래서 프로그램을 만들어 더 큰 수도 자동으로 계산하고 싶어졌다.

-  시작 값(a), 곱할 값(m), 더할 값(d), 몇 번째인지를 나타내는 정수(n)가 입력될 때, n번째 수를 출력하는 프로그램을 만들어보자.

 

 

- 입력 : 시작 값(a), 곱할 값(m), 더할 값(d), 몇 번째 인지를 나타내는 정수(n)가 공백을 두고 입력된다.(a, m, d는 -50 ~ +50, n은 10이하의 자연수)

ex ) 1 -2 1 8

- 출력 : n번째 수를 출력한다.

ex ) -85

 

package _CodeUp_;

import java.util.Scanner;

public class code2 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int a = sc.nextInt(); //시작 값
        int m = sc.nextInt(); //곱할 값
        int d = sc.nextInt(); //더할 값
        int n = sc.nextInt(); //몇 번째 인지를 나타내는 정수
        
        long result = a;

        for (int i = 1; i < n; i++) {
            result = (result*m)+d;
        }
        System.out.println(result);
    }
}

 

완성된 코드

 

 

 

 

 

 

 

1092 : [기초-종합] 함께 문제 푸는 날

 

< 문제 설명 >

- 온라인 채점시스템에는 초등학생, 중고등학생, 대학생, 대학원생, 일반인, 군인, 프로그래머, 탑코더 등 아주 많은 사람들이 들어와 문제를 풀고 있는데, 실시간 채점 정보는 메뉴의 채점기록(Judge Status)을 통해 살펴볼 수 있다.

- 자! 여기서...잠깐.. 같은 날 동시에 가입한 3명의 사람들이 온라인 채점시스템에 들어와 문제를 푸는 날짜가 매우 규칙적이라고 할 때, 다시 모두 함께 문제를 풀게 되는 그날은 언제일까?

- 예를 들어 3명이 같은 날 가입/등업하고, 각각 3일마다, 7일마다, 9일마다 한 번씩 들어온다면, 처음 가입하고 63일 만에 다시 3명이 함께 문제를 풀게 된다.

- 갑자기 힌트? 왠지 어려워 보이지 않는가? 수학에서 배운 최소공배수를 생각한 사람들도 있을 것이다. 하지만, 정보에서 배우고 경험하는
정보과학의 세상은 때때로 컴퓨터의 힘을 빌려 간단한 방법으로 해결할 수 있게 한다.

- 아래의 코드를 읽고 이해한 후 도전해 보자.

- day는 날 수, a/b/c는 방문 주기이다.
...
day=1;
while(day%a!=0 || day%b!=0 || day%c!=0) day++; //이게 무슨 의미일까?
printf("%d", day);
...

- 물론, 아주 많은 다양한 방법이 있을 수 있다.

- 정보과학의 문제해결에 있어서 정답은? 하나가 아니라 주어진 시간/기억공간으로 정확한 결과를 얻을 수 있는 모든 방법이다. 따라서, 모든 문제들에는 정답이 하나뿐만이 아니다.

- 새로운, 더 빠른, 더 간단한 방법을 다양하게 생각해보고 도전해 볼 수 있다.

 

 

- 입력 : 같은 날 동시에 가입한 인원 3명이 규칙적으로 방문하는, 방문 주기가 공백을 두고 입력된다. (단, 입력값은 100이하의 자연수이다.)

ex ) 3 7 9

- 출력 : 3명이 다시 모두 함께 방문해 문제를 풀어보는 날(동시 가입/등업 후 며칠 후?)을 출력한다.

ex ) 63

package _CodeUp_;

import java.util.Scanner;

public class code2 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();

        int day = 1;
        
        while (day%a!=0 || day%b!=0 || day%c!=0)
            day++;
        System.out.println(day);
    }
}

 

완성된 코드

 

 

 

 

 

 

1093 : [기초-1차원배열] 이상한 출석 번호 부르기1

 

< 문제 설명 >

- 정보 선생님은 수업을 시작하기 전에 이상한 출석을 부른다. 선생님은 출석부를 보고 번호를 부르는데,
학생들의 얼굴과 이름을 빨리 익히기 위해 번호를 무작위(랜덤)으로 부른다.

- 그리고 얼굴과 이름이 잘 기억되지 않는 학생들은 번호를 여러 번 불러 이름과 얼굴을 빨리 익히려고 하는 것이다.

- 출석 번호를 n번 무작위로 불렀을 때, 각 번호(1 ~ 23)가 불린 횟수를 각각 출력해보자.

 

< 참고 >
- 각 번호가 불린 횟수를 기록하고 출력하기 위해 변수 23개를 선언할 수도 있다. 하지만 C언어에서는 같은 이름에 번호를 붙여 사용하는 배열(array)을 사용할 수 있다. 이는 마치 아파트의 동 호수(예를 들어 a동 101호)와 같이 번호를 붙여 집을 구분하는 것과 비슷하다.

- 예를 들어 a동 101호를 다르게 표현하면 a[101] 과 같은 표현이 가능한 것이다. 이렇게 번호를 붙여 데이터를 저장할 수 있는 변수인 배열을 사용하기 위해서는 변수처럼, 사용하기 전에 선언해주어야 하는데 아래와 같은 방법으로 가능하다.

< 예시 >
- int a[100]; //a[0] ~ a[99] 까지 정수를 저장할 수 있는 배열을 만들어라.
for(i=0; i<100; i++)
{
  scanf("%d", &a[i]); // 각각의 방에 순서대로 반복하면서 값을 입력해라.
}

- 배열을 사용하기 전에 배열에 들어있는 값을 초기화시키는 것이 좋은데, 다음과 같은 여러 가지 방법이 있다.

int a[24]={}; //0번부터 23번까지 모두 0으로 초기화된다.
int a[24]={1,2,3}; //1,2,3 이 순서대로 들어가고 나머지는 모두 0으로 초기화된다.
int a[3]={1,2,3}; //1,2,3 이 순서대로 저장된다.
int a[3]={1,2,3,4}; //방을 3개 만들고 값을 4개를 집어넣어라? 오류 발생!


문제 해결을 위한 참고 코드

int n, i, t;
int a[24]={};
scanf("%d", &n); //개수 입력받기
for(i=1; i<=n; i++) //개수만큼 입력받기
{
  scanf("%d", &t); //읽어서
  a[t]=a[t]+1; //들어있던 값에 1만큼 더해 다시 저장. a[t]+=1 과 같다.
}
for(i=1; i<=23; i++)
{
  printf("%d ", a[i]); //1~23 번 배열에 저장되어있는 값 출력하기
}

 

 

- 입력 : 첫 번째 줄에 출석 번호를 부른 횟수인 정수 n이 입력된다. (1 ~ 10000) 두 번째 줄에는 무작위로 부른 n개의 번호(1 ~ 23)가 공백을 두고 순서대로 입력된다.

ex ) 10

        1 3 2 2 5 6 7 4 5 9

- 출력 : 1번부터 번호가 불린 횟수를 순서대로 공백으로 구분하여 한 줄로 출력한다.

ex ) 1 2 1 1 2 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 

package _CodeUp_;

import java.util.Scanner;

public class code2 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int a = sc.nextInt();
        int [] arr = new int[23];

        for (int i = 0; i < a; i++) {
            int num = sc.nextInt();
            arr[num - 1] +=1;
        }
        for (int i = 0; i < 23; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

 

완성된 코드

 

 

 

 

 

 

1094 : [기초-1차원배열] 이상한 출석 번호 부르기2

 

< 문제 설명 >

- 정보 선생님은 수업을 시작하기 전에 이상한 출석을 부른다.

- 학생들의 얼굴과 이름을 빨리 익히기 위해 번호를 무작위(랜덤)으로 부르는데, 영일이는 선생님이 부른 번호들을 기억하고 있다가 거꾸로 불러보는 것을 해보고 싶어졌다.

- 출석 번호를 n번 무작위로 불렀을 때, 부른 번호를 거꾸로 출력해 보자.

 

< 참고 >
- 배열에 순서대로 기록해 두고, 기록된 내용을 거꾸로 출력하면 된다.


< 예시 >
- int n, i;
int a[1000]={};
scanf("%d", &n); //개수 입력 받기
for(i=1; i<=n; i++) //개수 만큼 입력 받기
  scanf("%d", &a[i]); //읽어서 순서대로 배열에 넣는다.

for(i=n; i>=1; i--)
  printf("%d ", a[i]); //i 번 배열에 저장되어 있는 값 출력하기

 

 

- 입력 : 번호를 부른 횟수(n, 1 ~ 10000)가 첫 줄에 입력된다. n개의 랜덤 번호(k, 1 ~ 23)가 두 번째 줄에 공백을 사이에 두고 순서대로 입력된다.

ex ) 10

        10 4 2 3 6 6 7 9 8 5

- 출력 : 출석을 부른 번호 순서를 바꾸어 공백을 두고 출력한다.

ex ) 5 8 9 7 6 6 3 2 4 10

package _CodeUp_;

import java.util.Scanner;

public class code2 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int a = sc.nextInt();
        int [] arr = new int[a];

        for (int i = 0; i < a; i++) {
            arr[i] = sc.nextInt();
        }

        for (int i = a-1; i >= 0; i--) {
            System.out.print(arr[i] + " ");
        }
    }
}

 

완성된 코드

 

 

 

 

 

 

1095 : [기초-1차원배열] 이상한 출석 번호 부르기3

 

< 문제 설명 >

-  정보 선생님은 오늘도 이상한 출석을 부른다.

- 영일이는 오늘도 다른 생각을 해보았다. 출석 번호를 다 부르지는 않은 것 같은데... 가장 빠른 번호가 뭐였지?

- 출석 번호를 n번 무작위로 불렀을 때, 가장 빠른 번호를 출력해 보자.

 

< 참고 >
-  배열에 순서대로 기록해 두면, 기록된 내용을 모두 검사해 가장 작은 값을 찾아내면 된다.

- 그런데, 가장 작은 값은 어떻게 어떤 것과 비교하고 찾아야 할까?

 

 

- 입력 :  번호를 부른 횟수(n, 1 ~ 10000)가 첫 줄에 입력된다. n개의 랜덤 번호(k, 1 ~ 23)가 두 번째 줄에 공백을 사이에 두고 순서대로 입력된다.
ex ) 10

       10 4 2 3 6 6 7 9 8 5

- 출력 : 출석을 부른 번호 중에 가장 빠른 번호를 1개만 출력한다.

ex ) 2

package _CodeUp_;

import java.util.Scanner;

public class code2 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int a = sc.nextInt();
        int[] arr = new int[a];
        int min = 24;

        for (int i = 0; i < a; i++) {
            arr[i] = sc.nextInt();
            if (min > arr[i]) {
                min = arr[i];
            }
        }
        System.out.println(min);
    }
}

 

완성된 코드

 

 

 

 

 

 

1096 : [기초-2차원배열] 바둑판에 흰 돌 놓기

 

< 문제 설명 >

- 기숙사 생활을 하는 학교에서 어떤 금요일(전원 귀가일)에는 모두 집으로 귀가를 한다. 오랜만에 집에 간 영일이는 아버지와 함께 두던 매우 큰 오목에 대해서 생각해 보다가 "바둑판에 돌을 올린 것을 프로그래밍 할 수 있을까?"하고 생각하였다.

- 바둑판(19 * 19)에 n개의 흰 돌을 놓는다고 할 때, n개의 흰 돌이 놓인 위치를 출력하는 프로그램을 작성해보자.

 

< 참고 >
- 가로번호, 세로번호를 사용할 수 있는 2차원 배열을 사용하면 이러한 형태를 쉽게 기록하고 사용할 수 있다. 물론 더 확장한 n차원 배열도 만들 수 있다.

 

< 예시 >

- int n, i, j, x, y;
int a[20][20]={};
scanf("%d", &n);
for(i=1; i<=n; i++)
{
  scanf("%d %d", &x, &y);
  a[x][y]=1;
}
for(i=1; i<=19; i++) //한 줄(위에서 아래로) 씩
{
  for(j=1; j<=19; j++) //한 열(왼쪽에서 오른쪽으로) 씩
  {
    printf("%d ", a[i][j]); //값 출력
  }
  printf("\n"); //줄 바꾸기
}

 

- 입력 :  바둑판에 올려 놓을 흰 돌의 개수(n)가 첫 줄에 입력된다. 둘째 줄 부터 n+1 번째 줄까지 힌 돌을 놓을 좌표(x, y)가 n줄 입력된다.
n은 10이하의 자연수이고 x, y 좌표는 1 ~ 19 까지이며, 같은 좌표는 입력되지 않는다.

ex ) 5

       11

       22

       33

       44

       55

- 출력 : 흰 돌이 올려진 바둑판의 상황을 출력한다. 흰 돌이 있는 위치는 1, 없는 곳은 0으로 출력한다.

ex ) 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 

package _CodeUp_;

import java.util.Scanner;

public class code2 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int a = sc.nextInt();
        int[][] arr = new int[19][19];

        for (int i = 0; i < a; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();
            arr[x-1][y-1] = 1;
        }

        for (int i = 0; i < 19; i++) {
            for (int j = 0; j < 19; j++) {
                System.out.print(arr[i][j] + " " );
            }
            System.out.println();
        }
    }
}

 

완성된 코드

 

 

 

 

 

 

1097 : [기초-2차원배열] 바둑알 십자 뒤집기

 

< 문제 설명 >

- 부모님을 기다리던 영일이는 검정/흰 색 바둑알을 바둑판에 꽉 채워 깔아 놓고 놀다가 "십(+)자 뒤집기를 해볼까?"하고 생각했다.

- 바둑판(19 * 19)에 흰 돌(1) 또는 검정 돌(0)이 모두 꽉 채워져 놓여있을 때, n개의 좌표를 입력받아 십(+)자 뒤집기한 결과를 출력하는 프로그램을 작성해보자.

 

< 참고 >
- 가로 번호, 세로 번호를 사용할 수 있는 2차원 배열을 사용하면 이러한 형태를 쉽게 기록하고 사용할 수 있다. 물론 더 확장한 n차원 배열도 만들 수 있다.  

 

< 예시 >

- int n, i, j, x, y;
int a[20][20]={};
for(i=1; i<=19; i++) //한 줄씩 바둑판 상황 입력 받기
  for(j=1; j<=19; j++)
    scanf("%d", &a[i][j]);

scanf("%d", &n); //좌표 개수 입력받기

for(i=1; i<=n; i++) //좌표의 개수만큼
{
  scanf("%d %d", &x, &y);
  for(j=1; j<=19; j++) //가로 줄 흑<->백 바꾸기
  {
    if(a[x][j]==0) a[x][j]=1;
    else a[x][j] = 0;
  }
  for(j=1; j<=19; j++) //세로 줄 흑<->백 바꾸기
  {
    if(a[j][y]==0) a[j][y]=1;
    else a[j][y] = 0;
  }
}
...

 

- 입력 :  바둑알이 깔려 있는 상황이 19 * 19 크기의 정수값으로 입력된다. 십자 뒤집기 횟수(n)가 입력된다. 십자 뒤집기 좌표가 횟수(n) 만큼 입력된다. 단, n은 10이하의 자연수이다.
ex ) 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        2

       10 10

       12 12

- 출력 : 십자 뒤집기 결과를 출력한다.

ex )  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 

package _CodeUp_;

import java.util.Scanner;

public class code1 {
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);

      int[][] arr = new int [19][19]; //차원 배열 생성

       //입력값 배열에 넣기
       for (int i = 0; i < 19; i++) {
           for (int j = 0; j < 19; j++) {
               arr[i][j] = sc.nextInt();
           }
       }
       int a = sc.nextInt(); //십자 뒤집기의 횟수

       //1이면 0으로 0이면 1로
       for (int i = 0; i < a; i++) {
           int x = sc.nextInt()-1; //10 12
           int y = sc.nextInt()-1; //10 12

           //[10, i]가 0이면 1로, 1이면 0으로
           for (int j = 0; j < 19; j++) {
               if (arr[x][j] == 0)
                   arr[x][j] = 1;
               else
                   arr[x][j] = 0;
           }

           //[j, 12]가 0이면 1로, 1이면 0으로
           for (int j = 0; j < 19; j++) {
               if (arr[j][y] == 0)
                   arr[j][y] = 1;
               else
                   arr[j][y] = 0;
           }
       }
       sc.close();

       //답 출력
       for (int i = 0; i < 19; i++) {
           for (int j = 0; j < 19; j++) {
               System.out.printf("%d ", arr[i][j]);
           }
           System.out.println();
       }
   }
}

 

완성된 코드

 

 

 

 

 

 

1098 : [기초-2차원배열] 설탕과자 뽑기

 

< 문제 설명 >

-  부모님과 함께 유원지에 놀러간 영일이는 설탕과자(설탕을 녹여 물고기 등의 모양을 만든 것) 뽑기를 보게 되었다. 길이가 다른 몇 개의 막대를 바둑판과 같은 격자판에 놓는데, 막대에 있는 설탕과자 이름 아래에 있는 번호를 뽑으면 설탕과자를 가져가는 게임이었다.
(잉어, 붕어, 용 등 여러 가지가 적혀있다.)

- 격자판의 세로(h), 가로(w), 막대의 개수(n), 각 막대의 길이(l), 막대를 놓는 방향(d:가로는 0, 세로는 1)과 막대를 놓는 막대의 가장 왼쪽 또는 위쪽의 위치(x, y)가 주어질 때, 격자판을 채운 막대의 모양을 출력하는 프로그램을 만들어보자.

 

 

- 입력 :  첫 줄에 격자판의 세로(h), 가로(w) 가 공백을 두고 입력되고, 두 번째 줄에 놓을 수 있는 막대의 개수(n) 세 번째 줄부터 각 막대의 길이(l), 방향(d), 좌표(x, y)가 입력된다.

입력값의 정의역은 다음과 같다.
1 <= w, h <= 100
1 <= n <= 10
d = 0 or 1
1 <= x <= 100-h
1 <= y <= 100-w

ex )  5 5

        3

        2 0 1 1

        3 1 2 3

        4 1 2 5

- 출력 : 모든 막대를 놓은 격자판의 상태를 출력한다. 막대에 의해 가려진 경우 1, 아닌 경우 0으로 출력한다. 단, 각 숫자는 공백으로 구분하여 출력한다.

ex )   1 1 0 0 0

         0 0 1 0 1

         0 0 1 0 1

         0 0 1 0 1

         0 0 0 0 1

package _CodeUp_;

import java.util.Scanner;

public class code1 {
   public static void main(String[] args) {
       //첫 줄에 격자판의 세로(h), 가로(w) 가 공백을 두고 입력되고,
       //두 번째 줄에 놓을 수 있는 막대의 개수(n)
       //세 번째 줄부터 각 막대의 길이(l), 방향(d), 좌표(x, y)가 입력된다.
       Scanner sc = new Scanner(System.in);

       int h = sc.nextInt(); //세로
       int w = sc.nextInt(); //가로
       int[][] arr = new int[h][w];

       int n = sc.nextInt(); //막대의 개수

       for (int i = 0; i < n; i++) {
           int l = sc.nextInt(); //길이
           int d = sc.nextInt(); //방향(0:가로, 1:세로)
           int x = sc.nextInt(); //x좌표
           int y = sc.nextInt(); //y좌표

           //방향이 가로일 경우 x값은 유지하되 y를 증가시시면서 해당 인덱스의 값을 1로 갱신
           //반대로 세로일 경우 y값은 유지하되 x를 증가시시면서 해당 인덱스의 값을 1로 갱신
           for (int j = 0; j < l; j++) {
               if (d == 0) //가로
                   arr[x-1][y-1+j] = 1;
               else //세로
                   arr[x-1+j][y-1] = 1;
           }
       }
       for (int i = 0; i < h; i++) {
           for (int j = 0; j < w; j++) {
               System.out.printf("%d ",arr[i][j]);
           }
           System.out.println();
       }

   }
}

 

완성된 코드

 

 

 

 

 

 

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

 

< 문제 설명 >

- 영일이는 생명과학에 관심이 생겨 왕개미를 연구하고 있었다. 왕개미를 유심히 살펴보던 중 특별히 성실해 보이는 개미가 있었는데,
그 개미는 개미굴에서 나와 먹이까지 가장 빠른 길로 이동하는 것이었다. 개미는 오른쪽으로 움직이다가 벽을 만나면 아래쪽으로 움직여 가장 빠른 길로 움직였다. (오른쪽에 길이 나타나면 다시 오른쪽으로 움직인다.)

- 이에 호기심이 생긴 영일이는 그 개미를 미로 상자에 넣고 살펴보기 시작하였다. 미로 상자에 넣은 개미는 먹이를 찾았거나, 더 이상 움직일 수 없을 때까지 오른쪽 또는 아래쪽으로만 움직였다.

- 미로 상자의 구조가 0(갈 수 있는 곳), 1(벽 또는 장애물)로 주어지고, 먹이가 2로 주어질 때, 성실한 개미의 이동 경로를 예상해보자.

- 단, 맨 아래의 가장 오른쪽에 도착한 경우, 더 이상 움직일 수 없는 경우, 먹이를 찾은 경우에는 더이상 이동하지 않고 그 곳에 머무른다고 가정한다. 미로 상자의 테두리는 모두 벽으로 되어 있으며, 개미집은 반드시 (2, 2)에 존재하기 때문에 개미는 (2, 2)에서 출발한다.

 

 

- 입력 : 10*10 크기의 미로 상자의 구조와 먹이의 위치가 입력된다.
ex )   1 1 1 1 1 1 1 1 1 1

         1 0 0 1 0 0 0 0 0 1

         1 0 0 1 1 1 0 0 0 1

         1 0 0 0 0 0 0 1 0 1

         1 0 0 0 0 0 0 1 0 1

         1 0 0 0 0 1 0 1 0 1

         1 0 0 0 0 1 2 1 0 1

         1 0 0 0 0 1 0 0 0 1

         1 0 0 0 0 0 0 0 0 1

         1 1 1 1 1 1 1 1 1 1

- 출력 : 성실한 개미가 이동한 경로를 9로 표시해 출력한다.

ex )   1 1 1 1 1 1 1 1 1 1

         1 9 9 1 0 0 0 0 0 1

         1 0 9 1 1 1 0 0 0 1

         1 0 9 9 9 9 9 1 0 1

         1 0 0 0 0 0 9 1 0 1

         1 0 0 0 0 1 9 1 0 1

         1 0 0 0 0 1 9 1 0 1

         1 0 0 0 0 1 0 0 0 1

         1 0 0 0 0 0 0 0 0 1

         1 1 1 1 1 1 1 1 1 1

package _CodeUp_;

import java.util.Scanner;

public class code1 {
   public static void main(String[] args) {
   
       Scanner sc = new Scanner(System.in);

       int[][] arr = new int[11][11];

       for (int i = 1; i <= 10; i++) {
           for (int j = 1; j <= 10; j++) {
               arr[i][j] = sc.nextInt();
           }
       }

       int x = 2; //초기값 2로 설정
       int y = 2; //초기값 2로 설정


       while (true) {
           if (arr[x][y] == 0) {  //해당 좌표가 0이면 갈 수 있는곳임
               arr[x][y] = 9;
               y++; //오른쪽으로 움직이기 위해 y값 1증가
           }
           if (arr[x][y] == 1) {  //해당 좌표가 1이면 벽 또는 장애물로 갈 수 없음
               y--; //y값 감소
               x++; //다시 되돌아와 아래로 이동해야 하기 때문에 x값 1증가
           }
           if (arr[x][y] == 2) { //2는 먹이
               arr[x][y] = 9; //9로 변경한 후 반복문 탈출
               break;
           } else if (arr[x][y+1] == 1 && arr[x+1][y] == 1) { //맨 아래의 오른쪽에 도착한 경우
               if (arr[x][y] == 0)
                   arr[x][y] = 9;
               break; //더이상 움직일 수 없는 경우 멈춤
           }
       }
       for (int i = 1; i <= 10; i++) {
           for (int j = 1; j <= 10; j++) {
               System.out.printf("%d ",arr[i][j]);
           }
           System.out.println();
       }
   }
}

 

완성된 코드

 

 

 

 

코드업 100제 끝

'JAVA' 카테고리의 다른 글

< (JAVA) 코드업 1081 ~ 1090 >  (1) 2024.04.05
< (JAVA) 코드업 1071 ~ 1080 >  (0) 2024.04.01
< (JAVA) 코드업 1061 ~ 1070 >  (0) 2024.03.29
< (JAVA) 코드업 1051 ~ 1060 >  (0) 2024.03.28
< (JAVA) 코드업 1041 ~ 1050 >  (0) 2024.03.21