Machineboy空

1월 3주차 본문

Computer/Coding Test

1월 3주차

안녕도라 2024. 1. 18. 13:34

#1152 단어의 개수

while(cin>>s) n++;		//입력값이 없을 때까지 반복

 

 

아직 printf나 scanf를 잘 활용하지 못하겠다.

cin >>  A >> B >> C 공백 기준
getline(cin,t) '\n' 기준

 


#2908 문자열 뒤집기

string a;
int b;

b = stoi(a);		//문자열 숫자로 받기

 

stoi(string); : 문자열 아스키 코드아닌 숫자로 변환


#5622 다이얼

 

My 풀이)

번호마다 할당된 문자의 개수가 일정하지 않아서 개수 누적한 배열 만든 후,

어디에 위치할지 선택정렬로 비교하며 위치를 찾았다.

 

남의 풀이)

할당된 문자의 마지막 문자와 입력 문자의 대소 비교 통해 위치 찾아냄

#import <iostream>
char a;
int b;

main()
{
    while (std::cin >> a)
        for (int d : "  CFILOSV")   //* 덩어리 마지막의 것과 비교하는 로직
        							// " CFILOSV"자체가 char[] 배열인 것
            b += a > d;
    std::cout << b;
}

#10810 공 넣기

for(cin >> n >> m; cin >> i>>j>>k;)
// cin >> n >> m 첫번째 루프때만 실행
// cin >> i >> j >> k 입력값이 있을 때까지 실행

 

*segment fault : 배열 크기 초기화해주지 않았더니 발생. resize()로 해결


#10813 공 바꾸기

//하나의 임시 공간을 활용해 두 값을 바꾸는 로직

int temp = a[i];
a[i] = a[j]
a[j] = temp;

 

Tip)

바구니의 인덱스는 1~100

배열의 인덱스는 0으로 시작하지만 여러 칸 만들어두고 1~100만큼 쓰면 인덱스 값 맞춰줄 필요 없음


#10988 팰린드롬

string s, r;
cin >> s;
r = s;
reverse(r.begin(), r.end());

cout << (r == s);		// true = 1, false = 0;

 

*배열 == 배열 비교 불가

*string == string 비교 가능


#1157 단어 공부 (최빈 알파벳 출력)

//배열 초기화 방법
int a[99] = {0};

 

MY 풀이)

c++에서 array는 메소드를 지원하지 않아서, sort를 사용하려면 벡터를 사용해야 함.

 

최빈값 검출법

array 1: 알파벳 카운트 배열.

array 2: array 1 정렬한 배열.

array 2의 마지막 원소를 활용해 최빈값 검출함.

 

아스키 코드 활용

아스키 코드 A: 65, a: 97을 -32로 대소문자 동등 비교 진행함.

 

남의 풀이)

#include <stdio.h>

char s[1000001];
int c[26], m, t;

int main()
{
    scanf("%s", s);

    for (int i = 0; s[i]; i++)
        c[(s[i] - 65) % 32]++;      //%32 나머지 연산으로도 대 소문자 같은지 비교 가능

    for (int i = 1; i < 26; i++)    //선택 정렬 알고리즘
    {
        if (c[i] > c[m])
            m = i, t = 0;           //m이 갱신되는 형식
        else if (c[i] == c[m])
            t = 1;					// true : 1, false : 0 현명히 사용
    }

    if (t)
        printf("?");
    else
        printf("%c", m + 65);       //대문자 A: 65
}

 

최빈값 검출법

선택정렬 알고리즘m 인덱스 갱신하는 형식으로 활용.

 

아스키 코드 활용

나머지 연산 %32로 대소문자 동등 비교 진행함.


#2903 중앙 이동 알고리즘

3,5,9,17,33 ... 수열의 규칙 구하기

 

My 풀이) 재귀함수로 구현

// 한 변의 점을 구하는 로직 : 재귀함수로 구현

int n;

int cnt(int n){
    if(n == 1) return 3;
    return 2* cnt(n-1) -1;
}

int main(){
    cin >> n;

    cout << cnt(n)*cnt(n);
}

 

남의 풀이) shift 연산자로 구현

main(int i)
{
    cin >> i;
    i = (1 << i) + 1;
    cout << i * i;
}

#2563 색종이

 

알고리즘 많이 풀어본 사람들에겐 넓이를 2차원 배열로 나타내는 것이 꽤 쉬운 접근이었던 것 같은데

세번째 정도로 생각해낸 풀이로 스스로 소름돋아 기록

 

int a[100][100] 칸을 만들어 해당 칸에 1씩 부여하는 방법.

그리고 배열 총 합 구하면 넓이가 된다.

 


#1316 그룹 단어 체커

 

My 풀이)

bool isGroup를 true로 설정해두고 조건을 만족하지 못할시 false로 갱신

이전 char과 차례로 비교하며 같은 게 발견될 시 false로 만듬

 

일단 3중 for문에, if 조건 범위가 너무 많아져 좋은 코드가 아닌듯 함..

#include <bits/stdc++.h>
using namespace std;

int n, cnt;
string t;


