흔하디 흔한 if-else문을 익히는 문제이다.

다만 이렇게 정리하는 이유는 원래 사용하던 C/C++이었으면 금방 풀었을텐데, 

아직도 2개 이상의 입력받기를 할 때 python으로 처리하는 방법이 계속 햇갈려서이다.

정리겸 한 번 올리기로 한다.

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


예제 입력에서 "name value"의 형태로 입력받는 부분이 계속 햇갈린다..

그냥 scanf로 받으면 되는 C/C++과는 살짝 다르게 python을 받기 때문이다.

중요한 것은 split()을 사용하고, 각각의 변수에 이를 통해서 저장하도록 만들어야 한다는 점이다.

즉, 다음과 같은 형태가 필요하다.

1
name, score = input().split()
cs

 

결국 내가 만든 정답코드는 다음과 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
repeat = int(input())
for i in range(0, repeat):
    name, score = input().split()  # 이 부분이 중요. 2개 이상 입력받기를 계속 햇갈리는 중...2021-7-16
    # print(name, score, sep=' ')
    if int(score) >= 97:
        grade = "A+"
    elif int(score) <= 96 and int(score) >= 90:
        grade = "A"
    elif int(score) <= 89 and int(score) >= 87:
        grade = "B+"
    elif int(score) <= 86 and int(score) >= 80:
        grade = "B"
    elif int(score) <= 79 and int(score) >= 77:
        grade = "C+"
    elif int(score) <= 76 and int(score) >= 70:
        grade = "C"
    elif int(score) <= 69 and int(score) >= 67:
        grade = "D+"
    elif int(score) <= 66 and int(score) >= 60:
        grade = "D"
    else:
        grade = "F"
    print(name, grade, sep=' ')
 
cs

문제는 내가 바보라서 일일이 int(score)를 elif에 넣었다는 것이다.

그냥 간단하게 ....

1
score = int(score)
cs

이렇게 한 다음 elif문에 score만 넣으면 되는 것을....

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
repeat = int(input())
for i in range(0, repeat):
    name, score = input().split()  # 이 부분이 중요. 2개 이상 입력받기를 계속 햇갈리는 중...2021-7-16
    # print(name, score, sep=' ')
    score = int(score)  # 이렇게 하나만 넣으면 score는 int형으로 변환이 된다.
    if score >= 97:
        grade = "A+"
    elif score <= 96 and score >= 90:
        grade = "A"
    elif score <= 89 and score >= 87:
        grade = "B+"
    elif score <= 86 and score >= 80:
        grade = "B"
    elif score <= 79 and score >= 77:
        grade = "C+"
    elif score <= 76 and score >= 70:
        grade = "C"
    elif score <= 69 and score >= 67:
        grade = "D+"
    elif score <= 66 and score >= 60:
        grade = "D"
    else:
        grade = "F"
    print(name, grade, sep=' ')
cs

 

 

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

 

11367번: Report Card Time

The input will begin with a single line containing just a whole number, n, of the number of hobbits in the class, followed by n lines in the form a b, where a is the hobbit’s name (only alphabetical characters) and b is the hobbit’s grade, given as a w

www.acmicpc.net

 

매우 단순한 수학문제임에도 불구하고 몇 번이고 틀려서 계속 고민하다가 겨우 왜 그런지 알게된 문제라서 이렇게 정리를 해본다.

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

문제를 보다시피 매우 간단한 문제이다.

다만, 한 가지를 간과한 것이 있어서 계속 틀렸다.

숫자가 예제에서 "8 14" 라고 되어있는데, 잊지 말자... "14 8"도 들어갈 수 있고, "13, 14"도 들어갈 수 있음을...

 

처음에 그래서 매우 간단하게 만든 코드이자 계속 틀렸다고 나온 코드가 다음의 코드이다.

(물론, 위에서 주어진 예제인 "8 14"는 무척이나 잘 돌아간다...)

