조건문과 반복문

if

weather = input('오늘 날씨는 어때요? ') # input을 이용해 다음과 같이 작성 후 실행 시 커서가 ? 뒤에서 기다리고 있다. 사용자가 입력한 값은 문자열로 저장된다. 
if weather == '비' or weather == '눈':
    print('우산을 챙기세요.')
elif weather == '미세먼지':
    print('마스크를 챙기세요.')
else:
    print('준비물이 필요 없어요.')

temp = int(input('기온은 어때요? ')) # 정수형으로 입력값을 받고 싶을 때
if 30 <= temp:
    print('너무 더워요, 나가지 마세요.')
elif 10 <= temp and temp < 30:
    print('괜찮은 날씨에요.')
elif 0 <= temp < 10:
    print('외투를 챙기세요.')
else:
    print('너무 추워요, 나가지 마세요.')

 if 문을 통해 원하는 조건에 맞는 코드를 실행시킬 수 있다. 그리고 만약 처음 if의 조건에 성립하지 못했다면 elif를 만나고, 이러한 if 와 elif 모두의 조건에 성립할 수 없다면 else로 넘어가게 된다.

 

 위 코드에서 쓰인 input을 통해서 사용자가 입력한 입력값을 받을 수 있다.

 

for

for waiting_no in [0, 1, 2, 3, 4]:
    print("대기번호: {0}".format(waiting_no))

for waiting_no in range(5): # 0 부터 5 직전까지
    print('대기번호: {0}'.format(waiting_no))

for waiting_no in range(1, 5): # 1부터 5 직전까지
    print('대기번호: {0}'.format(waiting_no))

starbucks = ['아이언맨', '토르', '아이엠 그루트']

for customer in starbucks:
    print('{0}, 커피가 준비되었습니다.'.format(customer))

 for문을 통해서 원하는 만큼 코드를 반복적으로 실행할 수 있다.

 

students = [1, 2, 3, 4, 5]
print(students)
students = [i + 100 for i in students] # students의 각 요소를 i로 불러오면서 그 i에 100 더한 값을 students 리스트에 넣어라.
print(students)

students = ['Iron man', 'Thor', 'I am groot']
print(students)
students = [len(i) for i in students]
print(students)

students = ['Iron man', 'Thor', 'I am groot']
print(students)
students = [i.upper() for i in students]
print(students)

 이렇게 리스트 안에서 반복을 진행하여 각 요소의 값을 바꿀 수 있다. 첫 번째 students는 [101, 102, 103, 104, 105]가 되었을 것이다. 두 번째 students 리스트는 각 요소가 길이로 반환되어 [8, 4 ,10]이 된다. 세 번째 students는 모두 대문자로 바뀌게 된다.

 

while

customer = '토르'
index = 5
while index >= 1:
    print("{0}님, 커피가 준비 되었습니다. {1}번 남았습니다.".format(customer, index))
    index -= 1
    if index == 0:
        print('커피는 폐기처분되었습니다.')

 while 문은 조건을 만족하는 한, 계속해서 while 밑의 코드가 실행된다. 위 코드는 index가 점차 5, 4, 3, 2, 1로 줄어들면서 5번 반복하게 되고 0이 되면서 index >= 1을 만족하지 못하게 되기 때문에 while문이 종료된다.

 

customer = '아이언맨'
index = 1
while True:
    print('{0}님, 커피가 준비되었습니다. 호출 {1}번 했습니다.'.format(customer, index))
    index += 1

 이처럼 코드를 작성 시, 계속해서 True이기 때문에 무한 루프에 빠지게 된다. 터미널에서 index가 계속해서 증가하는 것을 목격할 수 있다.

무한루프, 터미널 창 클릭 후 ctrl + c(윈도우)로 빠져나올 수 있다.

 

customer = '토르'
person = 'Unknown'

while person != customer:
    print('{0}님, 커피가 준비되었습니다.'.format(customer))
    person = input('이름이 어떻게 되시나요? ')
    if person == '토르':
        print('네, 감사합니다.')

 위 코드에서는, input에서 사용자가 토르라고 입력하지 않으면 while문이 계속해서 실행된다. 사용자가 토르라고 입력하면 person = '토르'가 되고 if문을 실행하여 '네, 감사합니다.'를 실행시킨다. 그리고 person != customer는 False가 되어 while이 종료된다.

 