int main(){

    cin >> n;

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

        bool isGroup = true; // true :1 , false:0;

        if(t.length()>1){	// 	길이가 한 문자이면 true이므로
            for (int j = 1; j < t.length(); j++)
            {
                if (t[j] == t[j - 1])
                {
                    continue;
                }
                else		
                {
                    for (int k = j - 1; k >= 0; k--)
                    {
                        if (t[j] == t[k])	// 바로 전 문자가 아닌 그전에 등장한 적 있다면 false
                        {
                            isGroup = false;
                            break;
                        }
                    }
                }
            }
        }
        

        cnt += isGroup;
    }

    cout << cnt;
    
}

 

남의 풀이) Unique함수 활용 - 이해가 안감 아직

#import <bits/stdc++.h>
#define z begin(s), end(s) 

using namespace std;

int main()
{
    int a = 0;
    string s;

    for (cin >> s; cin >> s; a += unique(z) == end(s))   
    {
        s.erase(unique(z), end(s));
        sort(z);
    }

    cout << a;
}

#25083 새싹

 

늘 특수문자 출력은 헷갈린다.

도전해보다 몇 번 틀리고 구글링했다.

"출력위해선 \"
\출력위해선 \\

 

"이나 \등 마침 혹은 개행과 관련된 문자 앞에 \를 붙여주는 것이 포인트

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char const *argv[])
{

    string s = "         ,r'\"7\n"; // \", \n 이 제어문자다.
    s += "r`-_   ,'  ,/\n";         // \n 이 제어문자다.
    s += " \\. \". L_r'\n";         // \\, \", \n 이 제어문자다.
    s += "   `~\\/\n";              // \\, \n 이 제어문자다.
    s += "      |\n";               // \n 이 제어문자다.
    s += "      |";
    cout << s;
    return 0;
}

#2738 행렬덧셈

 

My 풀이)

정직하게 2차원 배열 3개 만들어서 풀었다.

행렬 A,B, ret

그리고 두 번째 배열의 인덱스는 i-n으로 구했다.

 

남의 풀이)

ret 배열 하나만 두고 바로바로 더해서 넣어줌.

배열의 인덱스는 %n으로 구함.

#include <iostream>
using namespace std;
int arr[101][101];
int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n * 2; i++)
    {
        for (int j = 0; j < m; j++)
        {
            int t;
            cin >> t;
            arr[i % n][j % m] += t;
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cout << arr[i][j] << " ";
        }
        cout << '\n';
    }
}

#10798 세로 읽기

 

My 풀이)

 

char형을 int형 아스키코드 값으로 변환한 후에 다시 char형으로 변환하여 풀었다.

콘솔창에 출력값이 예제와 같이 나왔는데 계속해서 오답이라고 떴다.

char형 그대로 저장하도록 바꿨더니 정답.

 

무슨 문제인지 잘 모르겠다..

 

더불어 내가 왜 아스키 코드 값으로 바꿔 풀었었는지 기억이 나지 않지만

0~9도 엄연한 char형으로 아스키 코드값을 부여받고 있기 때문에 char형으로 저장 가능.


#1193 분수찾기

수열의 규칙을 찾아내기보다 적절한 메모리 공간을 만드는 것이 더 어려웠다.

 

segment fault 오류 또 발생 >> for문 범위 잘 확인하기

 

분자, 분모 만들어 규칙에 따라 충분히 값을 채워두고

입력값을 받아 검색하도록 했더니 메모리 초과가 뜬다.

 

동적할당으로 vector로 바꿔보았으나 여전히 같다.

답은 제대로 나오나, 메모리 초과.

 

//1차 시도

#include <bits/stdc++.h>
using namespace std;

vector<int> a,b;
int s;

int main()
{
    cin >> s;

    a.push_back(1);


    for(int n = 1; n <= s; n++){
        for (int i = 1; i <= 2 * n + 1; i++)
        {
            a.push_back(i);
        }

        for (int i = 2 * n ; i > 0; i--)
        {
            a.push_back(i);
        }

        for(int i = 1; i <=2*n ; i++){
            b.push_back(i);
        }

        for(int i = 2*n-1 ; i>0; i--){
            b.push_back(i);
        }
    }

    cout << a[s-1] <<"/"<<b[s-1];

    return 0;
    
}

 

메모리 초과가 난다면 다른 풀이법을 생각해볼 것..

멋진 방법

 

https://codesyun.tistory.com/58 

 

[BOJ/백준] 1193번 분수찾기 C++ 문제 풀이

단계별로 풀어보기 - 수학 1 단계 - [4단계] 1193번 문제 문제 링크 : www.acmicpc.net/problem/1193 1193번: 분수찾기 첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다. www.acmicpc.net 입력 복사 : 14 풀이 위 그림은 각

codesyun.tistory.com


#2941 크로아티아 알파벳

 

My 풀이)

단어를 찾으면 그부분을 erase하는 로직을 생각했으나

해당 부분을 덜어내고 앞뒤를 붙이니 새롭게 크로아티아 알파벳에 해당하는 단어가 만들어지는 문제.

 

따라서 단어를 찾으면 그 부분을 0으로 바꾸고 그 다음부터 검색하도록 변경.

 

남의 풀이)

추가 예정

'Computer > Coding Test' 카테고리의 다른 글

백준 랭킹 시스템  (0) 2024.01.30
1월 4주차  (0) 2024.01.25
프로그래머스 : 모음 제거  (0) 2023.12.30
프로그래머스 : 저주의 숫자 3  (0) 2023.12.30
백준 11047: 동전 0 - 그리디 알고리즘  (0) 2023.12.19