항해 99클럽 코테

99클럽 코테 스터디 9일차 TIL

metamong-data 2024. 11. 5. 14:57
728x90
반응형

오늘의 학습 키워드

해시

과제

## 문제

창영이는 민균이의 컴퓨터를 해킹해 텍스트 파일 하나를 자신의 메일로 전송했다. 파일에는 단어가 한 줄에 하나씩 적혀있었고, 이 중 하나는 민균이가 온라인 저지에서 사용하는 비밀번호이다.

파일을 살펴보던 창영이는 모든 단어의 길이가 홀수라는 사실을 알아내었다. 그리고 언젠가 민균이가 이 목록에 대해서 얘기했던 것을 생각해냈다. 민균이의 비밀번호는 목록에 포함되어 있으며, 비밀번호를 뒤집어서 쓴 문자열도 포함되어 있다.

예를 들어, 민균이의 비밀번호가 "tulipan"인 경우에 목록에는 "napilut"도 존재해야 한다. 알 수 없는 이유에 의해 모두 비밀번호로 사용 가능하다고 한다.

민균이의 파일에 적혀있는 단어가 모두 주어졌을 때, 비밀번호의 길이와 가운데 글자를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어의 수 N (2 ≤ N ≤ 100)이 주어진다. 다음 N개 줄에는 파일에 적혀있는 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 소문자로만 이루어져 있으며, 길이는 2보다 크고 14보다 작은 홀수이다.

출력

첫째 줄에 비밀번호의 길이와 가운데 글자를 출력한다. 항상 답이 유일한 경우만 입력으로 주어진다.

풀이 과정

  1. 입력 받을 줄 수를 input으로 입력 받고
  2. ::-1을 이용해서 dreverse에 뒤 집은 글자를 추가 해준다
  3. for 문을 이용해서 정상 글자에 뒤집은 글자가 있는지 확인 한다.
  4. 일치하는 글자가 있을 경우 answer에 추가
  5. 일치하는 글자의 0번째에서 길이와 가운데 글자를 반환

제출 코드 (python)

d = []

dreverse = []

answer = []
num = int(input())
for i in range(num):

    word = input()

    d.append(word)

    dreverse.append(word[::-1])

for i in d :

    if i in dreverse:

        answer.append(i)

print(len(answer[0]), answer[0][len(answer[0])//2])

다른 언어로 문제 풀기

GO 언어

package main

import (
    "fmt"
    "strings"
)

func main() {
    var n int
    fmt.Scan(&n)

    d := make([]string, 0)
    dreverse := make([]string, 0)
    answer := make([]string, 0)

    for i := 0; i < n; i++ {
        var word string
        fmt.Scan(&word)
        d = append(d, word)
        // 문자열 뒤집기
        runes := []rune(word)
        for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
            runes[i], runes[j] = runes[j], runes[i]
        }
        dreverse = append(dreverse, string(runes))
    }

    for _, word := range d {
        if contains(dreverse, word) {
            answer = append(answer, word)
        }
    }

    if len(answer) > 0 {
        fmt.Println(len(answer[0]), string(answer[0][len(answer[0])/2]))
    }
}

func contains(slice []string, item string) bool {
    for _, s := range slice {
        if s == item {
            return true
        }
    }
    return false
}

C++

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    int n;
    cin >> n;

    vector<string> d;
    vector<string> dreverse;
    vector<string> answer;

    for(int i = 0; i < n; i++) {
        string word;
        cin >> word;
        d.push_back(word);

        // 문자열 복사 후 뒤집기
        string reversed = word;
        reverse(reversed.begin(), reversed.end());
        dreverse.push_back(reversed);
    }

    for(const string& word : d) {
        // find 함수를 사용하여 dreverse에서 word 찾기
        if(find(dreverse.begin(), dreverse.end(), word) != dreverse.end()) {
            answer.push_back(word);
        }
    }

    if(!answer.empty()) {
        cout << answer[0].length() << " " << answer[0][answer[0].length()/2] << endl;
    }

    return 0;
}

오늘의 회고

  • 문제를 이해하는데 너무 오래 걸려서 시간 안에 해결하지 못 한 것 같다.
  • 변수의 초기화를 잘 해주고, 문제를 여러 유형을 잘 이해하기 위해 복습을 해야 할 것 같다.

출처 : https://www.acmicpc.net/problem/9933

728x90