코딩/백준 문제 풀이

문자열 구현 연습

stonejjun 2020. 9. 1. 21:27

solved 기준 문자열을 너무 안풀었고, 문자열 관련 기초 코딩능력이 딸리는 것 같아서 아래와 같이 검색한 랜덤 문제를 푸려고 한다. 계속 푸는 대로 업데이트 할 예정이다.

 

BOJ 17413 단어 뒤집기

제발 문제 좀 읽자.
1. 전체 뒤집은면 되는 줄 알고 reverse가 끝인줄 알았다.
2. 단어별로 뒤집는 것 인줄 몰랐다.
3. 자잘한 코딩 실수들.

정신좀 차리자. 대회면 망했다. 그래도 줄 입력이   getline(cin,s); 인것은 기억해냈다.

풀이는 입력 종류별로 케이스를 나눠서 뒤집어야 하는 것들은 스택에 담아두면 끝. 닥히 어렵지 않다.

더보기

 

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;

string s;
string s2;
stack <char>ss;
ll chk=0;

int main(){
    getline(cin,s);
    ll n=s.size();

    for(ll i=0;i<n;i++){
        if(chk==0&&s[i]=='<'){
            while(ss.size()){
                s2+=ss.top();
                ss.pop();
            }
            s2+='<';
            chk=1;
        } 
        else if(chk==0&&s[i]==' '){
             while(ss.size()){
                s2+=ss.top();
                ss.pop();
            }
            s2+=' ';
        }
        else if(chk==0) ss.push(s[i]);
        else if(s[i]=='>'){
            while(ss.size()){
                s2+=ss.top();
                ss.pop();
            }
            s2+='>';
            chk=0;
        }
        else s2+=s[i];
    }
    while(ss.size()){
                s2+=ss.top();
                ss.pop();
            }
    cout<<s2;
}

 

BOJ 4396 지뢰 찾기

여러 사람이 고생한 문제. 내가 문제를 정확히 읽지 못한 것도 있지만, 문제 자체의 설명이 명확하지 않은 점도 있다. 나는 문제의 설명이 좀 만 명확하지 못해도 문제에서 요구하는 바를 정확히 파악하지 못하는 것 같다. 이는 큰 문제이고, 앞으로 꼭 고쳐나가야할 숙제이다. 

맵에 관한 문자열을 받아서 문자별로 확인하면서 수로 바꾸는 테크닉을 사용하였다. 문자열이나 문자 그대로의 형태로 맵을 저장할 수도 있지만, 나는 수의 형태로 바꿔서 맵으로 저장하는게 더 편한 것 같다. 

더보기
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<ll,ll> pii;

ll arr[1010101];
ll fld[101][101];
ll ans[101][101];


string s;
ll chk=0;

int main(){
	ll i,j,k,l,m,n;
	scanf("%lld",&n);
	for(i=1;i<=n;i++){
		cin>>s;
		for(j=1;j<=n;j++)
			if(s[j-1]=='*')
				fld[i][j]=1;
	}

	for(i=1;i<=n;i++){
		cin>>s;
		for(j=1;j<=n;j++){
			if(s[j-1]=='x'){
				if(fld[i][j]==1) chk=1;
				ans[i][j]=fld[i-1][j]+fld[i+1][j]+fld[i+1][j-1]+fld[i+1][j+1]+fld[i-1][j+1]+fld[i-1][j-1]+fld[i][j+1]+fld[i][j-1];
			}
			else ans[i][j]=-1;
		}
	}

	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			
                if(chk&&fld[i][j]) printf("*");
				else if(ans[i][j]==-1) printf(".");
				else printf("%lld",ans[i][j]);
			
		}
		printf("\n");
	}
}

BOJ 10773 제로

왜 문자열태그가 있는지 모르겠다. stack 활용 연습문제.

BOJ 1213 팰린드롬 만들기

문자열 문제를 풀다보니까 그래도 직관이 조금씩은 올라간 것을 느꼈다. 옛날 같았으면 숫자로 바꿔서 개수를 배열에 저장해 놓고, 홀수인 것 개수를 세고, 경우를 나누고 출력을 했을 것이다
하지만 a부터 보면서 절반은 string 1에 담고 절반은 string2에 담고 남은 것은 string3에 담는다. string3의 길이가 1이하일 때만 가능하며, 2를 뒤집고 1,3,2 순서대로 출력하면 쉽게 해결할 수 있다.

더보기
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;

string s1;
string s2;
stack <char>ss;
ll chk=0;
stack<ll> s;

ll arr[101];

string ans1,ans2,ans3;

int main(){
    ll i,j,k,l,m,n;

    cin>>s1;
    n=s1.size();

    for(i=0;i<n;i++){
        arr[s1[i]-'A']++;
    }

    for(i=0;i<=26;i++){
        for(j=1;j<=arr[i]/2;j++){
            ans1+=('A'+i);
            ans3+=('A'+i);
        }
        if(arr[i]%2) ans2+=('A'+i);
    }

    if(ans2.size()>1){
        printf("I'm Sorry Hansoo");
    }
    else {
        reverse(ans3.begin(), ans3.end());
        cout<<ans1<<ans2<<ans3;
    }

}

'코딩 > 백준 문제 풀이' 카테고리의 다른 글

BOJ 1167 - 트리의 지름  (1) 2020.10.04
BOJ 5916 - 농장 관리  (0) 2020.09.15
BOJ 1028 - 다이아몬드 광산  (0) 2020.08.18
BOJ 17834 - 사자와 토끼  (0) 2020.08.17
BOJ 2924 - 천재  (0) 2020.08.17