문제

신입 단기과제 연계 끝에 대전멤버십에서 새로운 숫자 체계 "MemNumber"를 완성시켰다. 이것은 4개의 소문자 m, c, x, i와 8개의 숫자 2, 3, 4, 5, 6, 7, 8, 9로 수를 표현한다. 즉, 0과 1은 사용하지 않는다.

 

몇가지 예를 들면

  • "5m2c3x4i" 는 5234 (= 5*1000 + 2*100 + 3*10 + 4*1)
  • "m2c4i" 는 1204 (= 1000 + 2*100 + 4*1)
  • "5m2c3x" 는 5230 (= 5*1000 + 2*100 + 3*10)

위 예에서

  • "5m" 는 5000 (= 5*1000)
  • "2c" 는 200 (= 2*100)
  • "3x" 는 30 (= 3*10)
  • "4i" 는 4 (= 4*1)

즉, m, c, x, i 앞에 2부터 9까지 수가 올 수 있는데 이 수와 짝을 이루어 수의 곱을 의미한다.

m, c, x, i 는 많아야 한 번 나올수 있다. 접두 숫자와는 같이 움직인다. m , c ,x , i 는 이 순서로 나와야 한다. 

다음은 가능하지 않는 "MemNumber"이다.

  • "1m2c4i"
  • "mcc4i"
  • "m2c0x4i"
  • "2cm4i"

 

"MemNumber" 문자열 두개를 입력으로 받아 "MemNumber" 수의 합을 구한 후 대응되는 "MemNumber" 문자열을 출력한다.

 

입력

"MemNumber" 문자열 2개가 입력된다.

두 수의 합은 9999를 넘지 않는다.

 

출력

입력된 "MemNumber" 문자열의 합을 "MemNumber"수로 출력한다.

예제 입력1

xi x9i

예제 출력1

3x


예제 입력2

i 9i

예제 출력2

x


예제 입력3

m2ci 4m7c9x8i

예제 출력3

5m9c9x9i


예제 입력4

9m8c7xi c2x8i

예제 출력4

9m9c9x9i



[문제 설명]

m = 1000

c = 100

x = 10

i = 1

1. 이 4개의 문자들은 2~9까지의 8개의 숫자와 짝을 이룹니다.

따라서 4m = 4 * 1000 = 4000이라고 볼 수 있고, mc = 1000 + 100 = 1100이라고 볼 수 있습니다.

2. mcxi는 각 한 번씩만 나올 수 있습니다.

3. m - c - x - i 꼭 이 순서대로 문자가 나와야 합니다.

이 세 가지 조건을 만족하면서 두 수의 합을 계산 한 후 다시 m, c, x, i 로 표현을 하는 것이 이번 문제였습니다.


[소스 코드 설명]

입력받은 문자의 길이를 구한 후, 그 길이 만큼 for문을 돌면서 각 문자별로 앞에 붙은 숫자와 짝을 이루어 입력받은 문자가 숫자로 환산하면 몇 인지를 파악합니다.

그리고 환산한 두 숫자를 더한 후에 다시 mcxi 문자로 바꿔주는 소스 코드 입니다.



Posted by 밍쫑
,

문제

멤버마을 멤버집에 살고 있는 우리 친구 현수는 축구를 너~~무 좋아해요♥

멤버학교에 새로 입학한 신입들을 데리고 축구를 하러 나가려는 찰나!! 멤버마을의 촌장인 미스타 "손"은 피곤한 신입들을 보호하고자 현수를 가로막습니다. 옆에서 지켜보고 있던 멤버마을의 부촌장인 새로운 "손"은 한가지 제안을 합니다. 

 

"마을에 쯔쯔가무시가 돌고 있다. 쥐를 잡아와라. 그렇다면 축구를 허락하겠다!"

축구를 너무 사랑하는 우리 친구 현수를 돕기 위해서 다함께 고양이(CAT)를 한마리 찾아볼까요?

 

입력된 문자열에 C, A, T가 순서대로 들어있다면 "YES"를 출력하고,

