가로 길이가 w이고 세로 길이가 h인 2차원 격자 공간이 있다. 이 격자는 아래 그림처럼 왼쪽 아래가 (0,0)이고 오른쪽 위가 (w,h)이다. 이 공간 안의 좌표 (p,q)에 개미 한 마리가 놓여있다. 개미는 오른쪽 위 45도 방향으로 일정한 속력으로 움직이기 시작한다. 처음에 (p,q)에서 출발한 개미는 1시간 후에는 (p+1,q+1)로 옮겨간다. 단, 이 속력으로 움직이다가 경계면에 부딪치면 같은 속력으로 반사되어 움직인다.

위 그림은 6×4 격자에서 처음에 (4,1)에서 출발한 개미가 움직인 길을 보여주고 있다. 처음에 (4,1)에 있는 개미는 2시간 후에 (6,3)에 있으며 8시간 후에 (0,1)에 있다. 만일 그 개미가 처음에 (5,3)에 있었다면 매 시간마다 (6,4), (5,3), (4,2), (3,1)로 움직인다. 

여러분은 크기 w×h인 격자 공간에서 처음에 (p,q)에서 출발하는 개미의 t시간 후의 위치 (x,y)를 계산하여 출력해야 한다. 개미는 절대 지치지 않고 같은 속력으로 이동한다고 가정한다. 

문제에서 w와 h는 자연수이며 범위는 2 ≤ w,h ≤ 40,000이다. 그리고 개미의 초기 위치 p와 q도 자연수이며 범위는 각각 0 < p < w과 0 < q < h이다. 그리고 계산할 시간 t의 범위는 1 ≤ t ≤ 200,000,000이다. 

입력

첫줄에는 w와 h가 공백을 사이에 두고 주어진다. 그 다음 줄에는 초기 위치의 좌표값 p와 q가 공백을 사이에 두고 주어진다. 3번째 줄에는 개미가 움직일 시간 t가 주어진다. 

출력

출력은 t 시간 후에 개미의 위치 좌표 (x,y)의 값 x와 y를 공백을 사이에 두고 출력한다. 

예제 입력 1

6 4
4 1
8

예제 출력 1

0 1

예제 입력 2

6 4
5 3
4

예제 출력 2

3 1

더보기

Solution

#include<stdio.h>

int main(void)
{
	int w, h, p, q, t;

	scanf("%d%d", &w, &h);
	scanf("%d%d", &p, &q);
	scanf("%d", &t);

	int x=t%(2*w), y=t%(2*h);

	while(x>0 && p<w)
	{
		x--;
		p++;
	}
	while(x>0 && p>0)
	{
		x--;
		p--;
	}
	while(x>0 && p<w)
	{
		x--;
		p++;
	}
	while(y>0 && q<h)
	{
		y--;
		q++;
	}
	while(y>0 && q>0)
	{
		y--;
		q--;
	}
	while(y>0 && q<h)
	{
		y--;
		q++;
	}

	printf("%d %d\n",  p, q);
	return 0;
}
728x90

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 둘레의 길이를 구하는 프로그램을 작성하시오.

예를 들어 흰색 도화지 위에 네 장의 검은색 색종이를 <그림 1>과 같은 모양으로 붙였다면 검은색 영역의 둘레는 96 이 된다.

<그림 1>

입력

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다. 

출력

첫째 줄에 색종이가 붙은 검은 영역의 둘레의 길이를 출력한다.

예제 입력 1

4
3 7
5 2
15 7
13 14

예제 출력 1

96

더보기

Solution

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

int main(void)
{
	bool paper[103][103]={false, };
	int N, x, y, length=0;

	scanf("%d", &N);

	for(int n=0;n<N;n++)
	{
		scanf("%d%d", &x, &y);

		for(int i=0;i<10;i++)
			for(int j=0;j<10;j++)
				paper[x+i+1][y+j+1]=true;
	}

	for(int i=1;i<102;i++)
		for(int j=1;j<102;j++)
			if(paper[i][j])
			{
				length+=paper[i-1][j]==0;
				length+=paper[i+1][j]==0;
				length+=paper[i][j-1]==0;
				length+=paper[i][j+1]==0;
			}

	printf("%d\n", length);
	return 0;
}
728x90

