PS 639

[백준 10799] 쇠막대기 [C]

풀이 입력된 괄호이후 막대기의 개수를 top라고 하고, 다음과 같은 조건에 의해 result에 막대기의 개수를 더해주면 된다. ')'이전에 '('가 입력되었으면, 쇠막대기가 아니라 레이저이므로 --top한 값을 result에 더해준다. 쇠막대기를 의미하는 ')'만 입력 되었으면, 쇠막대기의 끝 부분에 도달한 것 이기 때문에 1개만 더하고, 현재 막대기의 개수를 1개 감소시킨다. 소스코드 #include #define MAX 100001 int main(){ char stack[MAX]; int top = 0, result = 0; scanf("%s", stack); for (int i = 0; stack[i] != '\0'; i++) if (stack[i] == '(') top++; else{ if (i..

[백준 10798] 세로읽기 [C]

풀이 2중 배열을 통해 입력을 받고 row와 col의 증가 순서를 바꾸어 문자를 하나씩 출력하면 해결할 수 있다. 소스코드 #include int main(){ char str[5][15] = { 0, }; for (int row = 0; row < 5; row++) scanf("%s", str[row]); for (int col = 0; col < 15; col++) for (int row = 0; row < 5; row++) if (str[row][col] != '\0') putchar(str[row][col]); } 출처 10798번: 세로읽기 총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, ..

[백준 10797] 10부제 [C]

소스코드 #include int main(){ int num, car, cnt = 0; scanf("%d", &num); for (int i = 0; i < 5; i++){ scanf("%d", &car); num == car && cnt++; } printf("%d\n", cnt); } 출처 10797번: 10부제 서울시는 6월 1일부터 교통 혼잡을 막기 위해서 자동차 10부제를 시행한다. 자동차 10부제는 자동차 번호의 일의 자리 숫자와 날짜의 일의 자리 숫자가 일치하면 해당 자동차의 운행을 금지하는 www.acmicpc.net

[백준 8958] OX퀴즈 [C]

풀이 입력받은 문자열에서 'O'이면 1 증가시킨 temp를 sum에 더해주고, 만약 'X'가 나오면 temp를 0으로 초기화해 다음 'O' 가 나올 때 다시 1부터 더해줄 수 있도록 하면 된다. C99로 컴파일하기 때문에 조건연산자 사용에 주의해야 한다. 소스코드 #include int main() { char str[80], N; scanf("%d", &N); while (N--) { int temp = 0, sum = 0; scanf("%s", &str); for (int i = 0; str[i] != '\0'; i++) (str[i] == 'O') ? sum += ++temp : (temp = 0); printf("%d\n", sum); } } 출처 8958번: OX퀴즈 "OOXXOXXOOO"와 같..

[백준 3052] 나머지 [C]

풀이 입력받은 값을 42로 나누었을 때의 나머지를 저장해두고 비교해서 서로 다른 수가 몇 개인지 찾아내는 문제이다. 최선의 경우에는 1개이지만, 최악의 경우에는 42개가 나올 수 있다. 수를 입력받고 배열의 마지막 인덱스까지 탐색 했는데 동일한 수가 없다면, 새로 등록을 해주는 형식이다. 소스코드 #include int main(){ int arr[42], num, idx = 1; for (int i = 0; i < 10; i++){ scanf("%d", &num); num %= 42; if (!i) arr[0] = num; else for (int j = 0; j < idx; j++) if (arr[j] != num && j == idx - 1){ arr[j+1] = num; idx++; }else i..

[백준 2920] 음계 [C]

풀이 항상 1부터 8까지 8개의 수가 입력되고, 오름차순 또는 내림차순으로 정렬되어있는지 아닌지를 확인하면 된다. 때문에, 반복문 내의 변수 i값의 증가를 이용해 확인할 수 있다. ascending 또는 descending라면 입력된 수들의 처음과 끝수의 합이 항상 9 이다. 1 ~ 4번째 수가 i + 1과 동일하다면, ascending이다. (5~8번째 수의 쌍은 위 조건에서 만족한다.) 처럼 풀이하는게 문제의 출제의도이나, 입력되는 수들을 하나의 문자열로 생각하면 쉽게 해결할 수 있다. ??? : 숫자가 주어진다 했지 문자열이 아니라고는 안했다. 하지만, 이 방법은 비교할 문자열을 직접 작성 또는 생성을 해야 하므로 간결하면서도 무식한 방법이라고 볼 수 있다. 만약 숫자가 1부터 100이라면? 소스코..

[백준 10866] 덱 [C]

풀이 Deque(Double Ended Queue)는 Stack와 Queue의 특징을 모두 갖는 이중 연결 리스트(Doubly Linked List)의 구조이다. 쉽게말해 방향이 반대인 Stack 두개를 붙인 것과 같다. 역방향 Stack 0 1 " " " 4998 4999 front 정방향 Stcak 5000 5001 " " " 10000 10001 rear 역방향 Stack과 정방향 Stcak를 합치고, 중간 index(4999~5000)에서 front를 감소, rear를 증가시키는 방식으로 구현했다. 0 1 " " " 4998 4999 5000 5001 " " " 10000 10001 front rear 단, front와 rear이 일치하는 경우는 없다는 점에 유의하자. front + 1이 rear..

[백준 2884] 알람 시계 [C]

풀이 M이 45 이상일 때, 입력된 시간에서 45분만 빼면된다. M이 45 미만일 때, H가 1~24 일때 H -= 1이고, H가 0일때는 23으로 변경되어야 한다. 입력된 M의 값에 상관없이 60을 더하고 45을 뺀 값을 60으로 나누었을 때 나머지를 사용하면 짧게 표현할 수 있다. 소스코드 #include int main() { int H, M; scanf("%d %d", &H, &M); if (M < 45) H = (H != 0 ? H-1 : 23); printf("%d %d", H, (M+15) % 60); } 출처 2884번: 알람 시계 상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모..

[백준 2753] 윤년 [C]

풀이 윤년일 조건은 다음과 같다. year % 4 == 0 && year % 100 != 0 year % 400 == 0 윤년인지 아닌지의 조건에 따라 1(True), 0(False)를 출력하면 된다. &&와 || 는 우선 연산에 따라 계산되므로 따로 괄호를 할 필요는 없다. 소스코드 #include int main() { int year; scanf("%d", &year); printf("%d", !(year%4) && year%100 || !(year%400)); } 출처 2753번: 윤년 연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오. 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다. 예를 들어, 2012년은 4의 배수이면서 ww..