순서가 섞여 있거나 혹은 없다면 "NO"를 출력하세요.

 

입력

문자열의 길이는 1~50개이며, 'A' 부터 'Z' 이 이외의 문자는 없다.

 

출력

고양이를 찾으면 "YES"

못찾으면 "NO" 

예제 입력1

XCYAZTX

예제 출력1

YES


예제 입력2

CTA

예제 출력2

NO


예제 입력3

SGHDJHFIOPUFUHCHIOJBHAUINUIT

예제 출력3

YES


예제 입력4

CCCATT

예제 출력4

NO

 

HINT

고양이는 한 마리만 잡읍시다! 사료값 아끼자구요!



[문제 풀이]

순서대로 "CAT"이라는 단어가 순서대로 한 번만 존재해야하지만  "YES"가 출력되는 문제이다.

꼭 붙어있을 필요는 없고, 예제 이력 4를 보면 CAT가 하나 있는 것처럼 볼 수도 있겠지만!

CCCATT, CCCATT, CCCATT, CCCATT, CCCATT, CCCAT로 여러가지의 CAT이 나오므로 출력은 NO라고 볼 수 있다.



[소스코드 설명]

변수 cat은 사용자의 입력이 들어가게 되고, cat2에는 C, A, T일 경우, 그 단어를 받아들이는 임시 변수라고 보면 된다.

그리고 여기서 cat2.find("CAT"); 라는 것을 썼는데, 그것은 C++에서 제공하는 find()함수를 이용하여 cat2에 CAT이 존재하는지를 찾아주는 함수이다.

string::find

CString 개체의 문자열 기준, 좌측에서부터 문자 혹은 문자열을 검색한다.


string::find()를 통하여 원하는 단어나 문장을 검색 후 

그것이 문자열에 있는지 없는지string::npos를 통하여 알 수가 있다.

(string::find()는 찾고자 하는 단어나 문자열이 없으면 string::npos를 리턴한다.)



Posted by 밍쫑
,
프로그램 명: luckynum(open)
제한시간: 1 초
4 나 7로 이루어져있는 수를 행운의 숫자라고 한다.

다음은 처음 5개의 행운의 숫자다.

4, 7, 44, 47, 74...

정수 k가 주어졌을 때 k번 째 행운의 숫자를 구하는게 문제다.

입력

정수 k( 1<= k <= 10^9) 가 주어진다.

출력

k번 째 행운의 숫자를 출력한다.

입출력 예

입력

5

출력 

74
출처: 2010-2011 October COCI Q3
번역+추천: likepad


[문제 풀이]

4, 7, 44, 47, 74, 77, 444, 447, 474, 477, 744, 747, 774, 777, ....


[소스코드 설명]

이번 문제는 재귀함수를 이용해서 풀어보았습니다.


재귀(再歸, Recursion)는 수학이나 컴퓨터 과학 등에서 자신을 정의할 때 자기 자신을 재참조하는 방법을 뜻한다. 주로 이 방법은 함수에 적용한 재귀 함수(Recursion Function)의 형태로 많이 사용된다. 또, 사진이나 그림 등에서 재귀의 형태를 사용하는 경우도 있다.

- Wiki, 위키백과 -


일단 위에 문제 풀이를 보시면서 규칙이 보이시나요?

만약 제 이전 알고리즘 포스팅을 보신 분이라면 어떤 규칙인지 아실텐데요.

네, 바로 홀수번째와 짝수번째로 나뉘어진 규칙입니다.

홀수 : 4, 44, 74, 444, 474, 744, 774, ...    // 4로 끝나고 있다.

짝수 : 7, 47, 77, 447, 477, 747, 777, ...    // 7로 끝나고 있다.


1의자리가 홀수번째에는 4이고, 짝수번째에는 7로 나타나고 있습니다.



'알고리즘 > for' 카테고리의 다른 글

[for문] 약수의 개수, 총합 (1일차)  (0) 2014.04.15
[for문]1의 위치 (1일차)  (0) 2014.04.15
Posted by 밍쫑
,
프로그램 명: ft
제한시간: 1 초