2차원 격자공간에 두 개의 꼭짓점 좌표로 표현되는 직사각형이 있다. 직사각형은 아래와 같이 왼쪽 아래 꼭짓점 좌표 (x, y)와 오른쪽 위 꼭짓점 좌표 (p, q)로 주어진다.

이 문제에서 모든 직사각형은 두 꼭짓점의 좌표를 나타내는 4개의 정수 x y p q 로 표현된다. 단 항상 x<p, y<q 이다. 예를 들어 위 그림에 제시된 직사각형이라면 아래와 같이 표현된다.

3 2 9 8

두 개의 직사각형은 그 겹치는 부분의 특성에 따라 다음 4가지 경우로 분류될 수 있다. 

먼저 두 직사각형의 겹치는 부분이 직사각형인 경우이다. 아래 그림(a)는 공통부분이 직사각형인 경우의 3가지 예를 보여준다,

그림 (a)

또는 겹치는 부분이 아래 그림 (b)와 같이 선분이 될 수도 있고, 그림 (c)와 같이 점도 될 수 있다. 

그림 (b)

그림 (c)

마지막으로 아래 그림 (d)와 같이 공통부분 없이 두 직사각형이 완전히 분리된 경우도 있다.

그림 (d)

여러분은 두 직사각형의 겹치는 부분이 직사각형인지, 선분인지, 점인지, 아니면 전혀 없는 지를 판별해서 해당되는 코드 문자를 출력해야 한다. 

공통부분의 특성 코드 문자
직사각형 a
선분 b
c
공통부분이 없음 d

입력

4개의 줄로 이루어져 있다. 각 줄에는 8개의 정수가 하나의 공백을 두고 나타나는데, 첫 4개의 정수는 첫 번째 직사각형을, 나머지 4개의 정수는 두 번째 직사각형을 각각 나타낸다. 단 입력 직사각형의 좌표 값은 1이상 50,000 이하의 정수로 제한된다. 

출력

4개의 각 줄에 주어진 두 직사각형의 공통부분을 조사해서 해당하는 코드 문자를 출력파일의 첫 4개의 줄에 각각 차례대로 출력해야 한다.

예제 입력 1

3 10 50 60 100 100 200 300
45 50 600 600 400 450 500 543
11 120 120 230 50 40 60 440
35 56 67 90 67 80 500 600

예제 출력 1

d
a
a
b

더보기

Solution

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

int main(void)
{
	for(int t=0;t<4;t++)
	{
		int rectangle[2][4][2], x, y, p, q;
		bool is_b=false, is_c=false, is_d=false;

		for(int i=0;i<2;i++)
		{
			scanf("%d%d%d%d", &x, &y, &p, &q);
			rectangle[i][0][0]=rectangle[i][3][0]=x;
			rectangle[i][0][1]=rectangle[i][1][1]=y;
			rectangle[i][1][0]=rectangle[i][2][0]=p;
			rectangle[i][2][1]=rectangle[i][3][1]=q;
		}

		for(int i=0;i<4;i++)
			if(rectangle[0][i][0]==rectangle[1][(i+2)%4][0] && rectangle[0][i][1]==rectangle[1][(i+2)%4][1])
			{
				is_c=true;
				break;
			}

		if(is_c)
		{
			printf("c\n");
			continue;
		}
		
		for(int i=0;i<2;i++)
			if(rectangle[i][0][0]>rectangle[(i+1)%2][1][0] || rectangle[i][0][1]>rectangle[(i+1)%2][2][1])
			{
				is_d=true;
				break;
			}
			else if(rectangle[i][0][0]==rectangle[(i+1)%2][1][0] || rectangle[i][0][1]==rectangle[(i+1)%2][2][1])
			{
				is_b=true;
				break;
			}
		if(is_d)
		{
			printf("d\n");
			continue;
		}
		if(is_b)
		{
			printf("b\n");
			continue;
		}
		printf("a\n");
	}

	return 0;
}
728x90

