2번 시험 성적

문제

시험 점수를 입력받아 90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F를 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 시험 점수가 주어진다. 시험 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

 

출력

시험 성적을 출력한다.

 

C++

#include <iostream>
using namespace std;
int main(){
    int score;
    cin >> score;
    char result;
    if (score >= 90) {
        result = 'A';
    }
    else if (score >= 80){
        result = 'B';
    }
    else if (score >= 70){
        result = 'C';
    }
    else if (score >= 60){
        result = 'D';
    }
    else {
        result = 'F';
    }
    cout << result;
    return 0;
}

 

C#

using System;
class Program{
    static void Main(string[] args){
        int score = int.Parse(Console.ReadLine());
        char result;
        if (score >= 90)
            result = 'A';
        else if (score >= 80)
            result = 'B';
        else if (score >= 70)
            result = 'C';
        else if (score >= 60)
            result = 'D';
        else
            result = 'F';
        Console.WriteLine(result);
    }
}

 

Python

score = int(input());
if score >= 90: 
    result = 'A'
elif score >= 80:
    result = 'B'
elif score >= 70:
    result = 'C'
elif score >= 60:
    result = 'D'
else:
    result = 'F'
print(result);

 

파이썬에서 조건문을 사용할 때는 들여 쓰기에 주의해야 한다.

 

Node.js

const fs = require('fs');
const inputData = fs.readFileSync('/dev/stdin').toString().trim();
const score = parseInt(inputData, 10);
let result;
if (score >= 90)
    result = 'A';
else if (score >= 80)
    result = 'B';
else if (score >= 70)
    result = 'C';
else if (score >= 60)
    result = 'D';
else 
    result = 'F';

console.log(result);

 

'fs' 모듈 사용해서 입력 처리

728x90
반응형

1번 두 수 비교하기

문제

두 정수 A와 B가 주어졌을 때, A와 B를 비교하는 프로그램을 작성하시오.

 

입력

첫째 줄에 A와 B가 주어진다. A와 B는 공백 한 칸으로 구분되어 있다.

 

출력

첫째 줄에 다음 세 가지 중 하나를 출력한다. 

- A가 B보다 큰 경우에는 '>'를 출력한다. 

- A가 B보다 작은 경우에는 '<'를 출력한다. 

- A와 B가 같은 경우에는 '=='를 출력한다.

 

C++

#include <iostream>
#include <string>
using namespace std;
int main(){
    int a, b;
    cin >> a;
    cin >> b;
    string result = "";
    if (a > b)
        result = ">";
    else if (a < b)
        result = "<";
    else
        result = "==";
    cout << result;
    return 0;
}

 

C#

using System;
class Program{
    static void Main(string[] args){
        string input = Console.ReadLine();
        string[] arr = input.Split(' ');
        int a = int.Parse(arr[0]);
        int b = int.Parse(arr[1]);
        if (a > b) input = ">";
        else if (a < b) input = "<";
        else input = "==";
        Console.WriteLine(input);
    }
}

 

Python

strInput = input()
arrInput = strInput.split(' ')
a = int(arrInput[0])
b = int(arrInput[1])
if a > b: 
    c = ">"
elif a < b: 
    c = "<"
else: 
    c = "=="
print(c);

 

파이썬의 경우 조건문 작성 시

if 조건 :

elif 조건 :

else :

 

방식으로 작성한다. 그리고 중요한 점은 파이썬의 변수의 범위는 함수 단위로 이루어지기 때문에 조건문 내부에서 선언된 c는 외부에서도 접근이 가능하다. 하지만 함수 내에서 변수를 선언했다면 외부에서 접근할 수 없다.

 

Node.js

const readline = require('readline');
const rl = readline.createInterface({
    input:process.stdin,
    output:process.stdout
});

rl.question('', (answer) =>{
    let input = answer;
    let arr = input.split(' ');
    let a = parseInt(arr[0], 10);
    let b = parseInt(arr[1], 10);
    let result;
    if (a > b) {
        result = ">";   
    }
    else if (a < b) {
        result = "<";    
    }
    else {
        result = "==";  
    } 
    process.stdout.write(result);
    rl.close();
});

 

