[문제]

Parenthesis String (PS) consists of two parenthesis symbols ‘(’ and ‘)’ only. In parenthesis strings, some strings are called a valid PS (shortly, VPS). Let us give the formal definition of VPS. A single “( )” is a member of VPS, called the base VPS. Let x and y be a member of VPS. Then “(x)”, a VPS which encloses a VPS x with a single pair of parenthesis, is also a member of VPS. And xy, the concatenation of two VPS x and y, is a member of VPS. For example, “(())()” and ((()))” are all VPS, but “(()(”, “(())()))” and “(()” are not VPS. You are given a set of PS. You should decide if the input string is VPS or not. 


[입력]

Your program is to read from standard input. The input consists of T test cases. The number of test cases T is given in the first line of the input. Then PS’s are given in the following T lines one by one. The length of each PS is between 2 and 50, inclusively.


[출력]

Your program is to write to standard output. Print the result in each line. If the input string is a VPS, then print “YES”. Otherwise print “NO”. 

 

백준에서 제시하는 입출력

 

 


몇 번이나 틀린 끝에 결국엔 성공한 코드.

중요한 부분은 char parenthesis[]의 방 크기를 50이 아닌 51(null문자까지 생각을 해야한다)로 하는 것이 좋다는 것.

 

또한, for문으로 for(int j=0; j<strlen(bracket); j++) 로 할 수도 있겠지만, 

while문으로  while(parenthesis[j]) 것이 더 좋을 수 있다는 것을 기억하자.

 

 

출처1: www.acmicpc.net/problem/9012

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

출처2: ICPC > Regionals > Asia Pacific > Korea > Nationwide Internet Competition > Daejeon Nationalwide Internet Competition 2012 G번

'코딩 문제풀이 및 연습 > [C언어]백준' 카테고리의 다른 글

[백준 6749번]Next in line  (0) 2021.03.17
[백준 2675번]문자열 반복  (0) 2021.03.16
[백준 2795번] Transactions  (0) 2020.09.05
[백준 2753번] 윤년  (0) 2020.09.05
[백준 2752번] 세 수 정렬  (0) 2020.09.05

[문제]

Whenever somebody goes to an ATM to withdraw or deposit money, a calculation has to be done to keep the person's bank balance correct. Your task in this problem is to do such calculations. There is a bank rule that says that a customer may not have an overdraft of more than $200, so any withdrawal that would take the balance below –200 must be stopped. (A minus sign is used to indicate an overdraft, or negative balance).


[입력]

Input consists of a number of lines, each representing a transaction. Each transaction consists of an integer representing the starting balance (between –200 and +10,000), the letter W or the letter D (Withdrawal or Deposit), followed by a second integer representing the amount to be withdrawn or deposited (between 5 and 400). Input will be terminated by a line containing 0 W 0.


[출력]

Output consists of one line for each line of input showing the new balance for each valid transaction If a withdrawal would take the balance below -200, the output must be the words ‘Not allowed’.

백준에서 제시하는 예졔 입출력

 


영어로 되어있어서 그렇지 문제 자체는 쉽다.

ATM기계에서 돈을 빼고 넣는 결과를 출력하는 문제이다.

시작값, W / D, 바뀔값, 결과값을 변수로 잡으면 될 것이다.

 

문제를 간단히 하면 다음과 같다. 

1. 0 W 0 이라는 값이 들어가면 프로그램이 종료되도록 한다.

2. W가 입력되면 시작값 - 바뀔값 = 결과값

3. D가 입력되면 시작값 + 바뀔값 = 결과값

4. 결과값이 -200보다 작을 경우, "Not allowed"라 출력되도록 한다.

 

 

출처: https://www.acmicpc.net/problem/2975

 

[문제]

연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오.

윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.

예를 들어, 2012년은 4의 배수이면서 100의 배수가 아니라서 윤년이다. 1900년은 100의 배수이고 400의 배수는 아니기 때문에 윤년이 아니다. 하지만, 2000년은 400의 배수이기 때문에 윤년이다.


[입력]

첫째 줄에 연도가 주어진다. 연도는 1보다 크거나 같고, 4000보다 작거나 같은 자연수이다.


[출력]

첫째 줄에 윤년이면 1, 아니면 0을 출력한다.

백준에서 제시하는 예제 입출력

 


최대한 짧게 코딩을 해보기 위해서 이번에는 노력했다.

원래라면 if문 안에서 &&와 ||를 if중춥문을 사용해서 일일이 했을 것이나,

이렇게 if문 한 개를 사용해서 만드는 것 또한 가능하다는 것을 알아두자.

 

출처: https://www.acmicpc.net/problem/2753

[문제]

동규는 세수를 하다가 정렬이 하고싶어졌다.

숫자 세 개를 생각한 뒤에, 이를 오름차순으로 정렬하고 싶어 졌다.

숫자 세 개가 주어졌을 때, 가장 작은 수, 그 다음 수, 가장 큰 수를 출력하는 프로그램을 작성하시오.


[입력]

숫자 세 개가 주어진다. 이 숫자는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 이 숫자는 모두 다르다.


[출력]

제일 작은 수, 그 다음 수, 제일 큰 수를 차례대로 출력한다.

백준에서 제공하는 예제 입출력

 


약간의 노가다와 시간이 오래 걸린다는 점이 있지만, 논리는 일단 맞다.

a, b, c가 각각 큰 경우에 따라서 나와야 하는 숫자의 정렬을 각각 출력하며,

a=b=c가 될 경우는 따로 else문으로 처리하였다.

출처: https://www.acmicpc.net/problem/2752

2444번_별찍기-7(피라미드데칼코마니)

2444번_별찍기-7(피라미드데칼코마니)


 

2445번_별찍기_8(나비모양)

2445번_별찍기_8(나비모양)


 

2446번_별찍기_9(모래시계)

2446번_별찍기_9(모래시계)

 

 

 

출처: https://www.acmicpc.net/workbook/view/20 백준 문제집: 별 찍기 中

 

2438번_별찍기_1(피라미드오른쪽)

2438번_별찍기_1(피라미드오른쪽)

 


 

2439번_별찍기_2(피라미드왼쪽)

2439번_별찍기_2(피라미드왼쪽)

 


 

2440번_별찍기_3(5-4-3-2-1)

2440번_별찍기_3(5-4-3-2-1)

 


 

2441번_별찍기_4(역순_5-4-3-2-1)

2441번_별찍기_4(역순_5-4-3-2-1)


 

2442번_별찍기_5(피라미드)

2442번_별찍기_5(피라미드)


 

2443번_별찍기_6(역피라미드)

2443번_별찍기_6(역피라미드)

 

 

 

출처: https://www.acmicpc.net/workbook/view/20 백준 문제집: 별 찍기 中

[문제]

세 정수 A, B, C가 주어진다. 이때, 두 번째로 큰 정수를 출력하는 프로그램을 작성하시오. 


[입력]

첫째 줄에 세 정수 A, B, C가 공백으로 구분되어 주어진다. (1 ≤ A, B, C ≤ 100)


[출력]

두 번째로 큰 정수를 출력한다.

 

백준에서 제시하는 예제 입출력


내가 푼 방식은 다음과 같이 각각의 숫자가 최댓값일 때로 나눠서 총 3가지의 경우의 수로 if~else문을 만들었다.

 

조금 노가다의 향이 나기는 한다...

 

출처: https://www.acmicpc.net/problem/10817

다음의 코드의 결과를 알아맞춰야 하는 문제이다.

구조체와 포인터의 이해가 필요한 문제이다

답:  6

 

답이 6으로 나오게 된 이유를 처음에는 다음과 같이 생각했다 (조금 틀린 생각이니 너무 자세히는 보지 말자).

(영어로 되어 있는 이유는 stackoverflow에 올리기 위해서 적은 부분이니, 이 부분은 감안해서 보면 된다.)

 

1. Due to struct node, num 3, 5, 6 are set into a, b, c in the num variable.

   (struct node에 의해 num 3, 5, 6은 각각 a, b, c에 할당된다)

2. *ptr points the start address of num due to struct node *ptr = &num; which means that it points to the address of the index = 0 which is 3 in {3, 5, 6}.

   (*ptr는 num의 시작주소를 가리키기 때문에 0번 index를 가르키므로 *(int)ptr 은 3을 출력할 것이다.)

3. Therefore,  printf("%d\n", *ptr); prints 3,

   (따라서, 만약 printf("%d\n", *ptr);가 있다면, 3이 출력이 될 것이고)

4. printf("%d\n", *((int*)ptr + 1 + (3-2))); is printing *(0+1+1) which is index = 2 of num which equals to 6.

   (printf("%d\n", *((int*)ptr + 1 + (3-2)));는 결국 *(0 + 1 + 1)이 되므로 2번 index인 6이 출력된다.)


이걸 이제 제대로 구조체를 사용해서 설명해야한다. 위의 index는 array(배열)에 사용하는 것이므로, 틀리기 때문에, 다음과 같이 설명해야 제대로 된 설명이라고 할 수 있다.

(다음 답변은 stackoverflow의 친절한 어느 답변자가 내 생각을 더 정확히 바꿔 설명해준 것이다)

1. Due to the initializer, 3, 5, 6 are set into a, b, c in the num variable.

   (3, 5, 6은 초기화되어 a, b, c의 num 변수에 할당된다)

2. *ptr points to the start address of num due to struct node *ptr = &num;, which is the same as the address of num.a.

   (*ptr = &num;에 의해 *ptr는 num의 시작주소를 가르키고, 이는 num.a의 주소와 똑같다.)

3. Therefore, printf("%d\n", *ptr); prints 3.

   (따라서, printf("%d\n", *ptr);가 있다면, 3이 출력된다)

4. (int*)ptr yields a pointer to num.a with the proper type.

   ((int*)ptr는 num.a를 int*로 type casting을 한다.)

5. Adding 2 to ptr means that we add the size of two ints to the address. Note that the typecast is very important, as we would've otherwise added the size of two struct nodes to the address; the effect of adding to a pointer depends on the pointer type.

   (ptr+2는 주소에 int size를 2개 더한다는 뜻이다. 참고로, typecast는 굉장히 중요하다. 그렇지 않았다면 struct node의 주소size 2개를 따로 더했어야 할 것이다)

6. The resulting address is the same as the address of num.c. At that address, we find the integer value of 6.

   (결과값의 주소는 결국 num.c의 주소와 같다. 따라서 결과값은 6이 되는 것이다.)

 

참고로, 구조체의 경우 메모리상 주소지는 연속할당 된다는 특성 때문에 주소이동이 가능한 것이다.

 

문제출처: https://www.sololearn.com/
설명출처: https://stackoverflow.com/questions/63543259/how-the-struct-and-pointer-acts/63543401#63543401

[문제]

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.

예를 들어, 서로 다른 9개의 자연수

3, 29, 38, 12, 57, 74, 40, 85, 61

이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

[입력]

첫 째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.

[출력]

값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.

백준에서 제시하는 예제 입출력


처음에는 다음과 같은 코드를 작성했다.

이렇게 하면 원하는 결과값이 나오지 않는다.

위의 코드의 문제점은 line13에 i+1을 출력한 것이다.

이렇게 되면 i는 max값이 몇 번째인지를 출력하기보다는 for문을 통해 (총 반복한 횟수)+1이 출력되므로 항상 10(9번+1)이 출력된다.

 

따라서 올바르게 if문의 i를 카운트하기 위해서 다음과 같이 코드를 작성해야 한다.

cnt로 몇 번째인지 저장한다.

 

간단한 구현 문제이다. 정확히 어떤 반복문 안의 변수를 출력해줄 것인지 아는 것이 중요하다.

다음의 코드의 결과를 알아맞춰야 하는 문제이다.

답: SoloLearn SoloLearn (배경을 다르게 해보아라.. 보일 것이다)

 

 

틀린 이유는 내가 제대로 함수포인터를 아직 이해하지 못했기 때문이다.

흔히 생각하는 () 연산자를 통해 함수를 호출하는 것을 생각하여 위의 코드에서 

void(*bar)() = foo;

에서

foo() 가 되어야 하는 줄 알았다.

 

이 참에 공부를 좀 해보자.

 

함수포인터(function pointer)란 함수의 주소를 저장하는 변수다.

https://dojang.io/mod/page/view.php?id=592 (코딩도장)에서 아주 깔끔하게 정리되어 있다 

 

따라서, bar에 foo함수를 할당한다. 다음과 같이 말이다.

 

(*bar)(); 이나 bar();이나 같은 표현이기 때문에 foo()는 2번 수행이 된다.

 

문제출처: https://www.sololearn.com/ 中

+ Recent posts