두 어린이 A, B가 딱지놀이를 한다. 딱지놀이 규칙은 다음과 같다. 두 어린이는 처음에 여러 장의 딱지를 가지고 있고, 매 라운드마다 각자 자신이 가진 딱지 중 하나를 낸다. 딱지에는 별(★), 동그라미(●), 네모(■), 세모(▲), 네 가지 모양 중 하나 이상의 모양이 표시되어 있다. 두 어린이가 낸 딱지 중 어느 쪽이 더 강력한 것인지는 다음 규칙을 따른다.

  • 만약 두 딱지의 별의 개수가 다르다면, 별이 많은 쪽의 딱지가 이긴다.
  • 별의 개수가 같고 동그라미의 개수가 다르다면, 동그라미가 많은 쪽의 딱지가 이긴다.
  • 별, 동그라미의 개수가 각각 같고 네모의 개수가 다르다면, 네모가 많은 쪽의 딱지가 이긴다.
  • 별, 동그라미, 네모의 개수가 각각 같고 세모의 개수가 다르다면, 세모가 많은 쪽의 딱지가 이긴다.
  • 별, 동그라미, 네모, 세모의 개수가 각각 모두 같다면 무승부이다.

예를 들어, 두 어린이 A, B가 낸 딱지가 다음 그림과 같다고 하자.

위 규칙을 따르면 A의 딱지는 별 하나를 가지고 있고 B의 딱지는 별이 없으므로 승자는 A이다. 위의 그림이 라운드 1의 상황이었고, 라운드 2, 3, 4, 5의 상황이 아래 표와 같을 때, 라운드 2, 3, 4의 승자는 각각 B, B, A이며, 라운드 5에서는 무승부가 되어 이를 D로 표현하였다.

라운드 A의 딱지 B의 딱지 결과
1 ●●■▲ A
2 ■★●■▲ ★●●▲ B
3 ●■▲▲ ■●■▲ B
4 ★●■▲ ★●■ A
5 ★★■●▲ ★■★▲● D

별, 동그라미, 네모, 세모를 각각 숫자 4, 3, 2, 1로 표현한다. 예를 들어, 라운드 1의 경우 어린이 A가 낸 딱지의 그림 ★는 4로 표현할 수 있고, 어린이 B가 낸 딱지의 그림 ●●■▲는 3 3 2 1 로 표현할 수 있다.

라운드의 수 N과 두 어린이가 순서대로 내는 딱지의 정보가 주어졌을 때, 각 라운드별로 딱지놀이의 결과를 구하는 프로그램을 작성하시오.

입력

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 딱지놀이의 총 라운드 수를 나타내는 자연수 N이 주어진다. N 은 1 이상 1,000 이하이다. 다음 줄에는 라운드 1에서 어린이 A가 내는 딱지에 나온 그림의 총 개수 a가 주어진다. a는 1 이상 100 이하이다. 뒤따라 나오는 a개의 정수는 어린이 A가 낸 딱지의 그림을 나타내는데, 각각 4, 3, 2, 1 중 하나의 값이다. 4, 3, 2, 1의 순서대로 주어지지 않을 수 있음에 주의하라. 다음 줄에는 라운드 1에서 어린이 B가 내는 딱지에 나온 그림의 총 개수 b가 주어진다. b도 1 이상 100 이하이다. 뒤따라 나오는 b개의 정수는 어린이 B가 낸 딱지의 그림을 나타내는데, 역시 4, 3, 2, 1 중 하나의 값이다. 역시 4, 3, 2, 1의 순서대로 주어지지 않을 수 있음에 주의하라. 다음 두 줄에는 라운드 2에서 어린이 A, B가 낸 딱지의 그림들을 같은 식으로 표현한다. 위와 같은 식으로 매 라운드마다 두 어린이가 낸 딱지의 정보는 두 줄에 표현되며, N 라운드의 딱지 정보는 차례대로 총 2N 개의 줄에 주어진다.

출력

표준 출력으로 총 N 줄을 출력한다. 출력의 i번째 (1 ≤ i ≤ N) 줄에 정확히 한 글자를 출력하는데, 출력하는 글자는 A, B, D 중 하나로 라운드 i의 결과를 나타낸다. 각 라운드의 결과는 A가 승자라면 A, B가 승자라면 B, 무승부라면 D이다.

서브태스크

번호 배점 제한
1 2 입력 예시로 주어진 입력만 존재한다.
2 13 a = 1, b = 1
3 17 모든 딱지에는 별모양 그림만 나온다.
4 68 원래의 제약조건 이외에 아무 제약조건이 없다.

