πŸ”„ Algorithm/BaekJoon

μžλ°”(Java) [λ°±μ€€] 1718번 : μ•”ν˜Έ

kongmi 2023. 2. 1. 19:50

문제

Vigenere cipherμ΄λΌλŠ” μ•”ν˜Έν™” 방법은 μ•”ν˜Έν™”ν•˜λ €λŠ” λ¬Έμž₯ (평문)의 단어와 μ•”ν˜Έν™” ν‚€λ₯Ό 숫자둜 λ°”κΎΌ λ‹€μŒ, ν‰λ¬Έμ˜ 단어에 ν•΄λ‹Ήν•˜λŠ” μˆ«μžμ— μ•”ν˜Έ 킀에 ν•΄λ‹Ήν•˜λŠ” 숫자λ₯Ό λ”ν•˜λŠ” 방식이닀. 이 방법을 λ³€ν˜•ν•˜μ—¬ ν‰λ¬Έμ˜ 단어에 μ•”ν˜Έν™” 킀에 ν•΄λ‹Ήν•˜λŠ” 숫자λ₯Ό λΉΌμ„œ μ•”ν˜Έν™”ν•˜λŠ” 방식을 생각해 보자.

예λ₯Ό λ“€μ–΄ μ•”ν˜Έν™” ν‚€κ°€ love이고, μ•”ν˜Έν™”ν•  λ¬Έμž₯이 “nice day” 라면 λ‹€μŒκ³Ό 같이 μ•”ν˜Έν™”κ°€ 이루어진닀.

μ œμ‹œλœ ν‰λ¬Έμ˜ 첫 번째 문자인 ‘n’은 ν•΄λ‹Ή μ•”ν˜Έν™” ν‚€ ‘l’의 μ•ŒνŒŒλ²³ μˆœμ„œκ°€ 12 μ΄λ―€λ‘œ μ•ŒνŒŒλ²³μƒμ˜ μˆœμ„œμ—μ„œ ‘n’보닀 12μ•žμ˜ 문자인 ‘b’둜 λ³€ν˜•λœλ‹€.

λ³€ν˜•λœ λ¬Έμžκ°€ ‘a' μ΄μ „μ˜ λ¬Έμžκ°€ 되면 μ•ŒνŒŒλ²³ μƒμ—μ„œ 맨 λ’€λ‘œ μˆœμ„œλ₯Ό λŒλ¦°λ‹€. 예λ₯Ό λ“€λ©΄ ν‰λ¬Έμ˜ μ„Έ 번째 문자인‘c’λŠ” μ•ŒνŒŒλ²³ μƒμ—μ„œ 3 번째이고 λŒ€μ‘ν•˜λŠ” μ•”ν˜Έν™”ν‚€ ‘v'λŠ” μ•ŒνŒŒλ²³ μˆœμ„œ 22둜 ‘c'μ—μ„œ 22 μ•žμœΌλ‘œ λ‹ΉκΈ°λ©΄ ‘a'보닀 훨씬 μ•žμ˜ λ¬Έμžμ΄μ–΄μ•Ό ν•˜λŠ”λ°, ‘a’μ•žμ˜ λ¬Έμžκ°€ μ—†μœΌλ―€λ‘œ ‘z’둜 λŒμ•„κ°€ λ°˜λ³΅λ˜μ–΄ ‘g’κ°€ λœλ‹€. 즉 ν‰λ¬Έμ˜ 문자λ₯Ό μ•”ν˜Έν™”ν‚€μ˜ λ¬Έμžκ°€ μ•ŒνŒŒλ²³ μƒμ—μ„œ μ°¨μ§€ν•˜λŠ” μˆœμ„œλ§ŒνΌ μ•žμœΌλ‘œ λΊ€ κ²ƒμœΌλ‘œ μ•”ν˜Έν™”ν•œλ‹€.

ν‰λ¬Έμ˜ λ¬Έμžκ°€ 곡백 문자인 κ²½μš°λŠ” κ·Έ 곡백 문자λ₯Ό κ·ΈλŒ€λ‘œ 좜λ ₯ν•œλ‹€.

이와 같은 μ•”ν˜Έν™”λ₯Ό ν–‰ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 평문이, λ‘˜μ§Έ 쀄에 μ•”ν˜Έν™” ν‚€κ°€ μ£Όμ–΄μ§„λ‹€.

평문은 μ•ŒνŒŒλ²³ μ†Œλ¬Έμžμ™€ 곡백문자(space)둜만 κ΅¬μ„±λ˜λ©°, μ•”ν˜Έν™” ν‚€λŠ” μ•ŒνŒŒλ²³ μ†Œλ¬Έμžλ§ŒμœΌλ‘œ κ΅¬μ„±λœλ‹€. ν‰λ¬Έμ˜ κΈΈμ΄λŠ” κ³΅λ°±κΉŒμ§€ ν¬ν•¨ν•΄μ„œ 30000자 μ΄ν•˜μ΄λ‹€.

좜λ ₯

첫 번째 쀄에 μ•”ν˜Έλ¬Έμ„ 좜λ ₯ν•œλ‹€.

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        List<Character> s = new ArrayList<>();
        List<Character> c = new ArrayList<>();
        Scanner sc = new Scanner(System.in);

        String sentence = sc.nextLine();
        String code = sc.next();

        for(int i = 0; i < sentence.length(); i++) {
            s.add(sentence.charAt(i));
        }
        for(int i = 0; i < code.length(); i++) {
            c.add(code.charAt(i));
        }
        int z = 0;
        char j = ' ';
        char[] cd = new char[sentence.length()];
        for(int i = 0; i < cd.length; i++) {
            cd[i] = s.get(i);
        }

        for(int i = 0; i < s.size(); i++) {
            if(s.size() > c.size()) {
                c.add(c.get(i));
            }
            z = c.get(i) - 'a' + 1;
            cd[i] = (char)(s.get(i) - z);
            if(cd[i] < 'a') cd[i] += 26;
            if(s.get(i) == ' ') cd[i] = ' ';
        }
        for(char e : cd) System.out.print(e + "");
    }
}

μ’€ 더 κ°„κ²°ν•œ μ½”λ“œκ°€ μžˆμ„ 것 같기도 ν•œλ°..

μ˜μ‹μ˜ νλ¦„λŒ€λ‘œ μž‘μ„±ν•˜λ‹€λ³΄λ‹ˆ μ΄λ ‡κ²Œ 됐닀. πŸ˜