node.js 에서 입력은 모듈을 사용하여 처리한다.

 

1. 'readline' 모듈을 사용하여 입력 인터페이스를 생성한다.

2. 'rl.question'을 사용하여 사용자로부터 숫자를 입력받는다.

 

더 축약한 코드

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.question('', (answer) => {
    const [a, b] = answer.split(' ').map(Number);
    const result = (a > b) ? '>' : (a < b) ? '<' : '==';
    process.stdout.write(result);
    rl.close();
});

 

map을 사용하여 입력된 값을 저장하고 삼항 연산자로 조건을 비교하여 코드를 단축시켰다.

 

728x90
반응형

11번 "꼬마 정민"

문제

꼬마 정민이는 이제 A + B 정도는 쉽게 계산할 수 있다. 이제 A + B + C를 계산할 차례이다!

 

입력

첫 번째 줄에 A, B, C (1 ≤ A, B, C ≤ 10^12)이 공백을 사이에 두고 주어진다.

 

출력

A+B+C의 값을 출력한다.

 

C++

#include <iostream>
using namespace std;
int main(){
    long long a,b,c;
    cin >> a;
    cin >> b;
    cin >> c;
    cout << a+b+c;
    return 0;
}

 

int 타입은 최대 - 2^31 ~ 2^31−1까지의 정수를 저장할 수 있는데 입력받을 수 있는 수의 범위는 10^12이므로 이를 저장할 수 있는 long long 타입을 사용한다. (long long은 -2^63 ~ 2^63 −1까지)

 

C#

using System;
class Program{
    static void Main(string[] args){
        string str = Console.ReadLine();
        string[] arr = str.Split(" ");
        long a = long.Parse(arr[0]);
        long b = long.Parse(arr[1]);
        long c = long.Parse(arr[2]);
        Console.WriteLine(a+b+c);
    }
}

 

C#의 int 범위는 - 2^31  ~ 2^31-1, long 범위는 -2^31 ~ 2^31-1이다

 

Python

str = input()
arr = str.split(' ')
a = int(arr[0])
b = int(arr[1])
c = int(arr[2])
print(a+b+c)

 

파이썬의 경우 int는 임의 정밀도로 정해진 범위가 없고 사용할 수 있는 만큼 값을 가질 수 있다.

 

12번 "고양이"

\, ' 등의 문자에 주의하며 고양이를 출력하는 문제

 

문제

아래 예제와 같이 고양이를 출력하시오.

 

입력

없음.

 

출력
고양이를 출력한다.