예제 입력 1

5
1 4
4 3 3 2 1
5 2 4 3 2 1
4 4 3 3 1
4 3 2 1 1
4 2 3 2 1
4 4 3 2 1
3 4 3 2
5 4 4 2 3 1
5 4 2 4 1 3

예제 출력 1

A
B
B
A
D

예제 입력 2

4
4 4 3 2 1
4 1 4 3 2
4 3 3 2 1
4 4 3 3 3
4 4 3 3 3
4 3 4 3 2
4 3 2 1 1
3 3 2 1

예제 출력 2

D
B
A
A

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N;

	scanf("%d", &N);

	for(int n=0;n<N;n++)
	{
		int shape[2][5]={0, }, play;
		char winner='D';

		for(int i=0;i<2;i++)
		{
			scanf("%d", &shape[i][0]);
			for(int j=0;j<shape[i][0];j++)
			{
				scanf("%d", &play);
				shape[i][play]++;
			}
		}

		for(int i=4;i>0;i--)
			if(shape[0][i]>shape[1][i])
			{
				winner='A';
				break;
			}
			else if(shape[0][i]<shape[1][i])
			{
				winner='B';
				break;
			}

		printf("%c\n", winner);
	}

	return 0;
}
728x90

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.

먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.

  1. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
  2. 문자열의 시작과 끝은 공백이 아니다.
  3. '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.

태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.

입력

첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.

출력

첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.

예제 입력 1

baekjoon online judge

예제 출력 1

noojkeab enilno egduj

예제 입력 2

<open>tag<close>

예제 출력 2

<open>gat<close>

예제 입력 3

<ab cd>ef gh<ij kl>

예제 출력 3

<ab cd>fe hg<ij kl>

예제 입력 4

one1 two2 three3 4fourr 5five 6six

예제 출력 4

1eno 2owt 3eerht rruof4 evif5 xis6

예제 입력 5

<int><max>2147483647<long long><max>9223372036854775807

예제 출력 5

<int><max>7463847412<long long><max>7085774586302733229

예제 입력 6

<problem>17413<is hardest>problem ever<end>

예제 출력 6

<problem>31471<is hardest>melborp reve<end>

예제 입력 7

<   space   >space space space<    spa   c e>

예제 출력 7

<   space   >ecaps ecaps ecaps<    spa   c e>

더보기

Solution

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

int main(void)
{
	int last=0;
	char S[100001]={'\0', };

	fgets(S,sizeof(S),stdin);

	for(int i=0;i<strlen(S);i++)
		if(S[i]=='<')
		{
			for(int j=i-1;j>=last;j--)
				printf("%c", S[j]);
			while(S[i]!='>')
				printf("%c", S[i++]);
			printf("%c", S[i]);
			last=i+1;
		}
		else if(S[i]==' ' || S[i]=='\n')
		{
			for(int j=i-1;j>=last;j--)
				printf("%c", S[j]);
			printf(" ");
			last=i+1;
		}
		else if(i==strlen(S)-1)
			for(int j=i;j>=last;j--)
				printf("%c", S[j]);

	return 0;
}
728x90

평면에 색깔이 서로 다른 직사각형 모양의 색종이 N장이 하나씩 차례로 놓여진다. 이때 색종이가 비스듬하게 놓이는 경우는 없다. 즉, 모든 색종이의 변은 서로 평행하거나, 서로 수직이거나 둘 중 하나이다. 그림-1은 1번, 2번, 3번 세 장의 색종이가 순서대로 놓인 상태를 보여준다.

그림-1

여기에 그림-2에서 보인 것처럼 4번 색종이가 하나 더 놓이면 3번 색종이는 완전히 가려서 보이지 않게 된다. 그리고, 1번 색종이와 2번 색종이는 부분적으로 가려 보이며, 4번 색종이는 완전히 보이게 된다.

그림-2

N장의 색종이가 주어진 위치에 차례로 놓일 경우, 각 색종이가 보이는 부분의 면적을 구하는 프로그램을 작성하시오. 

입력

