문제

어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다. 'radar', 'sees'는 팰린드롬이다.

수도 팰린드롬으로 취급할 수 있다. 수의 숫자들을 뒤에서부터 읽어도 같다면 그 수는 팰린드롬수다. 121, 12421 등은 팰린드롬수다. 123, 1231은 뒤에서부터 읽으면 다르므로 팰린드롬수가 아니다. 또한 10도 팰린드롬수가 아닌데, 앞에 무의미한 0이 올 수 있다면 010이 되어 팰린드롬수로 취급할 수도 있지만, 특별히 이번 문제에서는 무의미한 0이 앞에 올 수 없다고 하자.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.

출력

각 줄마다 주어진 수가 팰린드롬수면 'yes', 아니면 'no'를 출력한다.

예제 입력 1

121
1231
12421
0

예제 출력 1

yes
no
yes

더보기

Solution

#include<stdio.h>
#include<string.h>
#include<stdbool.h>

int main(void)
{
	int N;

	scanf("%d", &N);
	while(N>0)
	{
		char str[6]={'\0', };
		bool isPalindrome=true;

		sprintf(str,"%d", N);

		for(int i=0;i<strlen(str)/2;i++)
			if(str[i]!=str[strlen(str)-1-i])
			{
				isPalindrome=false;
				break;
			}

		printf("%s\n", isPalindrome?"yes":"no");

		scanf("%d", &N);
	}

	return 0;
}
728x90

문제

본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.

C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.

Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.

또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.

자세한 설명 및 다른 언어의 경우는 이 글에 설명되어 있다.

이 블로그 글에서 BOJ의 기타 여러 가지 팁을 볼 수 있다.

입력

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

출력

각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.

예제 입력 1

5
1 1
12 34
5 500
40 60
1000 1000

예제 출력 1

2
46
505
100
2000

더보기

Solution

#include<stdio.h>

int main(void)
{
	int T;

	scanf("%d", &T);

	for(int i=0;i<T;i++)
	{
		int A, B;

		scanf("%d %d", &A, &B);

		printf("%d\n", A+B);
	}

	return 0;
}
728x90

문제

두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력

첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-9 이하이면 정답이다.

예제 입력 1

1 3

예제 출력 1

0.33333333333333333333333333333333

10^(-9) 이하의 오차를 허용한다는 말은 꼭 소수 9번째 자리까지만 출력하라는 뜻이 아니다.

예제 입력 2

4 5

예제 출력 2

0.8

비슷한 문제

<백준 알고리즘> 1000번: A+B

<백준 알고리즘> 1001번: A-B

<백준 알고리즘> 2558번: A+B - 2

<백준 알고리즘> 10950번: A + B - 3

<백준 알고리즘> 10951번: A + B - 4

<백준 알고리즘> 10952번: A+B - 5

<백준 알고리즘> 10953번: A+B - 6

<백준 알고리즘> 10998번: A×B

<백준 알고리즘> 11021번: A+B - 7

<백준 알고리즘> 11022번: A+B - 8


더보기

Solution

#include<stdio.h>

int main(void)
{
	int A, B;

	scanf("%d %d", &A, &B);

	printf("%.10lf\n", (double)A/B);

	return 0;
}
728x90

문제

컴퓨터를 제조하는 회사인 KOI 전자에서는 제조하는 컴퓨터마다 6자리의 고유번호를 매긴다. 고유번호의 처음 5자리에는 00000부터 99999까지의 수 중 하나가 주어지며 6번째 자리에는 검증수가 들어간다. 검증수는 고유번호의 처음 5자리에 들어가는 5개의 숫자를 각각 제곱한 수의 합을 10으로 나눈 나머지이다.

예를 들어 고유번호의 처음 5자리의 숫자들이 04256이면, 각 숫자를 제곱한 수들의 합 0+16+4+25+36 = 81 을 10으로 나눈 나머지인 1이 검증수이다.

입력

첫째 줄에 고유번호의 처음 5자리의 숫자들이 빈칸을 사이에 두고 하나씩 주어진다.

출력

첫째 줄에 검증수를 출력한다.

예제 입력 1

0 4 2 5 6

예제 출력 1

1

더보기

Solution

#include<stdio.h>

