- 바둑판(19 * 19)에 n개의 흰 돌을 놓는다고 할 때,
n개의 흰 돌이 놓인 위치를 출력하는 프로그램을 작성해보자.
입력
바둑판에 올려 놓을 흰 돌의 개수(n)가 첫 줄에 입력된다.
둘째 줄 부터 n+1 번째 줄까지 힌 돌을 놓을 좌표(x, y)가 n줄 입력된다.
n은 10이하의 자연수이고 x, y 좌표는 1 ~ 19 까지이며, 같은 좌표는 입력되지 않는다.출력
흰 돌이 올려진 바둑판의 상황을 출력한다.
흰 돌이 있는 위치는 1, 없는 곳은 0으로 출력한다.#include <stdio.h> int main() { int n,i,j,x,y,index[19][19]={0}; scanf("%d",&n); for(i=0;i<n;i++) { x=0,y=0; scanf("%d %d",&x,&y); if(index[x-1][y-1]==0) index[x-1][y-1]+=1; } for(i=0;i<19;i++) { for(j=0;j<19;j++) { printf("%d ",index[i][j]); } printf("\n"); } return 0; }
1919크기의 바둑판을 만들기위해서는 2차원배열을 사용하면 된다.
2차원배열은 arr[i][j]로 표현한다. 1919이므로 i와 j는 19까지 할당
- 바둑판(19 * 19)에 흰 돌(1) 또는 검정 돌(0)이 모두 꽉 채워져 놓여있을 때,
n개의 좌표를 입력받아 십(+)자 뒤집기한 결과를 출력하는 프로그램을 작성해보자.입력
바둑알이 깔려 있는 상황이 19 * 19 크기의 정수값으로 입력된다.
십자 뒤집기 횟수(n)가 입력된다.
십자 뒤집기 좌표가 횟수(n) 만큼 입력된다. 단, n은 10이하의 자연수이다.출력
십자 뒤집기 결과를 출력한다.#include <stdio.h> int main() { int i,j,n,x,y,index[20][20]={}; for(i=0;i<19;i++) for(j=0;j<19;j++) scanf("%d ",&index[i][j]); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d %d",&x,&y); for(j=0;j<19;j++) { if(index[x-1][j]==0) index[x-1][j]=1; else index[x-1][j]=0; } for(j=0;j<19;j++) { if(index[j][y-1]==0) index[j][y-1]=1; else index[j][y-1]=0; } } for(i=0;i<19;i++) { for(j=0;j<19;j++) { printf("%d ",index[i][j]); } printf("\n"); } return 0; }
이 문제풀때 좀 시간이 걸린것같다. 컴파일을 몇번한지모르겠다;;
문제는 나는 배열을 쓸때 인덱스를 0~n-1이렇게 쓰는버릇이 있는데 이렇게 쓰다보니 헷갈려서 인덱스에 접근을 잘못한것 같다.11번줄 ~ 28번줄 까지가 숫자를 뒤집는 과정인데, 인덱스를 0~18로 설정해서 x-1또는 y-1이렇게 수정해야하는 소요가 발생했다. 만약에 선언할때 index[20][20]로선언하고 0번배열을 버리고 인덱스로 1~19까지를 사용했다면 덜헷갈릴텐데.....
- 격자판의 세로(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출력
모든 막대를 놓은 격자판의 상태를 출력한다.
막대에 의해 가려진 경우 1, 아닌 경우 0으로 출력한다.
단, 각 숫자는 공백으로 구분하여 출력한다.#include <stdio.h> int main() { int h,w,n,l,d,x,y,i,j,k,arr[100][100]={}; scanf("%d %d",&h,&w); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d %d %d %d",&l,&d,&x,&y); for(k=0;k<l;k++) { if(d==0) arr[x-1][y+k-1]=1; else arr[x+k-1][y-1]=1; } } for(i=0;i<h;i++) { for(j=0;j<w;j++) { printf("%d ",arr[i][j]); } printf("\n"); } return 0; }
입력받는 변수가 꽤있는데, 이걸 헷갈리지말자.
그리고 일반적으로 가로축이 x축, 세로축이 y축이라 생각하는데 이문제에서는 반대임을 주의.
배열은 행우선임을 기억하자.이문제에서도 0번째 배열을 버렸으면 좀더 편하게 코딩할 수 있었을텐데...
x축과 y축이 바뀐것은 arr[x][y]로 표현하는데, 배열은 행우선이기 때문에 오른쪽으로 한칸이동하려면 arr[x+1][y]이아닌 arr[x][y+1]이여야 하기 때문이다.
- 영일이는 생명과학에 관심이 생겨 왕개미를 연구하고 있었다.
왕개미를 유심히 살펴보던 중 특별히 성실해 보이는 개미가 있었는데,
그 개미는 개미굴에서 나와 먹이까지 가장 빠른 길로 이동하는 것이었다.개미는 오른쪽으로 움직이다가 벽을 만나면 아래쪽으로 움직여 가장 빠른 길로 움직였다.
(오른쪽에 길이 나타나면 다시 오른쪽으로 움직인다.)이에 호기심이 생긴 영일이는 그 개미를 미로 상자에 넣고 살펴보기 시작하였다.
미로 상자에 넣은 개미는 먹이를 찾았거나, 더 이상 움직일 수 없을 때까지
오른쪽 또는 아래쪽으로만 움직였다.미로 상자의 구조가 0(갈 수 있는 곳), 1(벽 또는 장애물)로 주어지고,
먹이가 2로 주어질 때, 성실한 개미의 이동 경로를 예상해보자.단, 맨 아래의 가장 오른쪽에 도착한 경우, 더 이상 움직일 수 없는 경우, 먹이를 찾은 경우에는
더이상 이동하지 않고 그 곳에 머무른다고 가정한다.미로 상자의 테두리는 모두 벽으로 되어 있으며,
개미집은 반드시 (2, 2)에 존재하기 때문에 개미는 (2, 2)에서 출발한다.입력
10*10 크기의 미로 상자의 구조와 먹이의 위치가 입력된다.출력
성실한 개미가 이동한 경로를 9로 표시해 출력한다.#include <stdio.h> int main() { int m[11][11]={},i,j,x,y; //미로상자, 먹이 for(i=0;i<10;i++) { for(j=0;j<10;j++) { scanf("%d",&m[i][j]); } } x=1;y=1; while(1) { if(m[x][y]==0) { m[x][y]=9; y++; } else if(m[x][y]==1) { y--; x++; } else if(m[x][y]==2) { m[x][y]=9; break; } if(m[x][y+1]==1 && m[x+1][y]==1) { m[x][y]=9; break; } } //출력 for(i=0;i<10;i++) { for(j=0;j<10;j++) { printf("%d ",m[i][j]); } printf("\n"); } return 0; }
미로 상자는 주어지니까 우리는 틀만만들고 입력만 받으면된다. 개미는 2,2에 있다고했지만, 나는 인덱스를 0~9까지 설정했기때문에 1,1에 위치한것으로 설정했다.
15번줄~39줄까지 개미의 발자취를 기록하는 코든데,
첫번째 if문은 개미가 서있는곳이 빈곳(0)이면 발자취(9)를남기고 오른쪽으로이동(y +1)한다
두번째 else if문은 개미가 서있는곳이 벽(1)이면 왼쪽으로 한칸이동(y-1)하고, 밑으로 한칸이동(x+1)한다.
세번째 else if문은 개미가 서있는곳이 먹이(2)이면 발자취를 남기고 break로 반복문을 빠져나온다.
마지막 if문은 오른쪽, 아래쪽이 모두 벽이면, 서있는곳에 발자취를 남기고 break로 반복문을 빠져나온다.
1098번문제처럼 m[x][y]가 바뀐것은 행우선이기 때문이다.
보름조금넘어서 코드업C언어 100제를 모두 업로드 완료했다.
풀기는 전에 다풀었지만 업로드하는데 아무래도 블로그도 처음이고 미숙한것도 있는것 같다.
그래도 뭔가 하나 해내니까 기분도 좋고 성취감이 있는 것 같다.
앞으로 백준/그리디 알고리즘을 포스팅하겠다. 조금 미리 풀어봤는데, 보아하니 티어(브론즈 실버 골드 플래티넘...)도 있는것같은데, 심해부터 천천히 한번 올라가보겠다.
앞으로도 쳐지지말고, 꾸준히 올려보자!!
2021.6.17