본문 바로가기

코딩

백준 28239 c++

 

 

나만의 풀이

 

 

모든 m에대해 정확히 순서쌍이 하나가 존재한다.

 

m=17이면  4, 0

x<=y 이기때문에 작은수가 x고 큰수는 y.

 

그런데 

모든수에  순서쌍이 정확히 하나존재한다면.... 

m이 짝수일때는 무조건 x=1,  

m이 홀수일때는 무조건 x= 0 이 나오는거같은데?

 

예를 많이 들어보자

 

35면,   2^5+3이면    2^x=3    이면 x는 로그 2의 3이잖아.

그럼 무조건 x가 1,0이라는건 아니네

 

흠 잠시만..

 

m을 받았을때, x의 남은수를 xremain 이라고 하자 ( remain 이 나머지라는 뜻)

y의 승을 ycount 라고 하자.

 

xremain은 그럼   m-2^(ycount) = xremain 이다.

 

2^x = xremain이면

 

위 식에 x를 대입하면

 

m은 미리 입력받으니까 ㄱㅊ고 y는 계산해서 미리나오니까 아 이게아닌가;;

 

 

 

 

 

 

 

 

 

 

이것도 아닌거같은데

 

 

m은 사용자한테 받는 값이니까 변수가아니고

 

y에 대한식으로 바꿔볼까? 아니다.

 

 

 

 

 

 

 

 

 

m을 입력 받는다. 

 

예를들어 10이면

 

 

흠.,..x,y가 음이아닌 정수라는데 나 지금동안 뭐했냐?

 

 

2^y는 가장 m 에 가까워지는 수를 구하고

2^x 가 나머지다.  그럼

 

 

------------------------모르겠따 하 하루 푹 김치마냥 머리에서 익히고 내일 보자-------------

 

 

 

한가지 방법은 로그를 사용해서 내림을 사용하는것.

또 한가지 방법은 이진법을 사용하는 것이다.

 

 

 

 

 

 

로그를 사용한다면,

 

 

log 2 를 아래 넣어주면 10일경우 3.xxx가 나오니까 내림을 할시 3이 나오며 y의 값을 찾을 수 있다.

 

10에서 2^3을 빼면  2^x이므로   

 

2^x = 2 이다.

 

양쪽에 또 log 2 를 해주면 x = 1이나온다.

 

그런데 11일경우는 또 1.xxx가 나오게 되므로 여기도 내림을 해주면 1이된다.

 

 

예외가 있다.

 

16같은 수일때.

4 0 나오지만  다 더하면 17이 된다. 이런 예외 처리를 해줘야함

 

m-2^y 가 0일때?를 예외처리해줘야할거같은데?

 

 

 

 

 

내가 푼 코드

 

 

#include <iostream>
#include <cmath>
using namespace std;
long long main() {
long long n,m;
 
cin>>n;
 
 
for(i=0;i<n;i++)
{
cin>>m;
y= floor(log2(m)) //3
x= floor(log2(m-2^y)) //1
 
if(m-2^y==0 )
{
//안되도록 만들기.
}
 
cout>>y>>x;
 
return 0;
 
}

 

}

 

 

CHATGPT 수정코드

 

// Please note that there are some syntax errors in the provided code.
// I've fixed them in the following code block:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
long long n, m;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> m;
int y = floor(log2(m)); // 3
int x = floor(log2(m - pow(2, y))); // 1
if (m - pow(2, y) == 0) {
// Handle the case when m - 2^y is equal to 0
}
cout << y << " " << x << endl;
}
return 0;
}
 
 
x랑y의 자료형을 안넣어 줘서 그런거군.
2^y 를 pow 를 써서 (2,y) 로 해주는구나 오케이

출력할때는 가운데 공백을 넣어주고 endl;을 무조건 넣어주네?

그런데 예외처리 할때 보니까

 

16이면 2^4다.

근데 4 0 이 아니라 3 3 이다.

2^3 +2^3 은 16이니까

 

그럼 y값에 -1 을 해주고 그 값을 x에 도 넣어주면 된다.

 

 
#include <iostream>
#include <cmath>
using namespace std;
int main() {
long long n, m;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> m;
int y = floor(log2(m)); // 3
int x = floor(log2(m - pow(2, y))); // 1
if (m - pow(2, y) == 0) {
x= x-1;
y=x;
}
cout << y << " " << x << endl;
}
return 0;
}

 

 

 

그런데 출력 초과가 떴다 어떡하지?

 

 
long long 형을 int로 바꿔주고 x와y 의 출력을 바꿔주었다.
 
 



#include <iostream>
#include <cmath>

using namespace std;

int main() {
    int n, m;

    cin >> n;

    for (int i = 0; i < n; i++) {
        cin >> m;
        int y = floor(log2(m)); // 3
        int x = floor(log2(m - pow(2, y))); // 1

        if (m - pow(2, y) == 0) {
          x=  x-1;
          y=x;
        }

        cout << x << " " << y << endl;
    }

    return 0;
}

 

 

틀렸다.

 

 

16을 넣으니 엄청 큰수가 나오는데?

 

 

if (m - pow(2, y) == 0) {
          y=  y-1;
          x=y;
        }

 

x와 y가 바뀌었던거 같다...

 

 



#include <iostream>
#include <cmath>

using namespace std;

int main() {
    int n, m;

    cin >> n;

    for (int i = 0; i < n; i++) {
        cin >> m;
        int y = floor(log2(m)); // 3
        int x = floor(log2(m - pow(2, y))); // 1

        if (m - pow(2, y) == 0) {
          y=  y-1;
          x=y;
        }

        cout << x << " " << y << endl;
    }

    return 0;
}

 

 

아니 왜틀린거야 ㅆㅂ;;;

 

 

 

 

#include <iostream>
#include <cmath>

using namespace std;

int main() {
    long long n, m;

    cin >> n;

    for (int i = 0; i < n; i++) {
        cin >> m;
        int y = floor(log2(m)); // 3
        int x = floor(log2(m - pow(2, y))); // 1

        if (m - pow(2, y) == 0) {
          y=  y-1;
          x=y;
        }

        cout << x << " " << y << endl;
    }

    return 0;
}

 

 

n,m 자료형을 long long 으로 바꿨다.

 

 

그래도 틀렸다..

 

근데 출력은 맞는데... 왤까? 일단 킵

 

 

이제 해석보자

 

 

 

 

 

 

 

 

 

 

'코딩' 카테고리의 다른 글

백준 9372 c++  (0) 2023.06.30
백준 28173 c++  (0) 2023.06.22
백준 2745번 c++  (0) 2023.06.20
백준 10810 c++  (0) 2023.06.19
백준 4948 c++  (0) 2023.06.16