int main(void)
{
	int number[5], sum=0;

	for(int i=0;i<5;i++)
	{
		scanf("%d", &number[i]);

		sum+=number[i]*number[i];
	}

	printf("%d\n", sum%10);

	return 0;
}
728x90

문제

첫째 줄에는  N, 둘째 줄에는  N-1, ..., N번째 줄에는  1개를 찍는 문제

하지만, 오른쪽을 기준으로 정렬한 (예제 참고) 출력하시오.

입력

첫째 줄에 N(1 ≤ N ≤ 100) 주어진다.

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

예제 입력 1

5

예제 출력 1

*****
 ****
  ***
   **
    *

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N;

	scanf("%d", &N);

	for(int i=N;i>0;i--)
	{
		for(int j=0;i+j<N;j++)
			printf(" ");
		for(int j=0;j<i;j++)
			printf("*");
		printf("\n");
	}

	return 0;
}
728x90

문제

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

입력

세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.

출력

직사각형의 네 번째 점의 좌표를 출력한다.

예제 입력 1

30 20
10 10
10 20

예제 출력 1

30 10

더보기

Solution

#include<stdio.h>

int main(void)
{
	int x[4], y[4];

	for(int i=0;i<3;i++)
		scanf("%d %d", &x[i], &y[i]);

	x[3]=x[0]==x[1]?x[2]:x[0]==x[2]?x[1]:x[0];
	y[3]=y[0]==y[1]?y[2]:y[0]==y[2]?y[1]:y[0];

	printf("%d %d\n", x[3], y[3]);

	return 0;
}
728x90

문제

나코더 기장 재민이는 동아리 회식을 준비하기 위해서 장부를 관리하는 중이다.

재현이는 재민이를 도와서 돈을 관리하는 중인데, 애석하게도 항상 정신없는 재현이는 돈을 실수로 잘못 부르는 사고를 치기 일쑤였다.

재현이는 잘못된 수를 부를 때마다 0을 외쳐서, 가장 최근에 재민이가 쓴 수를 지우게 시킨다.

재민이는 이렇게 모든 수를 받아 적은 후 그 수의 합을 알고 싶어 한다. 재민이를 도와주자!

입력

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000)

이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 수를 쓴다.

정수가 "0"일 경우에 지울 수 있는 수가 있음을 보장할 수 있다.

출력

재민이가 최종적으로 적어 낸 수의 합을 출력한다. 최종적으로 적어낸 수의 합은 231-1보다 작거나 같은 정수이다.

예제 입력 1

4
3
0
4
0

예제 출력 1

0

예제 입력 2

10
1
3
5
4
0
0
7
0
0
6

예제 출력 2

7

힌트

예제 2의 경우를 시뮬레이션 해보면,

  • [1]
  • [1,3]
  • [1,3,5]
  • [1,3,5,4]
  • [1,3,5] (0을 불렀기 때문에 최근의 수를 지운다)
  • [1,3] (0을 불렀기 때문에 그 다음 최근의 수를 지운다)
  • [1,3,7]
  • [1,3] (0을 불렀기 때문에 최근의 수를 지운다)
  • [1] (0을 불렀기 때문에 그 다음 최근의 수를 지운다)
  • [1,6]

합은 7이다.


더보기

Solution

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
	int K, *money=NULL, sum=0, state=0;

	scanf("%d", &K);
	money=(int *)calloc(K,sizeof(int));

	for(int i=0;i<K;i++)
	{
		scanf("%d", &money[state]);

		state+=money[state]==0?-1:1;
	}

	for(int i=0;i<state;i++)
		sum+=money[i];

	printf("%d\n", sum);

	free(money);
	return 0;
}
728x90

문제

첫째 줄에는 별 1개, 둘째 줄에는 별 3개, ..., N번째 줄에는 별 2×N-1개를 찍는 문제

별은 가운데를 기준으로 대칭이어야 한다.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

예제 입력 1

5

예제 출력 1

    *
   ***
  *****
 *******
*********

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N;

	scanf("%d", &N);

	for(int i=1;i<=N;i++)
	{
		for(int j=0;i+j<N;j++)
			printf(" ");
		printf("*");
		for(int j=1;j<i;j++)
			printf("**");
		printf("\n");
	}

	return 0;
}
728x90

+ Recent posts