본문 바로가기
✨ Club/Ec.crew 코딩 스터디

Ec.crew 9회차 정기 모임 문제 (call by ..문제->30일백준에)

by 정람지 2022. 8. 29.

<솔민 - 백준 2309번 일곱 난쟁이>

from sys import stdin
import random
Nlist = []
for i in range(9):
    A = int(stdin.readline())
    Nlist.append(A)

# 난수 생성 함수
def numnum():
    while(1):
        num = random.randrange(1, 10) 
        num2 = random.randrange(1, 10)
        if num != num2:
            break
    alist = [num, num2]
    return alist

while(1):
    reList = Nlist
    numList = numnum()
    reList[numList[0]-1]= 0
    reList[numList[1]-1]= 0
    
    result = 0
    for cha in reList:# 100이면 브레이크
        result += cha
    if result == 100:
        break
        
reList.sort()

for cha in reList:
    print(cha)

 

될 거라고 생각했는데
안 된다
왜 안되는지 봤는데, 본문 중 relist = Nlist 부분이 내 생각대로 작동하지 않았다.
나는 Nlist는 계속 자신의 고유한 값을 유지할 것이라 생각했기 때문에, 반복할 때마다 이로 relist의 값을 리셋할 계획이었다.
그런데 실제로는 밑의 코드에서 relist의 값이 바뀌자 Nlist의 값도 바뀌어서 리셋이 되지 않았다..!(찍어봄)
 
파이썬은 인터프리터 언어라서 위에서 아래로 쭉 실행되는 거 아니었나?
다른 문제가 있나..? 혼란스러웠지만 타임어택 당하고 있어서 다른 코드를 짰다.
(근데 다음 문제에서 또 이 문제가 발생했다.)
from sys import stdin
Nlist = []
for i in range(9):
    A = int(stdin.readline())
    Nlist.append(A)
    
re ='no'
for i in range(8):
    if re == 'okay': # !!
        break
    for K in range(i+1, 9):
        if sum(Nlist)-Nlist[i]-Nlist[K] == 100:
            Nlist.pop(i)
            Nlist.pop(K-1)
            re= 'okay'
            break
            

Nlist.sort()

for cha in Nlist:
    print(cha)​

 # !! 부분은 반복문을 두번 탈출해야 한다는 점에서 추가한 부분이다!  이런 상황에 쓰면 좋을 듯하다.

i 는 무조건 K보다 크고, i 를 pop 하고 나면 인덱스번호가 하나씩 땡겨지기 때문에 k-1이라고 써야 한다!

 

Nlist = []
for i in range(9):
    A = int(stdin.readline())
    Nlist.append(A)

 

이 복잡한 식을! 이렇게! 바꿀 수 있음!

Nlist = [int(stdin.readline()) for _ in range(9)]

<수연 - 백준 2504번 괄호의 값>

from sys import stdin
Nlist = list(map(str,list(stdin.readline().replace('\n', ''))))

# ()   아니면 0
def this(a,b):
    Aa = 0
    if a =='(' and b==')':
        Aa = 2
    if a =='[' and b ==']':
        Aa = 3
    return Aa

# 숫자 처리 함수 1 (숫자)
def that(a,b,c):
    Aa = 0
    if a =='(' and type(b) == int and c ==')':
        Aa = b * 2
    if a =='[' and type(b) == int and c ==']':
        Aa = b * 3
    return Aa


# 숫자 처리 함수 2 숫자숫자
def thatthat(a,b):
    Aa = 0
    if type(a) == int and type(b) == int:
        Aa = a + b
    return Aa

# 처음단계 숫자 넣기
for i in range(len(Nlist)-1):
    This = this(Nlist[i],Nlist[i+1])
    if This != 0:
        Nlist[i] = This
        Nlist[i+1] = 'Nope'
    
while(1):
    try:
        Nlist.remove('Nope')
    except:
        break

while(1):
    A = len(Nlist) # !!!
    # 숫자 처리1
    for i in range(len(Nlist)-2): 
        That = that(Nlist[i],Nlist[i+1],Nlist[i+2])
        if That != 0:
            Nlist[i] = That
            Nlist[i+1] = 'Nope'
            Nlist[i+2] = 'Nope'
    while(1):
        try:
            Nlist.remove('Nope')
        except:
            break
    # 숫자 처리2
    for i in range(len(Nlist)-1):
        ThatThat = thatthat(Nlist[i],Nlist[i+1])
        if ThatThat != 0:
            Nlist[i] = ThatThat
            Nlist[i+1] = 'Nope'
    while(1):
        try:
            Nlist.remove('Nope')
        except:
            break
    if len(Nlist) == 1:
        break
    if A == len(Nlist): # !!!
        Nlist = [0]
        break

for cha in Nlist:
    print(cha)

음 완성했다! 파이썬 통합개발환경이랑 비주얼스튜디오코드에선 잘 돌아가지만~

백준 99퍼센트에서 틀렸습니다가 떴다~ 

하..이럴 땐 어디를 어떻게 고쳐야 하지...?

처음으로 질문을 올렸다

답변달아주셨으면

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

# !!!  이 두 부분

아까와 같은 이해되지 않는 부분이다.

A = len(Nlist)가 아니라 원래 A = Nlist 였다. 

중간에 Nlist의 값을 건드리는 코드가 있는데, 만약 이게 건드려지지 않는다면 이프문으로 반복문을 나갈 생각으로 

코드 이전 Nlist를 A에 저장해서 비교하려 했다.

그리고 아까와 같이 Nlist가 바뀌면 A 값도 같이 바뀌어버리는 일이 일어난다..

 

A에 B를 넣었는데,

B가 바뀌면,

A도 바뀌어버린다.

 

1. "A에 B를 넣었는데," 가 'B에 들어있었던 값을 넣은 것' 이라는 게 내 생각이었고

2. "A에 B를 넣었는데," 가 'B 자체를 넣은 것' 이라는 게 내가 짠 코드에서 일어나는 일인 것 같다.

 

이런 설정을 Call by reference / call by value 로 분류하는 것 같다.

 

Python은 Call by reference일까? Call by value일까?

C나 C++를 공부한 적이 있다면 Call by reference와 Call by value에 대해 들어본 적이 있을 것이다. 두 방식은 함수의 인자 전달 방식인데, 각각 어떤 타입을 전달하느냐에 차이를 둔다. 1. Call by value : 변.

aalphaca.tistory.com

1번이 call by value

2번이 Call by reference 인가?

 

근데 파이썬은 둘 다 아니고 Call by assignment 라고 한다.

 

놀랍게도

B = [1, 2]
A = B
B.pop(1)

print(A, B)

# [1] [1]  출력됨

이건 바뀌고

B = [1, 2]
A = B
B = [3, 4]

print(A, B)

# [1, 2] [3, 4] 출력됨

이건 안 바뀐다 

 

뭐냐 대체

 

 

일단

자야겠다