C언어 기초 100제
1008 : [기초-출력] 출력하기08
유니코드 찾는데 너무 힘들었다.
#include <stdio.h>
int main()
{
printf("\u250C\u252C\u2510\n\u251C\u253C\u2524\n\u2514\u2534\u2518");
return 0;
}
1022 : [기초-입출력] 문장 1개 입력받아 그대로 출력하기
EOF를 이용하여 풀었다.
#include <stdio.h>
int main()
{
int i=0;
char data[2001]="";
while(scanf("%c",&data[i])!=EOF){
i++;
}
printf("%s", data);
return 0;
}
1025 : [기초-입출력] 정수 1개 입력받아 나누어 출력하기
#include <stdio.h>
int main(){
int a;
scanf("%d", &a);
printf("[%d]\n", a / 10000 * 10000);
printf("[%d]\n", ((a % 10000) / 1000) * 1000);
printf("[%d]\n", ((a % 1000) / 100) * 100);
printf("[%d]\n", ((a % 100) / 10) * 10);
printf("[%d]\n", ((a % 10) / 1) * 1);
}
1080 : [기초-종합] 언제까지 더해야 할까?
1부터 n까지의 합이 n*(n+1)/2 니까 그 공식을 역으로 사용하면 되지 않을까?
라는 생각으로 풀었다.
#include <iostream>
#include <cmath>
using namespace std;
int main(){
cin.tie(NULL);
ios_base::sync_with_stdio(0);
unsigned long long int s;
cin >> s;
unsigned long long int n = sqrt(s*2);
n = s<=n*(n+1)/2?n:n+1;
cout << n;
}
1092 : [기초-종합] 함께 문제 푸는 날(설명)
#include <stdio.h>
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int lcm(int a, int b){
return a*b/gcd(a,b);
}
int main()
{
int day, a, b, c;
scanf("%d%d%d", &a, &b, &c);
printf("%d", lcm(a,lcm(b,c)));
}
1097 : [기초-2차원배열] 바둑알 십자 뒤집기
#include <stdio.h>
int main()
{
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;
}
}
for (i = 1; i <= 19; i++)
{
for (j = 1; j <= 19; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
}
1099 : [기초-2차원배열] 성실한 개미
처음 풀었을 때는 그래프이론도 배우지 않고 그냥 풀었다…
내가 봐도 매우 비효율적이다.
#include <stdio.h>
int main(){
int i, j, y = 2, x = 1, n = 1;
int a[11][11] = {};
for (i = 1; i <= 10; i++) //한 줄씩 미로상자구조 입력 받기
for (j = 1; j <= 10; j++)
scanf("%d", &a[i][j]);
i = 2, j = 1;
while (n != 0)
{
while (true)
{
if (a[i][x + 1] == 0) {
a[i][x + 1] = 9;
x++, j++;
}
else if (a[i][x + 1] == 2) {
a[i][x + 1] = 9;
n = 0;
goto result;
}
else if (a[i][x + 1] == 1) break;
}
while (true)
{
if (a[y + 1][j] == 0) {
a[y + 1][j] = 9;
y++, i++;
break;
}
else if (a[y + 1][j] == 2) {
a[y + 1][j] = 9;
n = 0;
goto result;
}
else n = 0; break;
}
}
result:
for (i = 1; i <= 10; i++)
{
for (j = 1; j <= 10; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
}
하지만 지금은 더 쉽고 간단하게 풀 수 있게 되었다.
#include <stdio.h>
int a[11][11] = {};
void s(int i,int j){
if(a[i][j]==0)a[i][j]=9;
if(a[i][j]==2){
a[i][j]=9;
return;
}
if(a[i][j+1]!=1)s(i,j+1);
else if(a[i+1][j]!=1)s(i+1,j);
return;
}
int main(){
int i, j, y = 2, x = 1, n = 1;
for (i = 1; i <= 10; i++) //한 줄씩 미로상자구조 입력 받기
for (j = 1; j <= 10; j++)
scanf("%d", &a[i][j]);
s(2,2);
for (i = 1; i <= 10; i++)
{
for (j = 1; j <= 10; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
}