자연수가 입력으로 주어진다. 이 수의 약수를 출력하고 , 다음 줄에는 약수의 개수 , 다음 줄에는 약수의 총합 , 다음 줄에는 약수의 곱의 일의 자리수를 출력한다.

입력

주어지는 수는 1000 이하의 자연수이다.

출력

입출력 예

입력

6

출력

1 2 3 6
4
12 

6


[문제 풀이]

문제는 크게 어려운 부분이 없습니다.

입력한 숫자의 약수와 약수의 갯수와 그 약수들의 곱을 구하는 문제입니다.


[소스코드 설명]

저는 먼저, 약수의 갯수를 세주는 count를 선언해주었습니다.

그리고 입력된 값 n이 for문을 돌면서 나누어 떨어지면 약수가 맞기 때문에 arr 배열에 값을 넣어주고 count값을 증가시켜주는 식으로 했습니다.



'알고리즘 > for' 카테고리의 다른 글

[for문] 행운의 숫자(lucky number) (1일차)  (1) 2014.04.16
[for문]1의 위치 (1일차)  (0) 2014.04.15
Posted by 밍쫑
,
프로그램 명: bit_pos
제한시간: 1 초

양의 정수 n 을 입력으로 받아 이 수를 이진수로 나타내었을 때 1 이 나타나는 위치를 구하는 것이 문제이다.

수를 이진수로 나타내었을 때 가장 오른쪽의 자리를 LSB(Least Significant Bit)라 한다. LSB 를 0 번 위치로 간주한다.

입력

양의 정수 n 이 입력으로 주어진다. ( 1 <= n <= 10^6 )

출력

1 이 나타나는 위치를 모두 출력한다.

입출력 예

입력

13

출력

0 2 3 

출처: Central European Programming Contest 


[문제 풀이]

이 문제의 경우 10진수를 2진수로 바꾼 후에 1이 나타나는 위치를 찾는 문제입니다.

주어진 예제에서 13의 경우 2진수로 바꾸면 1101 이 됩니다.

문제에서 제일 오른쪽에서부터 0으로 시작한다 하였으니, 

현재 1이 나타나는 위치는 오른쪽에서부터 순서대로 0, 2, 3이 됩니다.

 1

 0

1

1

 0

 1

[소스코드 설명]

저는 짝수일 때와 홀수 일때에 대해서 따로 생각을 했습니다.


홀수 : 0001(1), 0011(3), 0101(5), 0111(7), 1001(9), 1011(11), 1101(13), ...

짝수 : 0010(2), 0100(4), 0110(6), 1000(8), 1010(10), 1100(12), 1110(14), ...


혹시 규칙이 보이시나요?

홀수의 경우 0의 자리가 무조건 1로 끝나고, 짝수의 경우 0의 자리가 무조건 0으로 끝나게 됩니다.

그래서 저는 "isFirst" 라는 것을 선언해서 홀수면서 처음나누어지는 것에 대해서는 무조건 1임을 나타내서 출력할 때 0도 포함이 되게 하였습니다.(1011)


그 다음 10진수를 2진수로 바꾸는 것을 손으로 직접 해보시면 아시겠지만, N값이 1이 될 때까지 계속 나눕니다. 따라서 N이 1이되면 break;로 계산을 멈추게 하였습니다.


그리고 2진수로 바꾸는 것이기 때문에 한 번 계산이 끝날 때마다 N값을 N/2로 갱신해주었습니다.



'알고리즘 > for' 카테고리의 다른 글

[for문] 행운의 숫자(lucky number) (1일차)  (1) 2014.04.16
[for문] 약수의 개수, 총합 (1일차)  (0) 2014.04.15
Posted by 밍쫑
,

알고리즘.........................!!!!!!!!!!


제가 개인적으로 많이 부족한 기술력도 있지만, 학교에서 이론만 배워보고 알고리즘 문제를 접하거나 코딩을 직접 해 본 적이 없는 상태입니다.


현재 알고리즘이 매우 중요하게 된 멤버십에서 저는 완전 멘붕상태였죠..ㅠ