\    /\
 )  ( ')
(  /  )
 \(__)|

 

예제의 고양이와 동일하게 출력을 하면 되는 문제이다.

 

C++

#include <iostream>
using namespace std;
int main(){
    cout << "\\    /\\" << endl;
    cout << " )  ( \')" << endl;
    cout << "(  /  ) " << endl;
    cout << " \\(__)|" << endl;
    return 0;
}

 

백슬래시(\), 작은따옴표('), 큰 따옴표(") 등의 문자는 문자열 내에서 별도의 기능을 가질 수 있는 문자들은 문자 자체로 사용하기 위해서는 앞에 백슬래시를 추가해서 이스케이프 시퀀스를 사용해야 한다.

 

C#

using System;
class Program{
    static void Main(string[] args){
        Console.WriteLine("\\    /\\");
        Console.WriteLine(" )  ( \')");
        Console.WriteLine("(  /  )");
        Console.WriteLine(" \\(__)|");
    }
}

 

C#도 동일하게 이스케이프 시퀀스를 사용해서 표현한다.

 

Python

print("\\    /\\")
print(" )  ( \')")
print("(  /  )")
print(" \\(__)|")

 

이스케이프 시퀀스는 여러 프로그래밍 언어에서 비슷한 목적을 가지고 사용되지만, 모든 언어에서 동일하게 사용되지는 않는다. 대부분의 경우 C 언어에서 유래한 이스케이프 표준을 따르면서 각 언어마다 고유한 확장이나 차이를 가지고 있다.

 

13번 개

", `, \ 등의 문자에 주의하며 개를 출력하는 문제

 

문제

아래 예제와 같이 개를 출력하시오.

 

입력

없음.

 

출력

개를 출력한다.

|\_/|
|q p|   /}
( 0 )"""\
|"^"`    |
||_/=\\__|

 

C++

#include <iostream>
using namespace std;
int main(){
    cout << "|\\_/|" << endl;
    cout << "|q p|   /}" << endl;
    cout << "( 0 )\"\"\"\\" << endl;
    cout << "|\"^\"`    |" << endl;
    cout << "||_/=\\\\__|" << endl;
    return 0;
}

 

 

C#

using System;
class Program{
    static void Main(string[] args){
        Console.WriteLine("|\\_/|");
        Console.WriteLine("|q p|   /}");
        Console.WriteLine("( 0 )\"\"\"\\");
        Console.WriteLine("|\"^\"`    |");
        Console.WriteLine("||_/=\\\\__|");
    }
}

 

Python

print("|\\_/|");
print("|q p|   /}");
print("( 0 )\"\"\"\\");
print("|\"^\"`    |");
print("||_/=\\\\__|");
728x90
반응형

8번 "1998년생인 내가 태국에서는 2541년생?!"

식을 직접 세워서 계산하는 문제

 

문제

ICPC Bangkok Regional에 참가하기 위해 수완나품 국제공항에 막 도착한 팀 레드시프트 일행은 눈을 믿을 수 없었다. 공항의 대형 스크린에 올해가 2562년이라고 적혀 있던 것이었다. 불교 국가인 태국은 불멸기원(佛滅紀元), 즉 석가모니가 열반한 해를 기준으로 연도를 세는 불기를 사용한다. 반면, 우리나라는 서기 연도를 사용하고 있다. 불기 연도가 주어질 때 이를 서기 연도로 바꿔 주는 프로그램을 작성하시오.

 

입력

서기 연도를 알아보고 싶은 불기 연도 y가 주어진다. (1000 ≤ y ≤ 3000)

 

출력

불기 연도를 서기 연도로 변환한 결과를 출력한다.

 

문제를 풀기 위해서는 불기와 서기의 차이에 대한 정보가 필요한데 제목에 힌트가 있다. 두 값의 차인 543의 값을 사용해서 불기를 서기로 표시할 수 있다.

 

"불기 - 543 = 서기"

 

C++

#include <iostream>
using namespace std;
int main(){
    int input;
    cin >> input;
    cout << input - 543;
}

 

C#

using System;
class Program{
    static void Main(string[] args){
        string input = Console.ReadLine();
        int val = int.Parse(input);
        Console.WriteLine(val - 543);
    }
}

 

Python

str = input()
val = int(str)
print(val - 543)

 

C#과 Python의 경우에는 입력은 문자열로만 반환되기 때문에 이를 정수계산하기 위해서는 타입 변환의 과정이 필요하다.

 

9번 "나머지"

문제

(A+B)%C는 ((A%C) + (B%C))%C 와 같을까? (A×B)%C는 ((A%C) × (B%C))%C 와 같을까? 세 수 A, B, C가 주어졌을 때, 위의 네 가지 값을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 A, B, C가 순서대로 주어진다. (2 ≤ A, B, C ≤ 10000)

 

출력

첫째 줄에 (A+B)%C, 둘째 줄에 ((A%C) + (B%C))%C, 셋째 줄에 (A×B)%C, 넷째 줄에 ((A%C) × (B%C))%C를 출력한다.

 

C++

#include <iostream>
using namespace std;
int main(){
    int a, b, c;
    cin >> a;
    cin >> b;
    cin >> c;
    cout << (a+b)%c << endl;
    cout << ((a%c)+(b%c))%c << endl;
    cout << (a*b)%c << endl;
    cout << ((a%c)*(b%c))%c << endl;
    return 0;
}

 

C#

using System;
class Program{
    static void Main(string[] args){
        string input = Console.ReadLine();
        string[] arr = input.Split(" ");
        int a = int.Parse(arr[0]);
        int b = int.Parse(arr[1]);
        int c = int.Parse(arr[2]);
        
        Console.WriteLine((a+b)%c);
        Console.WriteLine(((a%c)+(b%c))%c);
        Console.WriteLine((a*b)%c);
        Console.WriteLine(((a%c)*(b%c))%c);
    }
}

 

Python

str = input();
arr = str.split(" ");
a = int(arr[0]);
b = int(arr[1]);
c = int(arr[2]);
print((a+b)%c);
print(((a%c)+(b%c))%c);
print((a*b)%c);
print(((a%c)*(b%c))%c);

 

이 문제는 받아쓰기만 틀리지 않고 잘하면 어려움이 없는 문제였다.

 

10번 "곱셈"

문제

(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.

https://www.acmicpc.net/problem/2588

 

(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세 자리 자연수가 주어진다.

 

출력

첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

 

우선 입력받은 두 값을 곱셈하여 저장해 놓고 첫 번째 입력받은 값을 기준으로 하고 두 번째 입력값을 자릿수별로 잘라서 변수에 저장한다. 그리고 각 자릿수마다 기준 값과 곱한 값을 출력하고 처음 계산한 곱셈을 출력하면 될듯하다.

 

C++

#include <iostream>
#include <string>
using namespace std;
int main(){
    int val1;
    int val2;
    cin >> val1;
    cin >> val2;
    int result4 = val1*val2;
    
    string str = to_string(val2);
    int a = str[2] - '0';
    int b = str[1] - '0';
    int c = str[0] - '0';
    
    int result1 = val1*a;
    int result2 = val1*b;
    int result3 = val1*c;
    
    cout << result1 << endl;
    cout << result2 << endl;
    cout << result3 << endl;
    cout << result4 << endl;
    
    return 0;
}

 

C#

using System;
class Program{
    static void Main(string[] args){
        string str_1 = Console.ReadLine();
        string str_2 = Console.ReadLine();
        
        int val_1 = int.Parse(str_1);
        int val_2 = int.Parse(str_2);
        int a = (int)char.GetNumericValue(str_2[2]);
        int b = (int)char.GetNumericValue(str_2[1]);
        int c = (int)char.GetNumericValue(str_2[0]);
        
        int result_1 = val_1 * a;
        int result_2 = val_1 * b;
        int result_3 = val_1 * c;
        int result_4 = val_1 * val_2;
        
        Console.WriteLine(result_1);
        Console.WriteLine(result_2);
        Console.WriteLine(result_3);
        Console.WriteLine(result_4);
    }
}

 

C#에서 단일 문자의 경우 int.Parse는 에러가 발생한다. 따라서 문자를 정수로 전환하기 위해서 char.GetNumericValue를 사용한다. 

 

또는 문자가 숫자일 경우에는 아스키코드를 활용해서 정수로 변환할 수 있다.

아스키코드에서 '0' 문자는 48이다. 그리고 그 뒤로 연속으로 값이 증가하는데 즉 '1' - '0' = 49 - 48 이므로 결과는 1로 정수 값을 구할 수 있게 된다.

 

int a = (int)char.GetNumericValue(str_2[2]);
int b = (int)char.GetNumericValue(str_2[1]);
int c = (int)char.GetNumericValue(str_2[0]);

// ASCII
int a = str_2[2] - '0';
int b = str_2[1] - '0';
int c = str_2[0] - '0';

 

Python

str_1 = input()
str_2 = input()
val_1 = int(str_1)
val_2 = int(str_2)
a = int(str_2[2])
b = int(str_2[1])
c = int(str_2[0])
result_1 = val_1 * a
result_2 = val_1 * b
result_3 = val_1 * c
result_4 = val_1 * val_2
print(result_1)
print(result_2)
print(result_3)
print(result_4)
728x90
반응형

7번 사칙연산 응용

문제

준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때, 놀람을 표현하는 프로그램을 작성하시오.

 

입력

첫째 줄에 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어진다. 아이디는 알파벳 소문자로만 이루어져 있으며, 길이는 50자를 넘지 않는다.

 

출력

첫째 줄에 준하의 놀람을 출력한다. 놀람은 아이디 뒤에 ??!를 붙여서 나타낸다.

 

문제를 정리하면 채점시 이미 존재하는 아이디가 입력되고, 입력한 값 뒤에 ??! 를 붙여서 출력하면 된다.

 

C++

#include <iostream>
#include <string>
using namespace std;
int main(){
    string id;
    cin >> id;
    cout << id+"??!";
    return 0;
}

 

입력받은 문자열 뒤에 "??!"를 붙여서 출력한다.

 

C#

using System;
class Program{
    static void Main(string[] args){
        string id = Console.ReadLine();
        Console.WriteLine(id+"??!");
    }
}


Python

id = input();
print(id+"??!")

 

728x90
반응형

6번

문제

두 자연수 A와 B가 주어진다. 이때, A+B, A-B, A*B, A/B(몫), A% B(나머지)를 출력하는 프로그램을 작성하시오.

 

입력

두 자연수 A와 B가 주어진다. (1 ≤ A, B ≤ 10,000)

 

출력

첫째 줄에 A+B, 둘째 줄에 A-B, 셋째 줄에 A*B, 넷째 줄에 A/B, 다섯째 줄에 A%B를 출력한다.

 

C++

#include <iostream>
using namespace std;
int main(){
    int a,b;
    cin >> a;
    cin >> b;
    cout << a+b << endl;
    cout << a-b << endl;
    cout << a*b << endl;
    cout << a/b << endl;
    cout << a%b << endl;
    
    return 0;
}

 

줄바꾸기 endl 사용

 

C#

using System;
class Program{
    static void Main(string[] args){
        string input = Console.ReadLine();
        string[] arr_input = input.Split(' ');
        int a = int.Parse(arr_input[0]);
        int b = int.Parse(arr_input[1]);
        Console.WriteLine(a+b);
        Console.WriteLine(a-b);
        Console.WriteLine(a*b);
        Console.WriteLine(a/b);
        Console.WriteLine(a%b);
    }
}

 

ReadLine으로 입력을 한 줄로 받고 string.Split을 사용해서 공백으로 두 값을 구분하여 사용한다.

 

Python

str = input()
arr = str.split(' ')
a = int(arr[0])
b = int(arr[1])
print(a+b, a-b, a*b, a//b, a%b, sep='\n')

 

파이썬의 경우 '/' , '//' 연산자가 존재한다.

앞의 두 언어들은 연산하는 두 값이 모두 int 타입이기 때문에 / 연산자를 사용하여 계산하게 되면 결과도 정수형으로 반환되기 때문에 소수점은 버려지게 된다. 하지만 파이썬의 경우 정수형간의 나눗셈은 float으로 반환하기 때문에 문제에서 몫만을 출력해야 하고 이를 위해서는 몫을 구하는 연산자 '//'를 사용해야 한다.

 

728x90
반응형

1번

문제

Hello World! 를 출력하시오.

 

출력

Hello World! 를 출력하시오.

 

C++

#include <iostream>
using namespace std;
int main(){
    cout << "Hello World!";
    return 0;
}

 

C++ 너무 오랜만에 하다 보니 처음에 입출력 라이브러리 이름이 기억이 안 났다.

iosteam (input/output stream) 입력과 출력의 기능을 사용할 수 있는 라이브러리이다. 

cout을 사용하려면 std:: 네임스페이스를 사용해야 하는데 이걸 생략하기 위해서 using으로 네임스페이스를 선언한다.

 

C#

using System;
class Program{
    static void Main(string[] args){
        Console.WriteLine("Hello World!");
    }
}


System 네임스페이스에 포함된 Console 클래스의 함수인 WirteLine을 사용해서 문자를 출력한다.

 

Python

print("Hello World!")


이렇게 보니 파이썬의 간단함에 새삼스럽게 놀란다.

 

2번

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

출력

첫째 줄에 A+B를 출력한다.

 

C++

#include <iostream>
using namespace std;
int main(){
    int a, b;
    cin >> a;
    cin >> b;
    cout << a + b;
}

 

입력받은 값을 저장하기 위한 변수 a, b 선언 후 합을 출력

 

C#

using System;
class Program
{
    static void Main(string[] args)
    {
        string str = Console.ReadLine();
        string[] arr = str.Split(' ');
        int a = int.Parse(arr[0]);
        int b = int.Parse(arr[1]);
        Console.WriteLine(a + b);
    }
}

 

채점 시 한 줄에 두 값을 모두 주기 때문에 Read 사용 시 입력을 제대로 받지 못한다.

따라서 문자열로 받은 다음 값을 잘라서 정수로 변환하여 출력하여야 한다.

 

Python

str = input()
arr = str.split(' ')
a = int(arr[0])
b = int(arr[1])
print(a+b)

 

파이썬도 마찬가지로 문자로 입력받은 다음 값을 잘라서 처리한다.

 

4번 문제까지는 연산 기호만 달라서 문제만 풀고 따로 남기지 않는다.

 

5번

문제

두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

출력

첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10의 -9승 이하이면 정답이다.

 

C++

#include <iostream>
using namespace std;
int main(){
    double a, b;
    cin >> a;
    cin >> b;
    double res = a/b;
    cout.precision(10);
    cout << res;
}

 

소수점 자릿수를 정확하게 출력하기 위해서 추가 작업이 필요하다.

 

오차를 인정하는 범위가 있기 때문에 소수점 9자리까지 구해야 한다.

 

cout.precision(n)은 n자리까지 정수부+소수부의 n개까지의 수를 표시해 준다.

 

문제에서 대입하는 수의 범위는 나누었을 때 정수부가 1자리 이하이기 때문에 precision(10)을 하면 소수점 9자리까지 나오게 된다.

 

C#

using System;
class Program
{
    static void Main(string[] args)
    {
        string str = Console.ReadLine();
        string[] arr = str.Split(' ');
        double a = double.Parse(arr[0]);
        double b = double.Parse(arr[1]);
        Console.WriteLine(a / b);
    }
}

 

float의 정확도는 7번째 자리이기 때문에 double을 사용한다.

 

Python

str = input()
arr = str.split(' ')
a = float(arr[0])
b = float(arr[1])
print(a/b)

 

파이썬의 경우 double은 따로 없으며 float이 C의 double을 기반으로 15자리까지의 정확도를 가진다.

 

그 이상의 자릿수를 사용하기 위해서는 별도의 모듈인 decimal을 사용해야 한다.

 

 

728x90
반응형

딕셔너리는 해시 테이블 또는 키, 밸류라고 부른다. 

데이터는 중괄호 안에 선언되며 키와 밸류는 콜론으로 구분된다.

 

>>> dic_1 = {"key_1": 'value_1', 'key_2':"value_2"}
>>> dic_1["key_1"]
'value_1'
>>> dic_1['key_1']
'value_1'
>>> dic_1["key_2"]
'value_2'

키는 큰 따옴표 또는 작은따옴표를 사용해 선언할 수 있다.

키값의 경우 보통 문자열, 숫자, 튜플 등이 사용되고 밸류에는 어떠한 데이터 타입도 사용할 수 있다. 

 

딕셔너리의 특징은 맵 형식이기 때문에 순서가 보장되지 않는다. 따라서 인덱스를 통한 요소의 접근이나 첫 번째, 마지막 등의 순서가 필요한 정보에 대해서는 접근이 불가능하며 키값을 사용해서 접근해 사용한다.

 

>>> dic_1[0]
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    dic_1[0]
KeyError: 0

 

중복된 이름의 키를 사용하게 될 경우 에러는 발생하지 않지만 앞에 선언된 키, 밸류가 뒤에 값으로 덮어씌워진다.

 

>>> dic_2 = {'key_1':'val_1','key_1':'val_2'}
>>> dic_2['key_1']
'val_2'
>>> len(dic_2)
1

딕셔너리의 요소 개수를 반환하는 함수인 len()을 사용하면 앞에 선언된 요소가 존재하지 않는걸 알 수 있다.

 

 

728x90
반응형

튜플은 리스트처럼 배열로 요소를 저장할 수 있다.

요소를 선언할 때는 값을 콤마로 구분해서 저장이 가능하며 이때 소괄호를 사용해서 값을 감싸서 튜플로 표시하는 게 일반적이다.

>>> tuple_1 = 1, 2, 3
>>> tuple_2 = 4,
>>> tuple_3 = (5, 6, 7)
>>> tuple_1
(1, 2, 3)
>>> tuple_2
(4,)
>>> tuple_3
(5, 6, 7)

 

이렇게 튜플에 값을 할당하는것을 패킹이라고 한다.

 

이 튜플은 한 번에 여러 개의 변수에 값을 할당하는 게 가능한데 이것을 언패킹이라고 한다.

 

>>> tuple_1 = 4, 5, 6
>>> x, y, z = tuple_1
>>> x, y, z
(4, 5, 6)

 

불변성

튜플이 리스트와 다른 점은 선언된 이후에 값의 수정이 불가능하다.

>>> tuple_1 = 1, 2, 3
>>> tuple_1[0] = 4
Traceback (most recent call last):
  File "<pyshell#38>", line 1, in <module>
    tuple_1[0] = 4
TypeError: 'tuple' object does not support item assignment
>>> tuple_1 = 4, 5, 6
>>> tuple_1[0]
4
>>>

튜플의 요소에 인덱스로 접근하여 값을 변경하면 에러가 발생하지만 새로 값을 할당하는 것은 문제가 되지 않는다.

 

 

이러한 튜플의 특징을 활용해서 런타임에 값이 변하면 안 되는 정보를 저장하거나 또는 하나 이상의 정보가 조합을 이룰 때 의미를 가지는 데이터를 저장할 때 사용된다.

 

>>> tuple_1 = 4, 5, 6
>>> x, y, z = tuple_1
>>> x, y, z
(4, 5, 6)
>>> vector3 = (10, 2, -4)
>>> x, y, z = vector3
>>> x
10
>>> y
2
>>> z
-4
>>> x, y, z
(10, 2, -4)

 

 

여래 값을 전달할 수 있기 때문에 함수에서 여러 개의 값을 반환하거나 또는 매개변수로 전달이 필요할 때 등 다양하게 활용이 가능하다.

 

728x90
반응형

프로그래머들은 각자의 개발 철학을 가지고 있다.

프로그래밍 언어들의 다양한 특징들은 개발자들의 철학을 배경으로 만들어지게 된다.

 

파이썬 또한 개발자의 철학이 담겨 있는 프로그래밍 언어이다. 그 철학은 pep-20으로 알려진 문서에 담겨있다.

 

PEP 20 – The Zen of Python

문서의 제목을 번역하면 파이썬의 선이다.

여기서 선은 불교용어 선(禪)이다. 서구권에 선이라는 개념을 정착시킨게 일본 불교학자이다 보니 일본식 발음인 젠(zen)이 고유명사가 되었는데 문서에서 사용된 뜻이 불교의 선과 동일한 의미를 가지기 보다는 파이썬의 개발 철학이나 가치와 원칙 등 방향성을 나타내는 의미로 쓰인거같다. 제목도 일반적인 문서스럽지 않은데 이는 파이썬의 공식 문서 대부분이 비슷한 느낌을 준다.

 

문서의 저자를 보고 Tim Peters가 파이썬을 만든사람인줄 알았지만 알고보니 파이썬의 초기 개발자는 Guido van Rossum(귀도 반 로섬)이라는 네덜란드 개발자였다.

 

Foreword for "Programming Python"

 

파이썬의 서문에서는 탄생 배경에 대한 인터뷰 내용이 있다. 심심했던 그는 ABC 언어에 영감을 받고 취미로 만들기 시작했다고 하는데 그렇게 만들어진 언어가 지금까지도 많은 사람들에게 사용된다는게 그의 천재적인 면모가 보인다.

 

다시 파이썬의 선으로 돌아가서 저자인 Tim Peters는 파이썬 초기 설계부터 현재까지 개발과 커뮤니티에 많은 영향을 준 인물이다. 해당 문서는 커뮤니티에 파이썬의 가치와 철학을 공유하고 강조하기 위해서 작성되었으며 커뮤니티 안에서 협업할 때 지켜야할 원칙을 정리하고 제시하는 목적을 가지고 있다.

작성 배경이 그렇다보니 문서의 내용이 다소 가볍고 사용되는 표현들도 유머러스함이 보인다. 

 

Beautiful is better than ugly. (아름다운 것이 추한 것보다 낫다.)
Explicit is better than implicit. (명시적인 것이 암시적인 것보다 낫다.)
Simple is better than complex. (간결한 것이 복합적인 것보다 낫다.)
Complex is better than complicated. (복합적인 것이 복잡한 것보다 낫다.)
Flat is better than nested. (수평적인 것이 내포된 것보다 낫다.)
Sparse is better than dense. (여유로운 것이 밀집된 것보다 낫다.)
Readability counts. (가독성은 중요하다.)
Special cases aren't special enough to break the rules.
(특별한 경우들은 규칙을 어길 정도로 특별하지 않다.)
Although practicality beats purity. (실용성은 순수성을 이긴다.)
Errors should never pass silently. (에러는 절대로 조용히 지나가지 않는다.)
Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess.
(명시적으로 오류를 감추려는 의도가 아니라면 모호함을 대할 때, 이를 추측하려는 유혹을 거부하라.)
There should be one-- and preferably only one --obvious way to do it.
(명확하고 가급적이면 유일한 하나의 방법은 항상 존재한다.)
Although that way may not be obvious at first unless you're Dutch.
(네덜란드인이 아니면 비록 그 방법이 처음에는 명확해 보이지 않더라도. (네덜란드인은 
귀도 반 로섬을 의미하는것 같다.))
Now is better than never. (지금 행동에 옮기는 것이 아예 안 하는 것보다는 낫다.)
Although never is often better than *right* now.
(비록 아예 안 하는 것이 지금 *당장* 하는 것보다 나을 때도 많지만.)
If the implementation is hard to explain, it's a bad idea. (구현 결과를 설명하기 쉽지 않다면, 그것은 나쁜 아이디어이다.)
If the implementation is easy to explain, it may be a good idea.
(구현 결과를 설명하기 쉽다면, 그것은 좋은 아이디어일지도 모른다.)
Namespaces are one honking great idea -- let's do more of those!
(네임스페이스는 정말 훌륭한 아이디어다 -- 더 많이 사용하자!)

 

문서에서 반복해서 명확성, 간결성, 가독성을 강조한다. 이러한 철학으로 인해서 문법면에서는 엄격하며 이를 위한 스타일 가이드도 있다. (PEP 8)  이러한 코드 스타일들은 대부분 기술적인 제한 보다는 프로그래머들간에 지켜야할 관례이다.

 

예를 들어서 상수의 경우 모두 대문자로 표기하는 것을 규칙으로 한다.

하지만 일반 변수를 모두 대문자로 표기하고 그 값을 마음대로 바꾸어 사용한다고해서 실행이 안되거나 하지 않지만 다른 프로그래머들에게는 상수의 값이 변경되는 예상하지 못한 동작이 될 수 있고 이는 파이썬의 철학과 반대되는 행동이라 볼 수 있다.

 

 

728x90
반응형

+ Recent posts