continue, break

absent = [2, 5]
noBook = [7]

for student in range(1, 11):
    if student in absent:
        continue # continue를 만나면 밑에 있는 문장을 실행하지 않고 다음으로 넘어간다. 즉 2나 5에서는 책 좀 읽어줘를 실행하지 않고 3과 6으로 넘어가게 된다.
    elif student in noBook:
        print('오늘 수업은 여기까지. {0}은 교무실로 따라와'.format(student))
        break # break를 만나면 곧바로 반복문이 종료된다. 즉 7에서는 8로 넘어가는 것이 아니라 반복문을 종료시킨다.
    print('{0}, 책 좀 읽어줘.'.format(student))

 continue를 만나면 밑의 코드를 무시하고 다음 차례로 넘어간다. 즉 if문에서 현재 student가 absent와 동일한 2라면 continue가 실행된다. 따라서 '책 좀 읽어줘'라는 print문이 실행되지 않고 student는 3으로 넘어가게 된다.

 

 break를 만나면 반복문을 종료시키게 된다. 만약 현재 student가 noBook과 동일한 7이라면 elif문의 코드가 실행되고 print문이 실행되면서 while이 멈추게 된다. break는 다음 차례로 넘어가는 continue와는 다르게 8로 넘어가지 않고 7에서 for문을 종료한다는 것이다.

 

퀴즈

'''
Quiz) 당신은 Cocoa 서비스를 이용하는 택시 기사님입니다.
50명의 승객과 매칭 기회가 있을 때, 총 탑승 승객 수를 구하는 프로그램을 작성하시오.

조건1 : 승객별 운행 소요 시간은 5분 ~ 50분 사이의 난수로 정해집니다.
조건2 : 당신은 소요 시간 5분 ~ 15분 사이의 승객만 매칭해야 합니다.

(출력문 예제)
[O] 1번째 손님 (소요시간 : 15분)
[ ] 2번째 손님 (소요시간 : 50분)
[O] 3번째 손님 (소요시간 : 5분)
...
[ ] 50번째 손님 (소요시간 : 16분)

총 탑승 승객 : 2 분
'''

 

# while 사용
currPassenger = 1
passCount = 0

while currPassenger < 51:
    leadTime = randint(5, 50)
    if 5 <= leadTime <= 15:
        print('[O] {0}번째 손님 (소요시간 : {1})'.format(currPassenger, leadTime))
        passCount += 1
    else:
        print('[ ] {0}번째 손님 (소요시간 : {1})'.format(currPassenger, leadTime))
    currPassenger += 1

print('총 탑승 승객 : {0} 분'.format(passCount))

 

count = 0

for i in range(1, 51):
    leadTime = randrange(5, 51)
    if 5 <= leadTime <= 15:
        print('[O] {0}번째 손님 (소요시간 : {1})'.format(i, leadTime))
        count += 1
    else:
        print('[ ] {0}번째 손님 (소요시간 : {1})'.format(i, leadTime))

print('총 탑승 승객 : {0} 분'.format(count))

'프로그래밍 > Python' 카테고리의 다른 글

리스트, 딕셔너리, 튜플, 세트  (0) 2022.03.09
문자열  (0) 2022.03.04
연산자  (0) 2022.03.03
자료형  (0) 2022.03.03
  • Manipulating Elements, 요소 조종하기

 자바스크립트의 기본적인 목적은 웹사이트에 동적인 움직임을 주기 위함이다. 그러므로 요소를 선택해서 변화시킬 수 있어야 한다. 앞에서 요소를 선택하기 위한 방법으로 querySelector, querySelectorAll, getElementById, get ElementsByClassName, getElementsByTagName을 썼었다.(get을 쓸 때 id를 제외하곤 Element에 s가 붙는다)

 

 이번에는 선택된 요소에 class를 추가하거나 제거하고, text는 어떻게 추가하는지 등등, 요소를 조종하는 방법을 알아보겠다.

 class를 조종하는 방법에는 기본적으로 add, remove, toggle가 있다.

 

- add : class에 원하는 class name을 추가한다.