멤버십(이하 멤)에서 내주는 일일 알고리즘 3문제도 하루 반나절을 붙잡아야 풀 수 있는 정도였습니다.

매주 자체적으로 멤에서 매주 토요일마다 2시간동안 3문제를 푸는 '멤고리즘' 대회를 여는데요.

이 시험을 통해 알고리즘 등급이 메겨집니다. 

A~F등급이 있는데...(저희 대전 멤버십 내에서의 등급입니다. 전체멤버십과는 관련 없습니다.)


사실 저는 맨 처음 F등급을 받고, 현재는 D등급까지 올라왔습니다.

이렇게 올라온 것도 기존 회원분들 중에 멤고리즘이나 일일 알고리즘에 참여하지 않으시는 분들이 있기때문에 자동적으로 올라가게 된 것이 아닌가 싶습니다. 물론 한 문제라도 풀 수 있게 된 것도 있지만요!!


결론은 아직도 부족...

알고리즘...저도 정말 잘하고 싶습니다!! 

그런데 당장 어떻게 공부해야 될지도 모르겠어서 답답하기만 하답니다.


그 동안 알고리즘 공부하려고, 쉬운 책도 찾아봤지만...제 수준에 맞는 책이 없습니다!

자료구조 책을 다시보는것도 알고리즘을 잘하는 것에 도움이 되는 것도 한계가 있습니다!

잘하는 사람의 소스코드를 보거나, 설명을 듣는것도 물론 도움이 되지만... 제가 너무 타인에 의존적으로 변해버리더랍니다.

마치 우리가 궁금한 게 있으면 인터넷을 찾아보는 것 처럼요...



어제 급하게 만든 4주간의 공부 계획표를 들고 큰 운영자님과 상담을 했습니다.

'매일 3문제씩 푸는데 6개월 후면 지금보다야 많이 나아져있겠지~!'라는 안일한 생각을 갖고 있던 것을 큰 영자님은 완전  꿰뚫어 보시는거 같았습니다. ㅠㅠㅠ멤버십 합격이 전부가 아닌데 제가 너무 편안하게 있던건 아닌가 반성을 했습니다.


큰 운영자님과 상담에서는


1. 알고리즘 3문제를 푸는 것을 2시간을 잡고, 다른 사람한테 물어보거나 말하지 않고 집중력 있게 하기!

2. 질문이 있을 때에는 바로 옆에 물어볼 사람이 있다하더라도 첨삭 게시판의 글을 올리고 리플 달아달라하기!

(즉, 바로바로 물어보지말고 좀 더 혼자 생각하는 시간을 많이 가지라는 의미이기도 하지요)

3. 알고리즘 문제들을 풀기만 하지않고, 문제를 풀면서 분류하기!

(이진수, 배열 등으로 문제들을 분류해놓고 나중에 같은 분류의 문제들을 비교하면서 내가 어느 부분에서 못 푸는지 확인)

4. 시험 볼때에도 '오늘은 몇 점을 받아야지!' 라던가 '오늘은 몇 개를 풀어야지!' 라는 목표를 갖고 임하기!

5. 목표 등급은 B!!


이라는 결론을 받아왔습니다..ㅎㅎ


당장은 잘 하기 힘들거라고 생각합니다. 하지만 빠르게 성장해야죠!

꼭 6개월 안에 A!! B!! 상위권으로 갈 거라고 믿습니다 ㅎㅎ



혹시나 멤버십을 준비하시는 분들이 계시다면

알고리즘 공부도 틈틈히 열심히 하시길 바랍니다.


개인적으로 추천드리는 사이트는

알고스팟 : www.algospot.com/

(알고스팟은 유명한 사이트이지만, 가끔 영어 문제도 나와서 해석해야된다는 단점(?)이 있습니다.)

dovelet : www.dovelet.com/

(dovelet의 경우 모든 문제가 한글로 번역되어 있지만, 3단계까지는 무료이고, 그 이후부터는 유료인 단점(?)이 있습니다.)


Posted by 밍쫑
,