입력의 첫 번째 줄에는 색종이의 장수를 나타내는 정수 N (1 ≤ N ≤ 100)이 주어진다. 이어서 N장의 색종이에 관한 입력이 각 색종이마다 한 줄씩 차례로 주어진다. 색종이가 놓이는 평면은 가로 최대 1001칸, 세로 최대 1001칸으로 구성된 격자 모양이다. 격자의 각 칸은 가로, 세로 길이가 1인 면적이 1인 정사각형이다. 

편의상 가로 6칸, 세로 6칸으로 이루어진 격자의 예를 들어 설명하면, 각 칸에 표시된 값 (a,b)는 해당 칸의 번호를 나타낸다. 가장 왼쪽 아래의 칸은 (0,0) 가장 오른 쪽 위의 칸은 (5,5)이다. 

색종이가 놓인 상태는 가장 왼쪽 아래 칸의 번호와 너비, 높이를 나타내는 네 정수로 표현한다. 예를 들어, 위 그림에서 회색으로 표시된 색종이는 (1,4)가 가장 왼쪽 아래에 있고 너비 3, 높이 2이므로 1 4 3 2로 표현한다. 색종이가 격자 경계 밖으로 나가는 경우는 없다. 

출력

입력에서 주어진 순서에 따라 N장의 색종이를 평면에 놓았을 때, 입력에서 주어진 순서대로 각 색종이가 보이는 부분의 면적을 한 줄에 하나씩 하나의 정수로 출력한다. 만약 색종이가 보이지 않는다면 정수 0을 출력한다. 

서브태스크

번호 배점 제한
1 11 N = 1
2 12 N ≤ 10이고, 모든 색종이는 너비 1, 높이 1이다. 색종이가 놓여지는 평면은 가로 101칸, 세로 101칸으로 구성된 격자 모양이다.
3 30 N ≤ 10이고, 색종이가 놓여지는 평면은 가로 101칸, 세로 101칸으로 구성된 격자 모양이다.
4 47 원래의 제약조건 이외에 아무 제약 조건이 없다.

예제 입력 1

2
0 0 10 10
2 2 6 6

예제 출력 1

64
36

예제 입력 2

3
0 2 10 10
7 9 8 4
8 4 10 6

예제 출력 2

81
25
60

예제 입력 3

4
0 2 10 10
7 9 8 4
8 4 10 6
6 0 12 10

예제 출력 3

62
24
0
120

더보기

Solution

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

int main(void)
{
	int N, x, y, w, h, board[1001][1001]={1, }, *count=NULL, current=0;

	for(int i=0;i<1001;i++)
		for(int j=0;j<1001;j++)
			board[i][j]=-1;

	scanf("%d", &N);
	count=(int *)calloc(N,sizeof(int));

	for(int n=0;n<N;n++)
	{
		scanf("%d%d%d%d", &x, &y, &w, &h);
		for(int i=0;i<w;i++)
			for(int j=0;j<h;j++)
				board[x+i][y+j]=n;
	}

	for(int i=0;i<1001;i++)
		for(int j=0;j<1001;j++)
			if(board[i][j]!=-1)
				count[board[i][j]]++;

	for(int n=0;n<N;n++)
		printf("%d\n", count[n]);
	free(count);
	return 0;
}
728x90

매일 밤, 정인이는 상근이에게 이메일을 보낸다. 정인이는 자신의 이메일이 해킹당할 수도 있다는 생각에, 내용을 항상 암호화해서 보낸다.

정인이가 사용하는 암호 알고리즘은 다음과 같다. 정인이가 보내는 메시지는 총 N글자이다.

먼저, 정인이는 R<=C이고, R*C=N인 R과 C를 고른다. 만약, 그러한 경우가 여러 개일 경우, R이 큰 값을 선택한다.

그 다음, 행이 R개고, 열이 C개인 행렬을 만든다.

이제 메시지를 행렬에 옮긴다. 첫 번째 행의 첫 번째 열부터 C번째 열까지 메시지를 순서대로 옮긴 뒤, 남은 메시지는 두 번째 행, 세 번째 행,... R번째 행에 첫 번째 행을 채운 방법과 동일한 순서대로 옮긴다.

행렬에 모두 메시지를 옮겼다면, 이 것을 첫 번째 열의 첫 번째 행부터 R번째 행까지 차례대로 읽으면서 다시 받아 적는다. 그 다음에, 두 번째 열, 세 번째 열,..., C번째 열에 쓰여 있는 문자를 첫 번째 열을 읽은 방법과 동일하게 받아적는다.