class에서 athing 다음에 world가 추가되었다.

- remove : class에 원하는 class name을 제거한다.

class에서 athing 다음에 world가 제거되었다.

- toggle : class에 원하는 class name이 없다면 추가하고, 원하는 class name이 이미 존재한다면 제거한다. 그리고 전자의 경우에는 true를 출력하고, 후자의 경우에는 false를 출력한다.

전자의 경우, class name에 world가 없었기 때문에 world라는 name이 class에 추가되고, true가 출력된다. 곧바로 다시 toggle을 실행할 경우, 이미 class name에 world가 존재하기 때문에 world라는 name이 class에서 제거되고 false가 출력된다.

 

 요소 자체를 추가하고 제거하는 방법은 다음과 같다.

 

- createElement : 요소를 생성할 수 있다.

menu라는 변수에 a 태그 요소를 담았다.

- setAttribute : 요소에 속성과 그 속성의 값을 부여할 수 있다.

하이퍼링크 속성을 추가했다.

- appendChild : 해당 태그의 맨 끝에 요소를 추가한다.

span이라는 부모 요소 안의 마지막에, menu라는 자식 요소를 추가했다.
menu 요소가 추가되었다.

- textContent : 요소의 text를 제어할 수 있다.

- style : CSS 요소를 제어할 수 있다.

CSS 속성이 추가되었다.

 

 Quiz

아래 두가지 예제 코드의 차이점을 분별하시오.

 

1.

const something = document.createElement("p");

for (let i = 0; i < 5; i++) {
  something.textContent = i;
  document.body.appendChild(something);
}

 

2.

for (let i = 0; i < 5; i++) {
  const something = document.createElement("p");
  something.textContent = i;
  document.body.appendChild(something);
}

 

 전자의 경우, something이 1번 선언된다. i가 0에서 4까지 5번 반복할 때마다 append는 되지만 반복될 때마다 추가되는 것이 아니라 text가 바뀔 뿐이다. 풀어 쓰면 다음과 같다.

const something = document.createElement('p');

something.textContent = 0;
document.body.appendChild(something);

something.textContent = 1;
document.body.appendChild(something);

something.textContent = 2;
document.body.appendChild(something);

something.textContent = 3;
document.body.appendChild(something);

something.textContent = 4;
document.body.appendChild(something);

 something은 1번 선언되었기 때문에 하나의 something만 추가된다. 처음에는 0이 추가되었겠지만, 0이 1로 바뀌고 2로 바뀌고 3으로 바뀌고 4로 바뀌는 것이다. 웹에는 4만 출력된다.

 

 이와 다르게 후자의 경우는 something이 5번 선언된다. 그리고 중요한 것은, for문 안에서 선언된 변수는 1번 끝날 때마다 사라지고 다시 새로운 메모리를 할당 받는다. 따라서 i가 0에서 4까지 5번 반복할 동안 새로운 something이 선언된다. 풀어 쓰면 다음과 같다.

const something = document.createElement('p');
something.textContent = '0';
document.body.appendChild(something);

const something = document.createElement('p'); // 기존 something은 사라지고 새로운 something
something.textContent = '1';
document.body.appendChild(something);

const something = document.createElement('p'); // 기존 something은 사라지고 새로운 something
something.textContent = '2';
document.body.appendChild(something);

const something = document.createElement('p'); // 기존 something은 사라지고 새로운 something
something.textContent = '3';
document.body.appendChild(something);

const something = document.createElement('p'); // 기존 something은 사라지고 새로운 something
something.textContent = '4';
document.body.appendChild(something);

 something이 선언될 때마다 text가 바뀌고 body에 추가된다. 웹에는 0부터 4까지의 숫자가 출력된다.

내 이름을 영어표기로 나타내면 Shin SeungJun이다.

var name = 'Shin SeungJun'

console.log(name[0]);
console.log(name[1]);
console.log(name[2]);
console.log(name[3]);
console.log(name[4]);
console.log(name[5]);
console.log(name[6]);
console.log(name[7]);
console.log(name[8]);
console.log(name[9]);
console.log(name[10]);
console.log(name[11]);
console.log(name[12]);

