https://www.acmicpc.net/problem/1251
풀이
1. 3등 분으로 하기 위하여 문자열 범위 안에서 2개의 위치를 정해주어야 한다. 그래서 2중 for문을 사용하였다.
2. 범위를 지정하는 for문의 변수 i, j는 i와 j는 서로 같아도 안 되며, i<j또는 j<i 둘 중 하나만 탐색해주면 되기 때문에 if(i>=j) continue를 사용하였다.
3. 이렇게 되면 인덱스 0~i, i+1 ~ j, j+1 ~문자의 길이 len, 3개의 등분으로 구분이 가능하다. 이 범위에서 문자들을 앞뒤로 바꾸어주면 된다.
4. 여기서 가장 중요한 부분 같아. 사전순으로 가장 앞서있는 단어를 찾는 부분이다.
answer는 현재까지 사전순으로 앞서 있는 단어이다.
앞부터 비교하며 현재 찾은 것보다 사전순으로 큰 값이 먼저 나오면 사전순으로 늦은 문자라 return 0
큰 값이 늦게 나오면 사전 순으로 앞서는 것으로 판단하며 return 1을 리턴하여 answer 배열을 갱신해준다.
1 2 3 4 5 6 7 8 9 10 11 12 | int compare() { for (int i = 0; i < len; i++) { if (copy[i] < answer[i])//사전순으로 앞 섬 return 1; else if(copy[i] > answer[i]) return 0; } return 0; } |
제출 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include <stdio.h> #include <string.h> char arr[60], copy[60], answer[60]; int len; void COPY(char *, char *); void reverse(int x, int y); int compare(); int main() { scanf("%s",arr); len = strlen(arr); for (int i = 0; i < len; i++) answer[i] = 'a'+ 26; for (int i = 0; i < len-1; i++) { for (int j = i ; j < len-1; j++) { if (i >= j) continue; COPY(copy, arr); reverse(i, j); if (compare()) { COPY(answer, copy); } } } printf("%s\n",answer); return 0; } int compare() { for (int i = 0; i < len; i++) { if (copy[i] < answer[i]) return 1; else if(copy[i] > answer[i]) return 0; } return 0; } void COPY(char * C, char * Cod) { for (int i = 0; i < len; i++) C[i] = Cod[i]; } void reverse(int x, int y) { char temp; for (int i = 0; i < (x+1)/2; i++)// { temp = copy[i]; copy[i] = copy[x - i]; copy[x - i] = temp; } for (int i = 0; i < (y-x)/ 2; i++)// { temp = copy[x + 1 + i]; copy[x + 1 + i] = copy[y - i]; copy[y - i] = temp; } for (int i = 0; i < (len-y)/ 2; i++)// { temp = copy[y + 1 + i]; copy[y + 1 + i] = copy[len - 1 - i]; copy[len - 1 - i] = temp; } } | cs |
'SW 업무 관련 > 백준' 카테고리의 다른 글
[BEAKJOON] 2146_다리 만들기_C언어 (0) | 2017.09.08 |
---|---|
[BEAKJOON] 11559_puyo puyo(뿌요뿌요)_C언어 (0) | 2017.09.08 |
[BEAKJOON] 4948_베르트랑 공준_C언어 (0) | 2017.09.03 |
[BEAKJOON] 1063_킹_C언어 (0) | 2017.09.03 |
[BAEKJOON] 1932_숫자삼각형_C언어 (0) | 2017.08.30 |