Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[브루트포스] 9월 13일 #4

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"files.associations": {
"utility": "cpp"
}
}
134 changes: 134 additions & 0 deletions 04_브루트포스/1063.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>

using namespace std;
int isValid(string kd, string dis) {
char s, n;

n = kd[1];
s = kd[0];

if (s == 'A') {
if (n == '1') {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p3. 모든 경우에 기물이 체스판을 벗어나는 것이 조건 위배죠! 움직임 조건별로 정리하는 것보다 전부 하나의 함수로 만들어서 처리하셨어도 좋을 것 같네요!

if (dis == "L" || dis == "B" || dis == "LT" || dis == "RB" || dis == "LB")
return 0;
} else if (n == '8') {
if (dis == "L" || dis == "T" || dis == "RT" || dis == "LT" || dis == "LB")
return 0;
} else if (n > '1' && n < '8') {
if (dis == "L" || dis == "LT" || dis == "LB") //이거 위에거 복붙해서 범위 오류로 실행과 동시에 실패 했었음
return 0;
} else {
return 1;
}
} else if (s == 'H') {
if (n == '1') {
if (dis == "R" || dis == "B" || dis == "RT" || dis == "RB" || dis == "LB")
return 0;
} else if (n == '8') {
if (dis == "R" || dis == "T" || dis == "LT" || dis == "RT" || dis == "RB")
return 0;
} else if (n > '1' && n < '8') {
if (dis == "R" || dis == "RT" || dis == "RB")
return 0;
}
} else if (n == '1') {
if (s > 'A' || s < 'H') {
if (dis == "B" || dis == "RB" || dis == "LB")
return 0;
}
} else if (n == '8') {
if (s > 'A' || s < 'H') {//이거 범위 반대로 줘서 실행하자마자 실패
if (dis == "T" || dis == "RT" || dis == "LT")
return 0;
}
}

return 1;
}


string move(string ori, string dis){
char s, n;

n=ori[1];
s=ori[0];

if(dis=="R"){
s++;}
else if(dis=="L"){
s--;}
else if(dis=="B"){
n--;}
else if(dis=="T"){
n++;}
else if(dis=="RT"){
s++;
n++;
}
else if(dis=="LT"){
s--;
n++;
}
else if(dis=="RB"){
s++;
n--;
}
else if(dis=="LB"){
s--;
n--;
Comment on lines +67 to +81
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p3. 두개의 문자로 이루어진 방향표시는 각각 알파벳 두 개의 방향표시로 나누어 생각할 수 있죠! 코드를 줄일 방법은 없을까요?

}
string result=string(1,s)+string(1,n);
return result;
}

vector<string> chessClac(string kd, string sd, vector<string> s){
vector<string> dis(2);
string tmp;
for(int i=0; i<s.size(); i++){
if(isValid(kd, s[i])){
tmp=move(kd, s[i]);}
else
continue;
if(tmp==sd){
if(isValid(sd, s[i])){
kd=tmp;
sd=move(sd, s[i]);
}
}
else{
kd=tmp;
}
}
dis[0]=kd;
dis[1]=sd;

return dis;
}

int main()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

가벼운 main 함수 좋습니다!

{
//변수선언
string kd, sd;
int N;
vector<string> dis(2);

//입력
cin>>kd>>sd;
cin>>N;

vector<string> s(N);
for(int i=0; i<N; i++){
cin>>s[i];
}

//연산
dis=chessClac(kd, sd, s);

//출력
cout<<dis[0]<<"\n"<<dis[1];

return 0;
}
82 changes: 82 additions & 0 deletions 04_브루트포스/11723.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#include <iostream>
#include <sstream>
#include <vector>
#include <string>

using namespace std;


void add(int& ans, int value){
ans=ans|(1<<value);
}

void remove(int &ans, int value){
ans=ans&~(1<<value);
}

void check(int& ans, int value){
if (ans&(1<<value)) {
cout << "1\n";
}
else {
cout << "0\n";
}
}

void toggle(int& ans, int value){
ans^=(1<<value);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

비트연산자 활용 아주 좋습니다👍👍

}

void all(int& ans){
ans=(1<<21)-1;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

의미를 명확히 하기 위해서 const int ALL = (1 << 21) - 1로 선언한 후 ans = ALL등으로 사용해주는 건 어떨까요?

}