내 이름을 이렇게 1자 1자씩 출려하려면 총 13이나 써야 하는데 엄청난 중복이 발생한다. 어질어질하다. 이렇게 중복을 통해 비효율적으로 코드를 짜는 것은 코드를 짜는 시간 뿐만 아니라 코드가 실행되는 시간에도 영향을 끼친다.

 

var name = 'Shin SeungJun';

for (var i = 0; i < name.length; i++;) {
	console.log(name[i]);
}

위와 같이 작성해도 출력되는 것은 맨 위의 코드와 같다. 더 짧고 보기에도 좋다.

 

반복문을 보면 크게 4가지 파트로 나뉜다.

for (1번 파트; 2번 파트; 4번 파트) {
  3번 파트
}

 - 1번 파트 : Initialization, for문의 초기 구동 코드이다. for문에서 '1번'만 실행되고 대체로 변수를 선언할 때 사용된다.

 - 2번 파트 : Conditional, 조건이 들어가는 결정적인 부분이다. 2번 파트의 조건에 맞지 않는다면 for문은 종료된다. 이 2번 파트의 성립 여부는 조건의 결과가 Falsy인지 Truthy인지에 따른다.

 - 3번 파트 : 실행되었으면 하는 코드를 짜는 부분이다.

 - 4번 파트 : Update, 3번 파트가 실행되고 난 후 실행되는 부분이다. 3번 파트가 여러 번 실행된다면 4번 파트 또한 여러번 실행된다. 물론 2번 파트도 매번 조건을 따져줘야 하니 동일하게 여러번 실행된다.

 - 실행 순서 : 1번 -> 2번 -> 3번 -> 4번

 

  • 반복문 중단하기
console.log('before for loop');

for(var i = 1; i < 11; i +=2) {
    if (i === 7) {
    break;
    } else {
    console.log(i);
    }
}

console.log('after for loop');

위의 코드는 기본적으로 1~9까지 숫자 중 홀수만 출력되게 하는 코드이다. 여기서 i가 7일 때 break를 사용하여 for문이 중단되도록 했다. 위의 코드는 1, 3, 5를 출력한다.

 

console.log('before for loop');

for (var i = 1; i < 11; i += 2) {
  if (i === 7) {
    continue;
  }
  console.log(i);
}

console.log('after for loop');

continue는 해당 코드를 건너 뛰고 다음부터 계속해라는 것이다. 즉 i가 7일 때는 건너 뛰고 9일 때는 정상적으로 실행된다. 위의 코드는 1, 3, 5, 9를 출력한다.

 

  • Quiz - 1

 - 반복문을 이용해 이름을 역순으로 출력하라.

var name = 'Shin SeungJun';

for (var i = name.length; ( 0 < i ) && ( i < name.length + 1 ); i--) {
    console.log(name[i-1]);
}

 와 생각보다 시간이 걸렸다.

 

 - 1번 파트에서 0의 index에 위치한 S부터가 아니라 마지막 n에서 시작할 수 있도록 i에 내 이름의 길이를 대입하였다.

 - 2번 파트에서 i는 13인데 단순히 i < name.length라고 해버리면 13보다 크니 조건을 만족하지 못해 for문이 중단된다. 따라서 +1을 해주어야 하는데 대신에 <을 <=으로 바꿔줘도 된다. 그리고 &&을 이용해 두 부등호 조건을 동시에 만족하도록 했다.

 - 3번 파트에서, index는 1이 아니라 0부터 시작하고 length는 1부터 길이를 측정해나가기 때문에 -1을 해주어야 서로 일치된다.

 - 4번 파트에서, 역순이기 때문에 i가 점점 작아져야 된다. 따라서 i--를 넣었다.

 

검색 없이 그냥 생각나는 대로 해본 건데 혹시 더 좋은 방법이 있다면 댓글로 알려주세요! 지식 공유에 감사드리겠습니다!

 

  • Quiz - 2

 - 반복문을 활용해 문자열의 홀수번째 글자만 출력하라.

var name = "0i1a2m3k4e5n";

for (i = 0; i < name.length; i += 2) {
    console.log(name[i], '| 홀수 위치: ' + (i+1));
    
}

의외로 1번보다 쉬웠다.

+ Recent posts