B1978

개요

백준 문제 1978번을 풀면서 어려웠던 점과 코드를 정리한다.
소요 시간 : 5분
https://www.acmicpc.net/problem/1978

문제

주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.

코드

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
#include <iostream>
const int MAX = 1001;
using namespace std;


void solve()
{
int N,curNum,count = 0;
int objNum;
cin >> N;
for(int i=0;i<N;i++)
{
cin >> curNum;
if(curNum == 2)
{
count++;
}
for(int i=2;i<curNum;i++)
{
if(curNum % i == 0)
{
break;
}
if(i+1 == curNum)
{
count++;
}
}
}
cout << count;

}
int main()
{
solve();
}

풀이

메모라이즈 기법을 사용해 시간을 좀 줄일까 생각했지만 굳이 그럴 것 없이
숫자 2부터 Num-1까지 일일이 나눠지는지 확인했다.
숫자 2의 경우는 예외처리 했다.

배울 점, 메모

못하는만큼 열심히

B11576

개요

백준 문제 11576을 풀면서 어려웠던 점과 코드를 정리한다.
소요 시간 : 1시간

https://www.acmicpc.net/problem/11576

문제

타임머신을 개발하는 정이는 오랜 노력 끝에 타임머신을 개발하는데 성공하였다. 미래가 궁금한 정이는 자신이 개발한 타임머신을 이용하여 500년 후의 세계로 여행을 떠나게 되었다. 500년 후의 세계에서도 프로그래밍을 하고 싶었던 정이는 백준 사이트에 접속하여 문제를 풀기로 하였다. 그러나 미래세계는 A진법을 사용하고 있었고, B진법을 사용하던 정이는 문제를 풀 수가 없었다. 뛰어난 프로그래머였던 정이는 A진법으로 나타낸 숫자를 B진법으로 변환시켜주는 프로그램을 작성하기로 하였다.

N진법이란, 한 자리에서 숫자를 표현할 때 쓸 수 있는 숫자의 가짓수가 N이라는 뜻이다. 예를 들어 N은 17일 때 한 자릿수에서 사용할 수 있는 수는 0, 1, 2, … , 16으로 총 17가지가 된다.

코드

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
#include <iostream>
using namespace std;


int returnTenDigitNum(int digit)
{
int N;
cin >> N;
int digitNum = 1;
int result = 0;
int curNum = 0;
for(int i=0;i<N;i++)
{
cin >> curNum;
result = result * digit + curNum;
}
return result;
}

void solve()
{
int objDigit,subjDigit;
int tenDigitNum;
int maxObjDigitNum = 1;
cin >> subjDigit >> objDigit;
tenDigitNum = returnTenDigitNum(subjDigit);
//cout << "ten digit : " << tenDigitNum << "\n";
if(tenDigitNum == 0)
{
cout << tenDigitNum;
}
else
{
while(maxObjDigitNum <= tenDigitNum)
{
maxObjDigitNum *= objDigit;
}
maxObjDigitNum /= objDigit;
//cout << "최대 자리수 : " << maxObjDigitNum << "\n";
int result = 0;

while(tenDigitNum != 0)
{
result = tenDigitNum / maxObjDigitNum;
cout << result;
tenDigitNum = tenDigitNum % maxObjDigitNum;
maxObjDigitNum /= objDigit;
if(tenDigitNum != 0)
{
cout << " ";
}

}



}


}

int main()
{
solve();

}

풀이

N 진법 -> 10진법 -> M진법으로 변환한다.

배울 점, 메모

풀이 방식 접근 자체는 틀린것이 아닌데 세부적으로 구현할 때 == 같은 부분을 놓쳤다
아직 세밀한 코딩 능력이 부족한것 같다.
아직 잘 못하니까 공부하는 것이다 쉬운데 빠르게 못푼다고 기죽지말자

B2089

개요

백준 문제 B2089번을 풀면서 어려웠던 점과 코드를 정리한다.
소요 시간 : ?
https://www.acmicpc.net/problem/2089

문제

-2진법은 부호 없는 2진수로 표현이 된다. 2진법에서는 20, 21, 22, 23이 표현 되지만 -2진법에서는 (-2)0 = 1, (-2)1 = -2, (-2)2 = 4, (-2)3 = -8을 표현한다. 10진수로 1부터 표현하자면 1, 110, 111, 100, 101, 11010, 11011, 11000, 11001 등이다.

10진법의 수를 입력 받아서 -2진수를 출력하는 프로그램을 작성하시오.

코드

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
#include <iostream>
using namespace std;

int init()
{
int num;
cin >> num;
if(num == 0)
{
cout << 0;
}


return num;
}

void solve(int num)
{

if(num == 0)
{
return;
}

if(num % -2 == 0)
{
solve(num / -2);
cout << 0;
}
else
{
solve((num-1) / -2);
cout << 1;
}




}

int main()
{

solve(init());



}

풀이

-2진법 =
-2로 나눠서 나머지가 0이다 == 1 출력
나머지가 0이 아니다 == 0 출력
값 /= -2;
하지만 나머지가 정확히 정수가 아닌 경우에 몫이 제대로 출력안됨
따라서 (값-1) /= -2해줌

배울 점, 메모

오랫동안 풀이 방법을 생각하지 못한문제..
너무 머리나 시간을 안쓸려고하는게 아닐까

B1373

개요

백준 문제 1373번을 풀면서 어려웠던 점과 코드를 정리한다.
소요 시간 : 10분
https://www.acmicpc.net/problem/1373

문제

2진수가 주어졌을 때, 8진수로 변환하는 프로그램을 작성하시오.

코드

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
#include <iostream>
#include <stack>
using namespace std;

void solve()
{
string binary;
int countThree = 0;
int digit = 1;
int result = 0;
cin >> binary;
stack<int> s;
for(int i=binary.size()-1;i>=0;--i)
{
result += (binary[i] - '0') * digit;
countThree++;
digit*=2;
if(countThree == 3)
{
s.push(result % 8);
countThree = 0;
result = 0;
digit = 1;
}
}
if(countThree != 0)
{
s.push(result % 8);
}
while(s.size()!= 0)
{
cout << s.top();
s.pop();
}

}

int main()
{
ios_base :: sync_with_stdio(0);
cin.tie(0);
solve();
}

풀이

2진수 입력 -> 맨끝에서 부터 3개씩 카운트하며 결과값을 스택에 저장
카운트가 3개가 되지 않은 경우 -> 정확히 떨어지지 않은 경우이므로 예외로 결과값 저장
저장된 스택에서 값 출력 = 정답

배울 점, 메모

설계,문제 풀이법을 오래 생각할 수록 코드 작성은 간결해진다.
물론 코드를 작성하는중에만 생각나는 것들도 있기는 하다.