1
2
3
4
5
num1, num2 = list(map(int, input().split()))
btw_num = num2-num1-1
print(btw_num)
for i in range(num1+1, num2):
    print(i, end=' ')
 

 

그리고 max와 min값을 새로 처리해서 만들어야 한다.

결국 다음과 같은 코드가 정답인 코드이다.

1
2
3
4
5
6
7
8
9
10
a, b = list(map(int, input().split()))
num2 = max(a, b)
num1 = min(a, b)
btw_num = num2-num1-1
if num1 == num2 or num1+1 == num2:
    btw_num = 0
print(btw_num)
for i in range(num1+1, num2):
    print(i, end=' ')
 
cs

 

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

 

10093번: 숫자

두 양의 정수가 주어졌을 때, 두 수 사이에 있는 정수를 모두 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

파이썬을 최근에 처음부터 배우기 시작하면서 기능을 하나씩 알아가고 있는 중이다.

 

이 문제는 특히 n진수를 10진수의 숫자로 변환을 하는 방법이다.

 

원래 C언어에서라면 일일이 배열로 받고, 그것을 다시 10진수로 처리해야하는 과정이 있었겠지만,

파이썬에서는 input으로 수를 받고, 그것을 int()를 통해서 밑을 n이라는 수로 받음으로써 쉽게 처리할 수 있다.

 

 

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

 


 

1
2
3
4
5
# 파이썬에서는 binary를 input으로 입력을 받고, 이를 int를 통해서 binary변수의 수를 밑이 2인 것으로 하여 변환이 가능하다.
for i in range(0int(input())):
    binary = input()
    print(int(binary, 2))  # 밑(2가 있는 자리)을 어떤 수로 해서 처리할 것인지 
 
cs

 

삭제 명령

명령 설명
x 커서 위치 문자 삭제
X 커서 위치 이전 문자 삭제
dw 커서 위치부터 단어 끝까지 삭제
dd 커서 위치 행 삭제
d$ 혹은 D 커서 위치부터 행의 끝까지 삭제
d0 현재 행의 처음부터 커서 위치 앞 문자까지 삭제
dG 현재 행부터 문서의 끝까지 삭제
:<block>d 지정된 <block> 삭제

복사 명령

명령 설명
yy 커서 위치 행 복사
p 복사한 내용을 커서 위치 다음 행에 붙여 넣기
y0 현재 행의 처음부터 커서 위치 앞 문자까지 복사
y$ 커서 위치부터 행의 끝까지 복사
yw 커서 위치부터 단어 복사
yG 현재 행부터 문서의 끝까지 복사
:<block> y <block>복사
:<block> co num  <block>을 복사하여 num 행 다음에 붙여 넣기

수정 명령

명령 설명
r 커서가 위치한 문자를 다른 문자로 수정
R 커서가 위치한 문자부터 다른 문자로 수정(덮어쓰기)
cw 커서가 위치한 문자부터 단어를 다른 단어로 수정
cc 커서가 위치한 행 전체를 수정
c0 현재 행의 처음부터 커서 위치 앞 문자까지 수정
c$ 커서가 위치한 문자부터 행 끝까지 수정
s 커서가 위치한 문자를 다른 문자열로 수정(추가하기)

 

입력 모드로 전환 명령

명령 설명
a 커서 위치 다음에 문자를 입력한다.
i 커서 위치 앞에 문자를 입력한다.
o 커서 위치 다음 행에 문자를 입력한다.
A 커서가 위치한 행의 맨 뒤에 문자를 입력한다.
I 커서가 위치한 행의 맨 앞에 문자를 입력한다.
O 커서 위치 이전 행에 문자를 입력한다.

저장 및 종료 명령

명령 설명
:w 현재 파일로 문서 저장
:w filename filename 파일로 문서 저장
:wq 문서 저장 후 vi 종료
:q! 문서를 저장하지 않고 vi 종료

 


