[백준/Python] Q10941. BASE16 디코딩

 

 문제 

화은이는 이번 영어 시험에서 틀린 문제를 바탕으로 영어 단어 암기를 하려고 한다. 그 과정에서 효율적으로 영어 단어를 외우기 위해 영어 단어장을 만들려 하고 있다. 화은이가 만들고자 하는 단어장의 단어 순서는 다음과 같은 우선순위를 차례로 적용하여 만들어진다.

  1. 자주 나오는 단어일수록 앞에 배치한다.
  2. 해당 단어의 길이가 길수록 앞에 배치한다.
  3. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다

M보다 짧은 길이의 단어의 경우 읽는 것만으로도 외울 수 있기 때문에 길이가 M이상인 단어들만 외운다고 한다. 화은이가 괴로운 영단어 암기를 효율적으로 할 수 있도록 단어장을 만들어 주자.


 입력 

첫째 줄에는 영어 지문에 나오는 단어의 개수 N과 외울 단어의 길이 기준이 되는 M이 공백으로 구분되어 주어진다. (1≤N≤100000, 1≤M≤10)

둘째 줄부터 N+1번째 줄까지 외울 단어를 입력받는다. 이때의 입력은 알파벳 소문자로만 주어지며 단어의 길이는 10을 넘지 않는다.

단어장에 단어가 반드시 1개 이상 존재하는 입력만 주어진다.



 출력 

화은이의 단어장에 들어 있는 단어를 단어장의 앞에 위치한 단어부터 한 줄에 한 단어씩 순서대로 출력한다.

 

 

 

  관련 개념  

 파이썬에서의 빠른 입력 

import sys

a = sys.stdin.readline() #개행문자O. ex) 'cat\n'

b = sys.stdin.readline().rstrip() #개행문자X. ex) 'cat'

 

 

'Algorithm' 카테고리의 다른 글

[백준/Python] Q10941. BASE16 디코딩  (0) 2020.11.23
[백준/C++] Q15552. 빠른 A+B  (0) 2020.11.23
[백준/C] Q9610. 사분면  (0) 2020.11.23
[백준/C++] Q6679. 싱기한 네자리 숫자  (0) 2020.11.23

[백준/Python] Q10941. BASE16 디코딩

 

 문제 

BASE16으로 인코딩한 문자열 S가 주어졌을 때, S를 출력하는 프로그램을 작성하시오.

 입력 

첫째 줄에 문자열 S를 BASE16으로 인코딩한 결과가 주어진다. S는 알파벳 대문자와 소문자, 그리고 숫자로만 이루어져 있으며, 길이는 최대 50이다.

 출력 

첫째 줄에 문자열 S를 출력한다.

 

 

 

  관련 개념  

 

- BASE64 모듈: 바이너리 데이터를 인쇄 가능한 ASCII 문자로 인코딩하고

이러한 인코딩을 다시 바이너리 데이터로 디코딩하는 함수를 제공

(Base16, Base32, Base64, Base85 인코딩에 대한 인코딩, 디코딩 함수 제공)

 

 

 base64.b16decode(s, casefold=False) 

Base16으로 인코딩된 바이트열류 객체나 ASCII 문자열 s를 디코딩하고 디코딩된 bytes를 반환

casefold로 소문자 알파벳을 입력으로 사용할 수 있는지 지정(기본값은 false)

 

docs.python.org/ko/3.7/library/base64.html

 

base64 — Base16, Base32, Base64, Base85 데이터 인코딩 — Python 3.7.9 문서

base64 — Base16, Base32, Base64, Base85 데이터 인코딩 소스 코드: Lib/base64.py 이 모듈은 바이너리 데이터를 인쇄 가능한 ASCII 문자로 인코딩하고 이러한 인코딩을 다시 바이너리 데이터로 디코딩하는 함

docs.python.org

 

 

 

[백준/C++] Q15552. 빠른 A+B

 

 문제 

본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.

C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.

Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.

또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.


 입력 

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

 출력 

각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.

 

  관련 개념  

https://algospot.com/forum/read/2496/

 

cin과 scanf의 성능 차이가 꽤 많이 나기 때문에

cin을 사용했을 때

시간 초과나 런타임 에러가 많이 뜨게 된다.

 

cin,cout 사용 전

 ios_base::sync_with_stdio(false); 

 cin.tie(NULL); / cout.tie(NULL); 

를 추가하면 입출력 속도가 단축된다.

 

 

 ios_base::sync_with_stdio(false) 

 

sync_with_stdio란 C++ 스트림과 C 스트림을 동기화시킨다는 의미로,

동기화된다면 C와 C++의 입출력 연산을 혼합하여 사용할 수 있다.

 

동기화하지 않았을 경우 혼합하여 사용한다면 입출력 순서가 보장되지 않지만

입출력 연산 속도를 단축시킬 수 있다.

 

 

 cin.tie(NULL) / cout.tie(NULL) 

 

