검색결과 리스트
2011/04에 해당되는 글 20건
- 2011.04.29 문자열 조작함수 직접 구현하기 (2)
- 2011.04.29 Objective-C 문자열 조작 메서드
- 2011.04.29 NSNotification (1)
- 2011.04.26 노력해서 공부하고 계신가요?
- 2011.04.26 프로그래밍 문제 접근법
- 2011.04.26 BlackBerry Architecture
- 2011.04.25 [Ubuntu] DNS 설정
- 2011.04.25 경제학의 10가지 기본원칙
- 2011.04.25 Wget
- 2011.04.25 [Vi] Vi 사용하기
글
문자열 조작함수 직접 구현하기
string.h 에서 지원하는 문자열 조작 함수들을 직접 구현해보았다. 이 함수들은 이름에 'str' 이라는 접두어를
1. 문자열 함수들의 프로토 선언과 기능
- // 문자열 s의 길이를 반환하는 함수
int strlen(char *s);
// s에 문자열 t를 복사하는 함수- void strcpy(char *s, char *t);
- // 두 문자열을 비교하는 함수 : 같으면 0, 앞문자열이 크면 양수, 작으면 음수반환
- int strcmp(char *s, char *t);
// 문자열 dest의 끝에 src 문자열을 연결하는 함수
- char *strcat(char *dest, const char *src)
- // 문자열 string에서 문자 c를 찾아 위치를 반환하는 함수. 없으면 NULL 반환
- char *strchr(const char *string, int c);
- // 문자열 string의 끝에서부터 문자 c를 찾아 위치를 반환하는 함수. 없으면 NULL 반환
- char *strrchr(const char *string, int c);
- // 문자열 string에서 문자열 strSearch를 찾아 첫번째 위치를 반환. 없으면 NULL 반환
- char *strstr(const char *string, const char *strSearch);
- // 문자열 string에서 strCharSet문자열에 속한 문자가 발견되면 그 위치를 반환. 없으면 NULL 반환
- char *strpbrk(const char *string, const char *strCharSet);
- // 문자열 str에서 delims 문자열에 속한 문자를 구분자로 분리해주는 함수. 첫번째 호출후
- // NULL 을 주어 호출하면, 기존 문자열에서 계속 구분자를 기준으로 분리해서 반환해줌// 원 문자열을 변경하기 때문에 원치않다면 원문자열의 복사본을 사용해야 한다.
- char *strtok(char *str, const char *delims);
2. 문자열 조작 함수의 구현
#include <string.h>
int my_strlen(char *s);
void my_strcpy(char *s, char *t);
int my_strcmp(char *s, char *t);
char *my_strcat(char *dest, const char *src);
char *my_strncat(char *dest, const char *src,size_t count);
char *my_strchr(const char *string, int c);
char *my_strrchr(const char *string, int c);
char *my_strstr(const char *string, const char *strSearch);
char *my_strpbrk(const char *string, const char *strCharSet);
char *my_strtok(char *str, const char *delims);
int main (int argc, char const* argv[])
{
char dest[1024] = "nice to meet you!";
char *test = "my name is kimsungbae! what's up?";
char *token;
printf("strchr : %s \n", strchr(test, '!'));
printf("my_strchr: %s \n", my_strchr(test, '!'));
printf("\n");
printf("strrchr : %s \n", strrchr(test, '\''));
printf("my_strrchr: %s \n", my_strchr(test, '\''));
printf("\n");
printf("strstr : %s \n", strstr(test, "is"));
printf("my_strstr: %s \n", my_strstr(test, "is"));
printf("\n");
printf("my_strcat : %s \n", my_strcat(dest, test));
printf("my_strncat: %s \n", my_strncat(dest, "@@@@@@@@", 2));
printf("\n");
printf("strpbrk : %s \n", strpbrk(test, "?!\'"));
printf("my_strpbrk : %s \n", my_strpbrk(test, "?!\'"));
token = my_strtok(dest, " ");
printf("%s \n", token);
while ((token = my_strtok(NULL, " ")) != NULL) {
printf("%s \n", token);
}
return 0;
}
int my_strlen(char *s) {
char *p = s;
while (*p++ != '\0');
return p - s;
}
void my_strcpy(char *s, char *t) {
while (*s++ = *t++) ;
}
int my_strcmp(char *s, char *t) {
for (; *s == *t; s++, t++) {
if (*s == '\0') {
return 0;
}
}
return *s - *t;
}
char *my_strcat(char *dest, const char *src) {
char *p_dest = dest;
while (*p_dest != '\0') {
p_dest++;
}
while (*src != '\0') {
*p_dest++ = *src++;
}
*p_dest = '\0';
return dest;
}
char *my_strncat(char *dest, const char *src,size_t count) {
char *p_dest = dest;
while (*p_dest != '\0') {
p_dest++;
}
while (*src != '\0' && count > 0) {
*p_dest++ = *src++;
count--;
}
*p_dest = '\0';
return dest;
}
char *my_strchr(const char *str, int c) {
while (*str != '\0') {
if (*str == c) {
return str;
}
str++;
}
return NULL;
}
char *my_strrchr(const char *str, int c) {
char *p_str = str + strlen(str) - 1;
while (p_str > str) {
if (*p_str == c) {
return p_str;
}
p_str--;
}
return NULL;
}
char *my_strstr(const char *str, const char *search) {
char *start = NULL;
while (*str != '\0') {
if (start != NULL && *search == '\0') {
break;
}
if (start != NULL && *str != *search) {
start = NULL;
}
if (start == NULL && *str == *search) {
start = str;
}
if (start != NULL && *str == *search) {
search++;
}
str++;
}
return (start != NULL) ? start : NULL;
}
char *my_strpbrk(const char *str, const char *charset) {
char *p_char;
while (*str != '\0') {
p_char = charset;
while (*p_char != '\0') {
if (*str == *p_char++) {
return str;
}
}
str++;
}
return NULL;
}
char *my_strtok(char *str, const char *delims) {
static char *tmp, *pstart;
char *p_delims;
if (str != NULL) {
tmp = str;
}
if (*tmp == '\0') {
return NULL;
}
pstart = tmp;
while (*tmp != '\0') {
p_delims = delims;
while (*p_delims != '\0') {
if (*tmp == *p_delims++) {
*tmp++ = '\0';
return pstart;
}
}
tmp++;
}
return pstart;
}
'언어로그 > C/C++' 카테고리의 다른 글
| 과제 #1 입출력,연산자 (0) | 2011.06.13 |
|---|---|
| 음수의 표현 (0) | 2011.06.13 |
| 문자열 조작함수 직접 구현하기 (2) | 2011.04.29 |
| 라인 입출력 함수 (0) | 2011.03.27 |
| 배열의 이해 (0) | 2011.03.27 |
| 기억부류(Storage Class) / 변수 (0) | 2011.03.27 |
설정
트랙백
댓글
글
Objective-C 문자열 조작 메서드
Objective-C 문자열 조작 메서드 중 몇가지에 대해서 알아보자.
문자열 비교시 결과값을 위해 다음과 같은 enum 상수가 선언되어 있다.
enum {
NSOrderedAscending = -1,
NSOrderedSame,
NSOrderedDescending
};
typedef NSInteger NSComparisonResult;
NSOrderedDescending은 좌측의 피연자가 우측의 피연자보다 크다는 것을
NSOrderedSame은 좌우측의 피연산자가 같다는 것을 나타낸다.
다음은 문자열에 포함된 특정 문자열이나 NSArray 안에 특정 Object와 같이 범위를 지정하기 위해 사용되는 구조체이다.
typedef struct _NSRange {
NSUInteger location; // start index
NSUInteger length; // location 위치부터의 길이
} NSRange;
typedef double NSTimeInterval;
이름만을 보고도 충분히 그 의미를 알수 있기 때문에 메서드에 대한 설명은 생략하겠다. (-_-;;)
- (NSComparisonResult)compare:(NSString *)aString - (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString - (BOOL)isEqualToString:(NSString *)aString - (BOOL)hasPrefix:(NSString *)aString
문자열 접합
- (NSString *)stringByAppendingString:(NSString *)aString - (NSString *)stringByAppendingFormat:(NSString *)format ...
- (NSString *)substringToIndex:(NSUInteger)anIndex - (NSString *)substringFromIndex:(NSUInteger)anIndex - (NSString *)substringWithRange:(NSRange)aRange
- (NSRange)rangeOfString:(NSString *)aString - (NSRange)lineRangeForRange:(NSRange)aRange
- (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
- (NSString *)capitalizedString - (NSString *)lowercaseString - (NSString *)uppercaseString - (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding - (const char *)cStringUsingEncoding:(NSStringEncoding)encoding
- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator - (NSArray *)componentsSeparatedByString:(NSString *)separator
'Objective-C' 카테고리의 다른 글
| Objective-C 문자열 조작 메서드 (0) | 2011.04.29 |
|---|---|
| 다중인자를 갖는 PerformSelector 메시지 (0) | 2011.03.23 |
| Protocol 과 Category (0) | 2011.03.22 |
| Objective-C 훑어보기 (2) | 2011.03.20 |
| [Cocoa] Cocoa Design Pattern (0) | 2011.03.20 |
| HMAC-SHA1 구현 (0) | 2011.03.03 |
설정
트랙백
댓글
글
NSNotification
Cocoa 와 Cocoa Touch 프레임웍의 이벤트 통지 메커니즘인 NSNotification 에 대해서 간략하게 알아보자.
1. NSNotification 이란?
집중화시켜서 서로 간에 결합도를 느슨하게 할 수 있다. NSNotificationCenter, NSNotification, Observer 로 구성된다.
NSNotificationCenter는 객체들 사이에 이벤트 전달을 중계하는 역할을 하며, Observer는 이벤트가 발생하기를 기다리는 대상을
나타낸다. Observer 가 기다리는 이벤트에 대한 정보와 부가적인 데이터를 전달하기 위한 객체가 Notification 이다.
Notification 사용예
있던지 이벤트를 수신하는 클래스에서는 연쇄적으로 Notification을 다음화면으로 전달하여 (화면1 > 화면2 > 화면3) 의 순서를 유지하며 화면 전환을 할 수 있다. (화면1 > 화면3으로 바로 전환해버리면 네비게이션 순서가 틀어져버림)
사용하면 클래스간에 참조를 가지고 있지 않아도 데이터를 쉽게 전달할 수 있다.
② Notification 포스팅
④ NSNotificationCenter 에서 Observer 와 Notification 제거
NSNotificationCenter *notifCenter = [NSNotificationCenterdefaultCenter];
[notifCenter addObserver:self
selector:@selector(viewTrasitionToMyLostArticleList:)
name:@"moveToPushList" object:nil];
에러가 발생한다.
(void)viewTrasitionToMyLostArticleList:(NSNotification*)notif {
NSString *pushSeq = [[notif userInfo] objectForKey:@"pushSeq"];
// 의심분실물 목록뷰로 전환
}
2.3 이벤트 발생시키기
* Notification을 직접 생성하여 전달 - 데이터 전달이 필요없을 경우
(void)postNotification:(NSNotification*)notification;
* 부가적으로 전달해야할 데이터가 있을 경우 사용
(void)postNotification:(NSString*)notificationName
object:(id)anObject
userInfo:(NSDictionary*)userInfo
2.4 등록된 observer와 Notification 제거
// notificationObserver와 동일한 참조의 모든 observer를 제거
(void)removeObserver:(id)notificationObserver
// 송신자가 notificationSender로 등록된 notificationName으로 등록된 모든 observer 제거
(void)removeObserver:(id)notificationObserver
name:(NSString *)notificationName
object:(id)notificationSender
'아이폰' 카테고리의 다른 글
| [번역] 사용자 인터페이스 설계의 원리 (0) | 2012.06.24 |
|---|---|
| 수동으로 UI 컨트롤에 이벤트 전달 (0) | 2011.11.13 |
| NSNotification (1) | 2011.04.29 |
| 푸시 메시지 포맷 (0) | 2011.04.07 |
| 애플 푸시 서비스 (0) | 2011.04.07 |
| Sprite Sheet 제작툴 Zwoptex (0) | 2011.03.16 |
설정
트랙백
댓글
글
노력해서 공부하고 계신가요?
요 몇달 동안 고민하느라 노력하는 것을 게을리 했다. 물론 생각을 많이 할 수 있는 시간들었기에 아쉽지는 않다.
이제 구체적인 목표를 잡고 다시 공부에 매진할 때인 듯하다
마지막 부분 "상대방에 대한 5분의 생각" 구문이 특히 마음에 든다 ㅎ
고승덕 변호사
나는 외모에 컴플렉스가 있다.
아시겠지만, 대학교 때 고시 3개를 합격했다.
사법고시 합격, 외부고시 2등, 행정 고시 1등.
그리고 서울대 법대를 수석 졸업했다.
학교 졸업 후 부모님께 큰 절을 했었다. 똑똑한 머리를 물려줘서가 아니라, 사실은 변변찮은 외모덕에 그저 고시에만 전념할 수 있게 해줬기 때문에 감사하다는 의미로.
내 직업은
1. 변호사이면서
2. 방송도 하고
3. 책을 쓰고 있다. 평생 소원이 1년에 1권씩 평생 책을 내는 것이다.
4. 글도 쓴다. 모 신문사에 경제기사를 1주일에 2개정도 쓴다.
5. 또 오늘과 같은 특강도 한다. 평균 1주일에 2회 정도
6. 증권분야에서도 활동하고 있다. 운영하고 있는 사이트가 있는데 회원수만도 3만5천명 정도 된다.
나름대로 홈페이지 관련 사업을 하나 구상 중인 것도 있다.
7. 마지막으로 대학에서 겸임교수로 활동하고 있다.
이처럼 내가 하고 있는 일이 무척 많은 것 같고,
어떻게 이걸 다 할까 생각이 들겠지만 다 가능하다.
이 중에서 한가지만 하더라도 힘들다고 하는 사람이 많다.
그러나 가능하다고 생각하면 다 가능하다.
무엇이든지 목표가 중요하며,
그 목표 달성을 위해 가장 중요한 것은 확신이다.
사람들은 어려운 일일수록 확신을 갖지 못한다.
인생에 있어 2가지 자세가 있다.
보통 사람들은 남보다 적게 노력하고 결과는 남들과 같은 똑같이 나오게 하려고 한다. 사실은 이것이 경제학 법칙에 맞는 것이다. 투입을 적게하고 효과를 많이 내는 것.
반대로, 다른 사람들 만큼의 결과를 얻기 위해서는 더 많은 노력을 해야 한다고 생각할 수 도 있다. 나의 경험상으로 보면 후자가 훨씬 좋은 결과를 낳는다.
남보다 노력을 더 많이 해서 비슷한 결과를 가져 오는 것이 비효율적인 것 같지만, 실제로 이것은 어느 시점이 지나면 훨씬 더 좋은 결과를 가져온다.이것이 내가 인생을 살면서 내 스스로 내린 결론이다.
그럼 노력이란 무엇이냐?
나는 "노력이란 성공의 확률을 높이는 것이다."라고 정의 내린다.
하지만 물론 결과를 반드시 보장하지는 않는다.
노력에도 함수 관계가 성립한다.
* 노력 = f(시간 X 집중)
내가 실제 노력을 했는가 안했는가를 판단하려면
시간을 많이 투입했거나 집중을 잘했거나 살펴보면 된다.
똑같은 일을 하더라도 3시간만에 끝내는 사람이 있는가 하면 5시간만에 끝내는 사람도 있다. 그러나 3시간만에 끝내는 사람이 실제 일을 더 잘하는 것 같지만 나머지 2시간을 어떻게 보내느냐가 중요하다.
더 많이 알기 위해 그 2시간을 투자하지 않았다면 노력하지 않은 것이다.
짧은 시간을 비교해 보면 노력을 적게하고, 많이 하는 것이 결과만 보면 거의 미미하다고 할 수 있다. 그러나 그 순간을 이겨내면 주식처럼, 가속도가 붙기 시작하면서 그 차이는 엄청나다.
집중에 대해서 얘기해 보면, 고시 공부할 때 예를 들어 보겠다.
나는 고시 공부를 1년간 해서 합격했다. 어떻게 가능 했느냐?
첫째는 된다고 생각하는 확신이 있었기 때문이고,
둘째는 남보다 더 많은 노력을 했기 때문이다.
보통 고시에 합격하려면, 봐야 할 책이 50권, 권당 페이지는 500p.
그 책을 5번을 봐야 합격한다는 얘기가 있다.
그러나 나는 7번을 봤다. 이를 계산해보면,
50 X 500 X 7 = 175,000 페이지를 읽어야 한다는 얘기다.
이것을 1년을 360일로 계산해보면 1일 목표량이 나온다.
즉, 1일 500페이지 정도의 분량을 봐야 한다는 것이다.
이처럼, 목표를 세울때는 구체적으로 세워야 한다.
막연한 목표는 달성하기 힘들다.
이 결론을 보면 "인간이 할 짓이 아니다"라고 생각할 것이다.
누구나 그렇게 생각한다.
그렇게 생각하면 사람들은 포기하게 된다.
설사 하게 되더라도 하다가 흐지부지 된다.
이렇게 목표에 대해 확신이 없고,
목표를 의심하는 사람은 집중을 할 수 없다.
무엇보다도 자신의 목표에 확신을 가져라.
된다는 사람만 되고 안된다고 생각하는 사람은 안된다.
일단 안 된다고 생각하는 대부분의 85%의 사람들은 이미 나의 경쟁상대가 아닌 것이다. 된다고 생각하는 일부만 나의 경쟁이 된다. 그럼 경쟁대상이 줄어드니 훨씬 마음도 한결 가벼워진다.
세상도 절대적으로 잘하는 사람은 원하지도 않고 필요하지도 않다. 남 보다만 잘하면 된다. 그럼, 다른 사람보다 잘하고 있는지를 어덯게 판단하느냐? 그것은 나 자신을 판단 기준으로 삼으면 된다.
인간은 거의 비슷하다. 내가 하고 싶은 선에서 멈추면 남들도 그 선에서 멈춘다. 남들보다 약간의 괴로움이 추가되었을 때라야 비로소 노력이란 것을 했다고 할 수 있다.
고시 공부할 때 7시간 잤다. 장기간 공부를 해야할 경우라면 일단 잠은 충분히 자야한다. 하루 24시간 중 나머지 17시간이 중요하다. 고시생의 평균 1일 공부시간은 10시간 정도다.
그러나 정말 열심히하는 사람은 잠자는 시간빼고 17시간을 하는 사람이 있을 것이다라는 생각을 했다.
그러면 정말, 밥먹는 시간도 아까웠다. 남들과 똑같이 먹어서는 안된다고 생각한 것이다. 반찬 떠 먹는 시간도 아까웠다.씹는 시간도 아까웠다. 그래서 모든 반찬을 밥알 크기로 으깨어 밥과 비벼 최대한의 씹는 시간도 아꼈다. 숟가락을 놓는 그 순간부터 공부는 항상 계속 되어야했다. 나의 경쟁자가 설마 이렇게까지 하겠냐하고 생각들면 노력했다고 할 수 있는 것이다.
미국에서 생활할 때 보면 소위 미국의 전문가라고 하는 사람들은 간단한 샌드위치로 끼니를 때운다. 점심시간 1시간 다 쓰고, 이래저래 20~30분 또 그냥 보내는 우리나라 사람들은 그들에 비하면 일 하는게 아니다.
집중을 잘 하는 것은 벼락치기 하는 것이다. 벼락치기 할 때가 더 기억에 오래 남는다고 한다. 우등생은 평소에 벼락치기 하는 마음으로 공부를 한다.
이렇게 할 수 있는 이유는 목표가 분명하기 때문이다.
막연한 목표를 가지면 이렇게 긴장이 안되지만 분명하면 항상 긴장되고 집중을 잘 할 수 있다.
방송하면서 인생이 많이 바뀌었다.
처음 주변 사람들은 말렸지만 결과적으로 보면 좋은 결과를 가져왔다.
나는 세상을 살면서 이런 생각을 해본다.
사람은 해야 할 일과 하지 말아야 할 일이 있다. 사람이 해야할 일이란 남에게 해을 끼치는 일이 아니면 해도 되는 일이다 라고 생각한다. 그렇게 생각하면 세상에 해야 할 일이 참 많다.
인생에서 내가 할 수 있는 일들을 쌓아 가면 된다. 하다가 안되면 포기하더라도 아예 안하는 것보다는 낫다. 아예 하지 않으면 할 수 있는 일은 아무 것도 없다.
나의 징크스는 시험에 합격하려면 10번을 봐야 하는 것이다 .그래야 합격의 확신을 갖는다. 3~4번만 보면 불안하다. 그래서 그냥 뭐든지 기본적으로 10번을 본다. 몇 번 3~4번 책을 보고 시험을 본 적 있다. 역시 떨어졌다.
앞으로는 이렇게 해보자.
첫째는 남보다 많이 노력하는 것이다.
둘째는 어려운 목표일수록 확신을 가져보자.
그러면 정말 되는 일이 훨씬 많다.
셋째는 남보다 최소 3배는 해야한다고 생각하자.
직장에서 윗사람이 일을 시킬 때 남보다 더 많은 일을 시키고, 나한테만 어려운 일을 시키더라도 신나는 표정을 지어보자. 대부분의 사람, 아니 나의 경쟁자는 이럴 때 얼굴을 찌푸릴 것이다.
그러나 내가 이기려면 그들 보다는 다른 모습이어야 한다.
힘들더라도 괴로움을 추가해 보자.
남들에 비해 노력한 만큼의 결과가 나오지 않더라도 노력을 계속해야 한다. 3배의 노력만 한다면 4번째부터는 분명 가속도가 붙어 급속도로 차이가 날 것이다.
마지막으로 대인관계에 대해 강조하고 싶다. 세상을 살다보면 대인관계를 유지하는 것도 노력이다. 성공을 위해서는 나 혼자의 노력 외에 대인관계가 차지하는 비중이 높은 경우가 있다.
어떤 상대를 만나든 최소 5분은 상대방을 위해 생각하는 시간으로 할애해 보자.
남과 똑같이 해서는 절대 노력했다고 할 수 없다.
[출처] 노력해서 공부하고 계신가요? (자바(java)초보스터디) |작성자 메드천사
'생각로그' 카테고리의 다른 글
| 호감주는 말하기 (0) | 2012.03.01 |
|---|---|
| 건강한 심리 (0) | 2012.02.19 |
| 위험에 뛰어드는 사람만이 진정으로 자유롭다. (0) | 2012.01.25 |
| 고집불통 프로래머가 되지 않기 위한 10가지 방법 (0) | 2011.06.16 |
| 노력해서 공부하고 계신가요? (0) | 2011.04.26 |
| [안철수 특강] 무엇이 성공을 이끄는가? (0) | 2011.03.01 |
설정
트랙백
댓글
글
프로그래밍 문제 접근법
답이 보이지 않는 상황에서 문제를 어떤 식으로 해결하는지를 살펴보기 위한 문제들도 있으니 긴장은 하지말자!
1. 절차
1.1 시나리오
코딩문제는 인터뷰어와 일대일로 진행하는 것이 일반적.
종이와 펜을 코드를 작성하라고 한다거나, 전에 문제를 설명해보라고 할 수 있다.
1.2 문제
짧은 시간안에 설명까지 할수 있어야 하기 때문에, 변별력 있는 적당히 어려운 문제가 출제된다.
(실전에 직접 적용할 수 있는 코드를 만드는 문제가 나올 가능성은 희박함)
문제의 난이도는 대체로 점점 어려워지는 순서로 배치된다
1.3 어떤 언어를 선택할 것인가?
일반 프로그래밍 또는 개발업무를 지원했다면 C#, Java, C++, C 같은 주류 언어를 제대로 쓸수있는 정도면 됨
인터뷰를 하러 가기 전에 자신이 사용할 모든 언어의 사용법 및 문법을 제대로 숙지해야함
(C++ 프로그래밍을 마지막으로 건드려본지 몇년 지났다면 적당한 C++ 레퍼런스 가이드를 펼쳐 중요한 내용 체크!)
1.4 의사소통의 중요성
자신이 사용할 언어를 가다듬고 가능하면 가장 좋은 코드를 만들자.
인터뷰어가 정말로 원하는 것은 지원자가 문제를 푸는 각 단계들을 어떻게 진행하는지 보는 것임
지속적으로 무슨일을 하고 있는지 설명하도록 하자
2. 문제해결
인터뷰 문제를 해결하는 조직적인 방법을 알아보면,
- 문제를 이해하지 못했을 경우 주저하지 말고 인터뷰어에게 문제에 대한 질문을 해야함
2) 일단 문제를 이해하고 나면 몇 가지 예를 들어본다
- 예를 시도하다보면 문제를 어떻게 풀어야 할지 감을 잘을 수도 있다.
3) 문제 풀이에 사용할 알고리즘에 초점을 맞춘다
- 보통 이 과정은 시간이 오래 걸리는 단계임. 부담을 가지지 말고, 인터뷰어와 대화를 통해 무엇을 하고 있는지를 보여줘야함
4) 알고리즘과 구현 방법을 알아내고 나면 인터뷰어에게 풀이를 설명한다.
5) 코딩을 할 때도 뭘 하고 있는지 설명한다.
- 조용히 코드만 적는 방법은 그리 좋지 않다.
6) 필요하다면 질문을 한다
7) 코드를 완성하고 나면 바로 몇 가지 예를 시도해 보고 맞는지 확인한다
8) 모든 오류 및 특별 케이스, 특히 경계 조건을 확인한다
=> 코드가 제대로 만들어졌다는 판단이 들면 인터뷰어가 코드에 대한 질문을 몇 가지 던질 것이다.
보통 이런 추가 질문에는 실행시간이나 또 다른 구현 방법, 복잡도 등에 초점을 맞춘다
2.1 문제를 풀다가 막히는 경우
인터뷰어는 문제에 대한 답을 바로 알아낼 수 없는 경우에 지원자가 어떤 식으로 반응하는지를 살펴보고 싶어하기 마련.
문제를 풀다가 갑자기 막히게 됐을 때 포기하거나 좌절하는 것은 최악의 대응책이다.
계속해서 흥미를 보이고 풀려고 시도하는 모습을 보이자
* 예를 다시 따져본다
- 특정 예에서 일반적인 경우로 확장을 해보고 그로부터 풀이를 도출해보자.
* 다른 자료 구조를 사용해 시도해 본다.
* 언어에서 그리 많이 쓰이지 않는 기능 또는 고급 기능을 고려해 보자.
- 다른 자료구조, 언어ㄱ의 고급 기능이 문제 풀이의 핵심이 되는 경우도 있다.
3. 풀이 분석
(입력의 개수 n이 매우 큰 경우의 실행시간인 점근적인 실행시간을 따지기 때문에 상수항은 무시함
(n이 매우 커질 때 가장 큰 항만 남기고 다른 항은 무시함)
3.2 빅 오 분석법을 적용하는 방법
2) 알고리즘에서 수행해야 할 연산 횟수를 n의 식으로 표현한다
3) 차수가 제일 높은 항만 남긴다
4) 모든 상수 인수를 없앤다
때론 최선 케이스, 평균 케이스, 최악 케이스의 실행 시간을 따져봐야 하는 문제도 생김.
'알고리즘.데이터구조' 카테고리의 다른 글
| [알고리즘] 알고리즘 글 목록 (0) | 2013.07.08 |
|---|---|
| 프로그래밍 문제 접근법 (0) | 2011.04.26 |
| 원 위에 나열된 수 제거하기 (0) | 2011.03.23 |
| 합병정렬(Merge Sort) (0) | 2011.03.23 |
| HMAC-SHA1 (0) | 2011.03.11 |
| 문제5 그래픽편집기 (0) | 2011.02.18 |
설정
트랙백
댓글
글
BlackBerry Architecture
이외에도 MDS (Mobile Data System) Device 소프트웨어는 무선 네트웍을 통해 BlackBerry Enterprise Server 의 MDS
서비스와 통신하는 역할을 담당한다.
1. BlackBerry MDS(Mobile Data System) 란?
MDS는 애플리케이션 개발을 위한 프레임웍으로, 기업용 애플리케이션들을 추가하고 관리하는데 사용된다.
BlackBerry Enterprise Server 컴포넌트 중 하나로, 보안과 무선연결, 관리 옵션들을 제공한다.
무선통신 애플리케이션을 좀더 쉽게 개발하고, 블랙베리 디바이스에 배포할 수 있는 방법을 제공한다.
기본 애플리케이션 및 시스템과 무선통신 애플리케이션 통합의 단순화를 위해 MDS는 표준에 근거한
프로토콜과 방법을 사용한다.
MDS의 구성요소들을 간략히 알아보자.
1.1 BlackBerry MDS Services
① BlackBerry MDS Integration Service
MDS 애플리케이션과 웹서비스나 DB 연결을 사용하는 종단시스템 간의 통신에 사용된다.
BlackBerry Enterprise Server 설치시 설치된다
② BlackBerry MDS Connection Service
BlackBerry Browser와 Java 애플리케이션으로 부터의 웹컨텐츠 요청을 처리한다.
1.2 BlackBerry MDS 개발도구 : www.blackberry.com/developers 를 참고하자.
1.3 BlackBerry MDS device software
① MDS Runtime 애플리케이션을 실행하기 위한 BlackBerry MDS Runtime.
② Java Application 을 실행하기 위한 BlackBerry APIs 와 Java ME 개발킷.
③ Browser Application을 실행하기 위한 BlackBerry Browser
위에서 언급한 각각의 BlackBerry Application에 대해 좀더 자세히 알아보자.
자바 애플리케이션은 BlackBerry Administration Service를 사용해서 Device에 설치되며, MDS Runtime 애플리케이션과 Browser 애플리케이션은 BlackBerry MDS Application Console 통해 설치된다
(일반적으로 클라이언트가 애플리케이션 서버에 데이터를 요청하고 받는 것과 같이)
개발자들은 블랙베리 자바 애플리케이션을 이클립스상에서 JDE 플러그인 또는 third-party 툴을 사용하여 개발 할 수 있다. (www.blackberry.com/developers. 참고하자.)
BES의 컴포넌트인 BlackBerry Integration Service를 통해, 기업시스템과 통신할 수 있으며, 웹서비스와 데이터베이스에
액세스 하는데 사용될 수 있는 폼 기반 애플리케이션이다. 웹서비스와 데이터베이스는 MDS Runtime Application에서
사용할 수 있는 데이터와 오퍼레이션을 포함하며, MDS Runtime Application으로부터 수신한 데이터를 처리한다
2.3 BlackBerry Browser Applications
개발자는 BlackBerry 템플릿과 표준 웹개발도구를 사용해서 Browser Application을 작성할 수 있다. MDS Integration
Service는 특정 웹주소에서 변경사항과 업데이트를 검사할 수 있는 Push Engine을 포함하고 있어, 개발자가 명시한 시간
간격으로 블랙베리 디바이스에 웹컨텐츠를 push 할 수 있다.
'앱개발로그' 카테고리의 다른 글
| [Android] 안드로이드앱 개발 도전기 (2) | 2013.03.31 |
|---|---|
| 2011년 스마트폰 사용자 통계 (0) | 2012.11.12 |
| BlackBerry Architecture (0) | 2011.04.26 |
설정
트랙백
댓글
글
[Ubuntu] DNS 설정
/etc/resolv.conf 파일을 편집하여 DNS 서버의 아이피 주소를 변경할 수 있으며, 최대 3개의 DNS 주소를 설정할 수 있다.
파일에 명시한 순서대로 IP 주소를 알아내기 위해 해당 서버에 요청하는 것에 주의하자.
sudo vi /etc/resolv.conf
$ host yahoo.com $ nslookup google.com $ ping nixcraft.in
'운영체제로그 > Linux' 카테고리의 다른 글
| [Ubuntu] DNS 설정 (0) | 2011.04.25 |
|---|---|
| Wget (0) | 2011.04.25 |
| 리눅스 자격증 (0) | 2011.04.09 |
| 리눅스 파일시스템 계층 표준(Filesystem Hierarchy Standard) (0) | 2011.03.09 |
| su, sudo : 특정 사용자 권한으로 쉘/명령 실행 (0) | 2011.03.08 |
| cURL (0) | 2011.02.18 |
설정
트랙백
댓글
글
경제학의 10가지 기본원칙
"Economics is what Economists do" 란 말로 경제학을 정의하기도 한단다.
No free lunch : 공짜 점심은 없다...
대포와 버터의 선택
=> 용어 선택 조심스럽게 했음...
=> 통화주의자, 고전파의 기본원리
'학습로그 > 경제/경영' 카테고리의 다른 글
| 경제학의 10가지 기본원칙 (0) | 2011.04.25 |
|---|
설정
트랙백
댓글
글
Wget
wget.exe 파일을 다운 받아서 PATH 를 잡아주거나, 이미 PATH가 설정된 폴더(예를 들면 c:\Windows\Sytstem32)에
복사해놓으면 터미널 창에서 유닉스와 동일한 명령으로 사용할 수 있다
GUI 없이도, 터미널에서 스크립트나 cron 과 함께 쉽게 되어질 수 있다.
* REST와 RANGE를 사용해서 취소된 다운로드를 재개할 수 있다.
* 파일이름에 와일드카드를 사용할 수 있고, 재귀적으로 파일을 다운할 수 있다.
* 옵션을 주면, 문서의 상대경로를 절대경로로 변경해주어 다운로드한 문서는 로컬상에서 서로 간에 링크가 된다.
* Windows 뿐만 아니라 대다수 Unix 유사 계열의 운영체제에서 실행된다.
* HTTP 프록시와 HTTP 쿠키를 지원한다.
* persistent HTTP 커넥션을 지원한다.
* 비동기적, 백그라운드 연산을 지원한다.
* 미러링시에 도큐먼트를 다시 다운받을 필요가 있는지 결정하기 위해 로컬 파일 타임스탬프를 사용한다.
* GNU Wget 은 GNU General Public License 하에 배포된다.
유닉스와 리눅스에서는 거의 대부분 wget 유틸리티가 설치되어 있으며, 패키지 관리툴을 통해 쉽게 설치할 수 있다.
여기서는 윈도우에 설치하는 방법만 소개한다.
1) Wget for Windows <= 요기에서 윈도우용 wget 바이너리를 다운받는다.
2) Path 환경변수에 wget.exe 파일을 저장한 폴더 경로를 지정한다.
아니면 이미 path 경로로 설정되어 있는 c:\windows\system32 폴더에 wget.exe 파일을 복사한다.
3) 이제 터미널 창을 열고 wget 명령을 사용하자~~
명령의 형태는 다음과 같다.
wget <웹페이지 주소> [-p] [-k] [-r]단일 페이지 또는 파일만을 다운받으려면 어떤 옵션도 주지 않고 주소만을 인자로 전달한다.
-k 옵션은 링크를 저장되는 파일 위치로 변환한다.
-r 옵션은 연결된 링크를 모두 다운로드 한다.
사이트 전체를 내려받을 수도 있으며, 백그라운드에서 다운받기(-b), 디버깅 메시지(-d), 헤더 저장하기(--save-headers) 등
다양한 옵션들이 제공된다. wget --help 명령을 사용하여 필요한 옵션들을 살펴보고 사용하자.
'운영체제로그 > Linux' 카테고리의 다른 글
| [Ubuntu] DNS 설정 (0) | 2011.04.25 |
|---|---|
| Wget (0) | 2011.04.25 |
| 리눅스 자격증 (0) | 2011.04.09 |
| 리눅스 파일시스템 계층 표준(Filesystem Hierarchy Standard) (0) | 2011.03.09 |
| su, sudo : 특정 사용자 권한으로 쉘/명령 실행 (0) | 2011.03.08 |
| cURL (0) | 2011.02.18 |
설정
트랙백
댓글
글
[Vi] Vi 사용하기
vim은 window 환경에서는 vim 설치폴더에, 유닉스/리눅스 환경에서는 홈폴더에 .vimrc 파일이 존재하여 환경설정을 할수 있다.
IDE 환경이 없을 경우, vi를 잘 다룰수 있다면 상당히 편리하다. 커서이동, 화면분할, 화면이동, 문자열 검색, 대치, 정규식 적용
등을 단축키로만 사용하여 처리하면 엄청난 작업효율을 가져올 수 있다는...emacs를 깊이 있게 사용해보지 못해서
아직까지는 vi 가 좀더 편하다
.exrc / .vimrc 설정 예
다음은 내가 사용하고 있는 vi 설정이다. vim 은 플러그인 기능을 제공해서 좀더 다양한 기능을 사용할 수도 있다.
피할 수 있다.
map:!gcc -o %< % map :!./%<
기능을 흉내낼 수 있어서 유용한 기능이다. 약어를 지정 방식은 다음과같다.
ab 약어 대체할문장
약어로 지정해 놓으면 약어 + Tap 키 조합으로 한번에 코드들을 삽입할 수 있다.
ab Inc #include <stdio.h>
ab inc #include "custom.h"
ab main int main(int argc, char *argv[]) {<LF><LF>return 0;<LF>}
'개발도구로그' 카테고리의 다른 글
| [Xcode] 지원 시뮬레이터 목록을 출력하는 명령 (0) | 2014.10.20 |
|---|---|
| [Vi] Vi 사용하기 (0) | 2011.04.25 |
| [SVN] Subversion 명령들 (0) | 2011.03.18 |
| visual studio2008 에서 커스텀 헤더파일과 라이브러리 포함시키기 (0) | 2011.02.13 |
| [VC2008] 라인넘버 표시 (0) | 2010.12.13 |
| [VC2008] 문자 셋 변경 (0) | 2010.12.13 |
my_string.c