커서 이동 명령

명령 설명 (커서를....~~~)
h 왼쪽으로 이동
j 아래로 이동
k 위로 이동
l 오른쪽으로 이동
w 오른쪽으로 한 단어 이동
b 왼쪽으로 한 단어 이동
e 오른쪽으로 한 단어 마지막 글자로 이동
0 현재 행의 맨 앞으로 이동
$ 현재 행의 맨 뒤로 이동
+ 다음 행의 첫 번째 문자 위치로 이동
- 이전 행의 첫 번째 문자 위치로 이동
G 문서의 마지막 행으로 이동
숫자 G 숫자에 해당하는 행으로 이동

페이지 단위 이동 명령

명령 설명 (커서를....~~~)
H 현재 페이지의 첫 행으로 이동
M 현재 페이지의 중간 행으로 이동
L 현재 페이지의 마지막 행으로 이동
ctrl + f 다음 페이지로 이동
ctrl + b 이전 페이지로 이동

 

Some important factors from "Concepts of Programming Languages (global edition) 11ed. - Robert W. Sebesta"

:Chapter 11, 12

 

(p.472) Abstraction is a weapon against the complexity of programming; its purpose is to simplify the programming process.

 

process abstraction: function/subporgrams

=> problem: side effect(touches variables other than itself  --> coupling modules occur)

⬥data abstraction: object-oriented

 

⬥an abstract data type is an enclosure that includes only the data representation of one specific data type and the subprograms that provide the operations for that type.(p.473)  ==>encapsulation, abstraction hiding

 

constructor(used to initialize the data members of newly created objects.) VS destructor(implicitly called when the lifetime of an instance of the class ends.)

 

interface vs implementation


There are three key features that Object-Oriented languages must provide:

: Abstract data type(ADT), inheritance, dynamic binding(polymorphism)

 

inheritance ==> customizing(reuse with modification): 1.override 2.add new member

 

productivity increase: 1.reuse 2.automation

 

class variables: only exist in class = not created in an instance

(if used in an instance, it means it has used the variable from a class)

class method: can call from a class without an instance

Some important factors from "Concepts of Programming Languages (global edition) 11ed. - Robert W. Sebesta"

:Chapter 6

 

FORTRAN: array & COBOL: record

 

primitive data types(4): integer, float, boolean, character

 

string operations: assignment, catenation, substring reference, comparison, pattern matching.

 

3 approaches to supporting the dynamic allocation and deallocation for dynamic length strings

-linked list

-store strings as arrays of pointers to individual characters allocated in the heap

-store complete strings in adjacent storage

 

2 types of structures(array, record) & tuple type/associative arrays

 

⬥purpose of pointers: indirect addressing, dynamic storage(dynamic variables in heap)

 

garbage(p.302): an allocated heap-dynamic variable that is no longer accessible to the user program

 

memory leakage: The first heap-dynamic variable is now inaccessible, or lost

 

dangling pointer: a pointer that contains the address of a heap-dynamic variable that has been deallocated.

 

eager approach(if count=0, retrieve immediately) VS lazy approach(if count=0, leave it and retreive later if short on memory)

 

Casting(explicit type conversion) VS Coercion(implicit/automatic type conversion)

 

strongly typed(make it compatible through casting=Java, C#) VS weakly typed(coersion=C)

 

name type equivalance(stronger) VS structure type equivalence

 

A data type defines a set of values and a collection of operations on those values. A type system is a set of types and the rules that govern their use in programs. Every typed programming language defines a type system.(p.317) 

 

 

Some important factors from "Concepts of Programming Languages (global edition) 11ed. - Robert W. Sebesta"

:Chapter 5

 

6 attributes of variables: name, address, value, type, lifetime, and scope.

 

Aliasing(3)

-C and C++ is with their union types

-when "call by reference," ==> actual/formal parameter have the same value

-two pointer variables have the same value

 

static type binding VS dynamic type binding

(cf) disadvantage of dynamic type binding: type finding check X, high cost)

 