기본적으로 cin과 cout은 스트림 버퍼를 공유하고 있기 때문에

입출력 연산 시 각각의 버퍼를 모두 확인하는 과정을 거친다.

 

NULL값을 주면 cin 또는 cout 실행 시 입출력 스트림 버퍼를 모두

확인하는 과정을 거치지 않으므로 입출력 연산 속도를 단축시킬 수 있다.

 

 

 

[백준/C++] Q9610. 사분면

 

 문제 

2차원 좌표 상의 여러 점의 좌표 (x,y)가 주어졌을 때, 각 사분면과 축에 점이 몇 개 있는지 구하는 프로그램을 작성하시오.

https://www.acmicpc.net/upload/images/quad.png

 입력 

첫째 줄에 점의 개수 n (1 ≤ n ≤ 1000)이 주어진다. 다음 n개 줄에는 점의 좌표 (xi, yi)가 주어진다. (-106 ≤ xi, yi ≤ 106)

 출력 

각 사분면과 축에 점이 몇 개 있는지를 예제 출력과 같은 형식으로 출력한다.

 

각 사분면마다 x,y좌표의 범위를 기준으로 조건을 나누어

어느 사분면에 있는지 판단하도록 하였다.

 

  관련 개념  

scanf와 scanf_s

- scanf: C의 표준 입력 함수

- scanf_s: scanf의 보안 문제를 보완한 입력 함수

 

scanf는 버퍼 오버플로우에 취약하다.

버퍼 오버플로우가 일어나면 프로그램이 중지되기 때문에

해커들이 이를 이용했다고.. 

 

그래서 scanf_s는 세 번째 인자로 버퍼 메모리의 크기를 지정해줌으로써

버퍼 오버플로우가 발생하지 않게 한다.

 

ex. 변수 입력

int x;

scanf_s("%d", &x, 1);

: 변수를 1개만 입력 받을 때는 자료형이 달라도 버퍼 메모리의 크기는 1로 지정해주면 된다.

 

ex. 배열 입력

int arr[10];

scanf_s("%d", arr, 10);: 크기가 10인 배열이므로 버퍼 메모리의 크기는 10으로 지정해주면 된다.

 

 

단, scanf 사용 시에는

 #pragma warning(disable:4996) 

을 추가해주면 scanf_s를 사용하지 않아 발생하는 오류를 무시할 수 있다.

 

또는

 #define _CRT_SECURE_NO_WARNINGS 

를 추가해주면 된다.

 

[백준/C++] Q6679. 싱기한 네자리 숫자

 

 문제 

싱기한 네자리 숫자란, [1000,9999]인 10진수 숫자중에서,  다음의 조건을 만족하는 숫자를 말한다.
  • 숫자를 10진수, 12진수, 16진수로 나타낸 다음, 각각의 숫자에 대해, 각 숫자의 자리수를 더했을 때, 세 값이 모두 같아야 한다.

여러분은 싱기한 네자리 숫자를 모두 출력해야 한다.

 입력 

입력은 주어지지 않는다.

 출력 

싱기한 네자리 숫자를 오름차순으로 한줄에 하나씩 출력한다.

 

숫자의 10진수, 12진수, 16진수 자리수의 합을 나타내는 sum 변수를 3개 두어

마지막에 세 숫자가 같은지 확인하는 방법을 사용하였다.

 

  관련 개념  

- 진법: 기수법 중 하나, 임의의 숫자를 이용하여 가중치를 두어 표현하는 방법.

- 진수: 진법으로 나타낸 수. 숫자의 우측 하단에 조그맣게 (진법) 을 표시한다.

 

10진수

통상 사용하는 수로, 1~9를 이용해 숫자를 표기함

ex. 999 = 9x10^2 + 9x10^1 + 9x10^0

 

12진수

1~9, A~C를 이용해 숫자를 표기함

ex. 9A9(12) = 9x12^2 + 10x12^1 + 9x12^0

 

16진수

1~9, A~F를 이용해 숫자를 표기함

ex. 9E9(16) = 9x16^2 + 14x16^1 + 9x16^0

 

 

  진수 변환 

모든 진수 변환은 10진수를 거쳐서 해야 한다.

ex. 2진수를 16진수로 변환: 2진수 → 10진수 → 16진수

 

10101(2) = 1x2^4 + 0x2^3 + + 1x2^2 + 0x2^1 + 1x2^0 = 21

21 = 15(16) = 1x16^1 + 5x16^0

이므로 10101(2) = 15(16)

 

 

 

'Algorithm' 카테고리의 다른 글

[백준/Python] Q20920. 영단어 암기는 괴로워  (0) 2021.02.23
[백준/Python] Q10941. BASE16 디코딩  (0) 2020.11.23
[백준/C++] Q15552. 빠른 A+B  (0) 2020.11.23
[백준/C] Q9610. 사분면  (0) 2020.11.23

+ Recent posts