void empty(int& ans){
ans=0;
}

int main()
{
ios_base::sync_with_stdio(false);//이거 안썼더니 계속 시간초과 났다.
cin.tie(0);

int n;
int ans=0;

cin>>n;

cin.ignore();

//연산
string key;
int value;

for(int i=0; i<n; i++){
cin>>key;

if (key == "add") {
cin>>value;
add(ans, value);

}
else if (key == "remove") {
cin>>value;
remove(ans, value);
}
else if (key == "check") {
cin>>value;
check(ans, value);
}
else if (key == "toggle") {
cin>>value;
toggle(ans, value);
}
else if (key == "all") {
all(ans);
}
else if (key == "empty") {
empty(ans);
}
}
return 0;
}
39 changes: 39 additions & 0 deletions 04_브루트포스/1436.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

int findEnd(int N){
int n=665, count=0;
string s;
while(count!=N){
s=to_string(n);
for(int i=0; i<s.size()-2; i++){
if(s[i]=='6' && s[i+1]=='6' && s[i+2]=='6'){//string vector에서 문자 비교하고 싶을 때 "" 쓰면 pointer error 발생!!
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

n을 string으로 바꾸지 않아도 666을 찾을 수 있어요! 한 정수가 주어져있울 때 각 자릿수를 접근하고 싶을 때 이 숫자를 10씩 나눠가며 나머지를 확인했던 거 기억하시나요? 여기서도 마찬가지로, 대신 666이라는 세자리 숫자를 확인해야 하니 1000으로 나눴을 때의 나머지를 확인하면 666의 존재를 찾을 수 있어요! 샘플 코드에는 이 방식으로 풀이가 되어 있으니 한 번 확인해보셔도 좋을 것 같습니다😁

// '7' 이런식으로 작은 따옴표 사용해줘야 한다. 문자열 비교하고 싶으면 .compare함수 사용하기
count++;
break;
}
}
n++;
}
return --n;


}

int main()
{
int N;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3. 변수의 표기법을 통일해주세요! 변수에서는 스네이크 표기법을 함수에서는 카멜 표기법을 사용하기로 정하고 변수에서 다른 표기법을 사용하실 경우 혼돈이 올 수 있어요😂 알튜비튜에서는 변수명에는 스네이크 표기법을, 상수명에는 대문자를, 함수명에는 카멜 표기법을 사용하도록 권고드리고 있습니다😊


//입력
cin>>N;

int result=findEnd(N);
//연산
cout<<result;

return 0;
}
70 changes: 70 additions & 0 deletions 04_브루트포스/2231.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

int result(int N, int count){
int sum=0, result=0;
string s;

s=to_string(N);
for(int j=0; j<s.size(); j++){
sum+=stoi(string(1,s[j]));
}

if(sum<=9*count){//등호가 들어가도 되나?
sum=0;
for(int i=1; i<N; i++){
s=to_string(i);
for(int j=0; j<s.size(); j++){
sum+=stoi(string(1,s[j]));
}
sum+=i;
if(sum==N){
result=i;
break;
}
sum=0;
}
}
else{
for(int i=N-count*9; i<=N-1; i++){//i<0일경우 invalid_argument 문제 발생
s=to_string(i);
for(int j=0; j<s.size(); j++){
sum+=stoi(string(1,s[j]));
}
sum+=i;
if(sum==N){
result=i;
break;
}
sum=0;
}
}

return result;
}

int main()
{
//변수 선언
int N, sum=0, count=1, temp, answer=0;

//입력
cin>>N;

//자리수 구하기
temp=N;
while(temp>10){
temp/=10;
count++;
}

answer=result(N, count);

cout<<answer;

return 0;
}
32 changes: 32 additions & 0 deletions 04_브루트포스/2231_live_coding.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

int bruteforce(int n){
for(int i=1; i<n; i++){
//분해합 구하기
int tmp=i;
int sum=i;//분해합 저장하기

while(tmp>0){
sum+=tmp%10;
tmp/=10;
}
if(sum==n) return i;
}
return 0;
}

int main()
{
//입력
int n;
cin>>n;

cout<<bruteforce(n);

return 0;
}
Loading