storage bindings and lifetime

-static variables: global(non-local) variable / “static” local variable

-stack-dynamic variable: local variable

-explicit heap-dynamic variable

 

⬥purpose of functions: reuse(with modifications), process abstraction, information hiding

 

static scope: functions are allowed nesting(eg.ALGOL60)

  However, C-based languages do not allow nested subprograms.

 

referencing environment

-nesting O: local, global, non-local

-nesting X: local, global

 

Named constants: useful aids to readability and program reliability

 

Some important factors from "Concepts of Programming Languages (global edition) 11ed. - Robert W. Sebesta"

:Chapter 3, 4

 

context-free(one meaning for one lexeme) VS context-sensitive(one word having various meanings regarding the various situations)

 

BNF(Backus–Naur form)

p.139_an exampme of a BNF
p.140_A Grammar for a Small Language

The derivation of the program from above is as follows:

<program> => begin <stmt_list> end
 => begin <stmt> ; <stmt_list> end
 => begin <var> = <expression> ; <stmt_list> end
 => begin A = <expression> ; <stmt_list> end
 => begin A = <var> + <var> ; <stmt_list> end
 => begin A = B + <var> ; <stmt_list> end
 => begin A = B + C ; <stmt_list> end
 => begin A = B + ; <stmt> end
 => begin A = B + C ; <var> = <expression> end
 => begin A = B + C ; B = <expression> end
 => begin A = B + C ; B = <var> end
 => begin A = B + C ; B = C end

 

(cf) Derivations that use this order of replacement are called leftmost derivations.


⬥Hierarchical structures are called parse trees.

p.141_A Grammar for Simple Assignment Statements

From grammar of Example 3.2, through leftmost derivation, the following can be generated:

<assign> => <id> = <expr>
 => A = <expr>
 => A = <id> * <expr>
 => A = B * <expr>
 => A = B * ( <expr>)
 => A = B * ( <id> + <expr>)
 => A = B * ( A + <expr>)
 => A = B * ( A + <id>)
 => A = B * ( A + C )

 

Therefore, the following parse tree can be created:

p.142_Figure 3.1: a parse tree for A = B * (A + C)

There can be a unique parse tree or an ambiguous parse tree according to the grammar.

A unique parse tree will have an associativity of operaters(either lefts or right associativity)


lexical analysis: find a lexeme --> add a token --> transfer to syntax analyzer

 + 3 more factors(s skipping comments and white space outside lexemes, create symbol table, error-detect)

 

State transition diagram: similar to the finite automata from maths

 

Parsing: top-down(preorder/recursive-descent parser, LL) VS bottom-up(postorder, LR)

 

Syntax analysis purpose:

-check the input program to determine whether it is syntactically correct(=grammar checking)

-produce a complete parse tree(parsing)

 

Some important factors from "Concepts of Programming Languages (global edition) 11ed. - Robert W. Sebesta"

:Chapter 1, 2

 

Reasons for studying concepts of programming languages

-Increased capacity to express ideas

-Improved background for choosing appropriate languages

-Increased ability to learn new languages.

 

programming domains: scientific, business, artificial intelligence, web software

cost: training programmers, writing / compiling / executing programs

 

Computer Architecture

-machine codes consists of operator & operands

-von-Neumann: fetch->decode: fetch-execute(=instruction) cycle

-load, store, jump, ALU

 

programming lagnauges are often cateogorized into four bins: imperative, functional, logic, object oriented

 

⬥Digitalizing Analgogues(2): 1.sampling 2.quantization

 

3 ways of executing programs

: compilation, pure interpretation, hybrid implementation system(using the Just-In-Time compiler)

 

intermediate code purpose

: code optimization, hardware platform independent, finding errors that have been missed while syntax analysis process

+ Recent posts