상근이는 매일 밤 정인이의 메시지를 해독하는데 지쳤다. 정인이의 암호 이메일이 주어졌을 때, 이를 해독하는 프로그램을 작성하시오.

입력

첫째 줄에 상근이가 받은 메시지가 주어진다. 이 메시지는 알파벳 소문자로만 이루어져 있고, 최대 100글자이다.

출력

첫째 줄에 상근이가 받은 메시지를 해독한 메시지를 출력한다.

예제 입력 1

bok

예제 출력 1

bok

예제 입력 2

koaski

예제 출력 2

kakosi

예제 입력 3

boudonuimilcbsai

예제 출력 3

bombonisuuladici

정인이는 원래 "bombonisuuladici"를 보내려고 했다. 이 메시지는 16글자이므로, 정인이는 1*16, 2*8, 4*4 행렬을 선택할 수 있다. R이 가장 큰 것은 4*4이므로, 4*4를 선택한다.

정인이가 만든 행렬은 다음과 같을 것이다.

b o m b
o n i s
u u l a
d i c i

더보기

Solution

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

int main(void)
{
	char message[101]={'\0', };
	int R, C, N;

	scanf("%s", message);
	N=strlen(message);

	for(int r=1;r<=N;r++)
		for(int c=r;r*c<=N;c++)
			if(r*c==N)
			{
				R=r;
				C=c;
			}

	for(int i=0;i<R;i++)
	    for(int j=0;j<C;j++)
	        printf("%c", message[i+j*R]);
    printf("\n");
    
	return 0;
}
728x90

십년이면 강산이 변한다.

강산이네 동네에 드디어 극장이 생겼고, 강산이는 극장에 놀러갔다. 매점에서 콜라를 산 뒤, 자리에 앉은 강산이는 큰 혼란에 빠졌다. 양쪽 컵홀더를 이미 옆 사람들이 차지했기 때문에 콜라를 꽂을 컵 홀더가 없었기 때문이다. 영화를 보는 내내 콜라를 손에 들고 있던 강산이는 극장에 다시 왔을 때는 꼭 콜라를 컵 홀더에 놓겠다는 다짐을 한 후 집에 돌아갔다.

극장의 한 줄에는 자리가 N개가 있다. 서로 인접한 좌석 사이에는 컵홀더가 하나씩 있고, 양 끝 좌석에는 컵홀더가 하나씩 더 있다. 또, 이 극장에는 커플석이 있다. 커플석 사이에는 컵홀더가 없다.

극장의 한 줄의 정보가 주어진다. 이때, 이 줄에 사람들이 모두 앉았을 때, 컵홀더에 컵을 꽂을 수 있는 최대 사람의 수를 구하는 프로그램을 작성하시오. 모든 사람은 컵을 한 개만 들고 있고, 자신의 좌석의 양 옆에 있는 컵홀더에만 컵을 꽂을 수 있다.

S는 일반 좌석, L은 커플석을 의미하며, L은 항상 두개씩 쌍으로 주어진다.

어떤 좌석의 배치가 SLLLLSSLL일때, 컵홀더를 *로 표시하면 아래와 같다.

*S*LL*LL*S*S*LL*

위의 예에서 적어도 두 명은 컵홀더를 사용할 수 없다.

입력

첫째 줄에 좌석의 수 N이 주어진다. (1 ≤ N ≤ 50) 둘째 줄에는 좌석의 정보가 주어진다.

출력

컵을 컵홀더에 놓을 수 있는 최대 사람의 수를 출력한다.

예제 입력 1

3
SSS

예제 출력 1

3

예제 입력 2

4
SLLS

예제 출력 2

4

예제 입력 3

9
SLLLLSSLL

예제 출력 3

7

더보기

Solution

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

int main(void)
{
	int N, L_count=0;
	char *seat=NULL;

	scanf("%d", &N);
	seat=(char *)calloc(N+1,sizeof(char));

	scanf("%s", seat);

	for(int i=0;i<N;i++)
		if(seat[i]=='L')
		{
			i++;
			L_count++;
		}

	printf("%d\n", L_count==0?N:N+1-L_count);
	free(seat);
	return 0;
}
728x90

+ Recent posts