[코테] 기초편 1-2 if 조건문

Bpius·2023년 4월 6일
0

알고리즘 입문

목록 보기
2/17
post-thumbnail

문제

미슐랭 가이드 평가원인 왕먹방씨는 서울의 어느 레스토랑에 들러 코스요리를 주문하고 점수를 체점하려 한다.
음식이 맛있으면 '1'을 맛이 없으면 '0'을 준다.
맛있는 음식이 연속으로 나왔을 경우 추가점수를 준다.
추가점수를 포함하여 연속으로 맛있는 음식이 나왔을 경우의 점수는, 2번 연속일 때는 2점을 3번연속이면 3점을 주는 형식이다.
n가지의 코스요리가 나왔을 때 점수를 반환하는 프로그램을 작성해보자.(1 < n <= 100)

예)
1 1 0 0 1 1 1 0 1 : 요리 순서
1 2 0 0 1 2 3 0 1 : 요리 점수
위와 같이 요리가 나왔을 때 점수는 다 합하여 10점이다.

문제 살펴보기

  1. n가지의 음식이 끝이 날 때까지 하나하나 확인을 해야하기에 '반복문'을 사용해야 하는데 어떤 식으로 반복문을 사용할 것인지 살펴본다.
  2. 반복문 안에서 경우의 수를 조건문으로 따져서 나눠본다. 조건문으로 나누었을 때 빠진 경우의 수가 존재하는지 혹은 많은 경우 중 우선되어야 하는 조건이 있는지 같이 살펴본다.
  3. 규칙성이 있다면 규칙성을 어떻게 코드로 표현할 것인지 살펴본다.

문제 풀어보기

  1. 반복문 한 번을 사용하여 앞에서부터 꺼내어 보면서,
  2. 총 3가지의 경우의 수를 조건문 안에서 세분화해본다. 먼저 '0'이 나올 경우와 '1'이 나올 경우와 마지막으로 '1'이 나올 경우 현재보다 앞의 수가 '1'인지 '0'인지 판단하여 가중치를 추가하는 경우로 볼 수 있다. 어차피 '0'이 나오면 가중치와 점수는 리셋되며 다음의 '1'부터 가중치가 다시금 추가되기에 '0'의 경우는 앞의 수를 염두하지 않아도 된다. if 조건문을 3가지로 나누어 판별하도록 한다.
  3. 이렇게 3가지로 나눈 조건문들은 현재 요리의 주어지는 조건에 따라 나뉘기에 순서는 따로 생각하지 않아도 된다.
  4. for문은 index 1부터 시작하도록 변경한다. 왜냐하면 현재의 요리 점수를 판단하기 위해서 앞의 요리가 맛이 없었는지 아니면 맛이 있었는지 체크해야 하며 맛이 있었다면 추가 점수가 포함된 요리인지 아닌지도 봐야한다. 하지만 반복문을 0부터 시작하게 되면 첫번째 요리의 앞 요리는 존재하지 않기 때문에 오류가 발생한다. 그리고 첫번째 요리는 '0'이면 0점을 '1'이면 1점을 명확하게 판별가능하기에 미리 체크배열을 만들어 넣어놓는다.
  5. 규칙성이 보인다. 앞의 요리가 맛있을 경우 앞의 요리 점수가 추가 점수가 된다. 즉 앞의 요리가 맛있었고 점수가 1점을 받았다면, 이전의 요리점수인 1점에서 현재 1점을 더하는 형식이다.
    그렇다면 세번째 맛있는 요리가 나왔다면 앞의 요리 점수 2점에 현재 1점을 더해 3점을 준다.

코드보기

n = int(input()) #n개의 요리를 입력받는다.
course = list(map(int, input().split())) #공백으로 구분하여 n개의 요리순서를 리스트로 입력받는다.

ch_P = [0] * n #0으로 초기화된 요리의 점수를 체크할 리스트를 만든다.
ch_P[0] = course[0] #첫 번째 요리의 점수를 넣는다.

for i in range(1, n):#첫 번째요리는 이미 체크배열에 포함되기에 2번째 요리부터 시작한다.
    if course[i - 1] == 1 and course[i] == 1:#1.현재 요리는 맛있고 앞의 요리도 맛있는 경우
        ch_P[i] = ch_P[i - 1] + course[i]
    elif course[i - 1] == 0 and course[i] == 1:#2.현재 요리는 맛있고 앞의 요리는 맛없는 경우
        ch_P[i] = 1
    elif course[i] == 0:#3.현재의 요리가 맛없는 경우(앞의 요리에 대한 판단은 필요없다)
        ch_P[i] = 0     #elif course[i] == 0: => else: 로 바꿔도 무방하다.
print(sum(ch_P))

입력:
9
1 1 0 0 1 1 1 0 1
출력:
10

체크 배열을 사용하는 것은 코딩테스트에서 필수라고 할 수 있을 만큼 중요한 부분이니 체크 배열과 문제에서 주어진 배열을 왔다갔다하며 사용할 수 있어야 한다

다른 풀이

단순하게 생각하면 점수는 연속성을 띄고 있어 1씩 증가하고 있다. 그 1씩 증가하는 점수를 연속적으로 총 점수에 더해주면 된다. 그리고 0점을 받을 경우 추가 점수는 다시 0으로 초기화만 잘해주면 매우 간단하게 끝낼 수 있다.
그러면 앞의 요리가 무엇이었는지 확인할 필요가 없으며 처음부터 끝까지 반복문이 한 번 작동되면서 추가 점수를 더할지 말지만 판단하는 코드를 작성하면 된다.
조건문도 딱 2가지로 나뉜다. 맛이 있었는지 없었는지.

다른 코드

course = list(map(int, input().split()))#n가지 요리 순서를 입력받는다.
sum_p = 0 #총 요리점수 초기화
add_p = 0 #추가 점수 초기화

for c in course:
    if c == 1:
        add_p += 1 #추가점수를 1점 더한다.
        sum_p += add_p #현재까지의 점수에 추가 점수를 더한다.
    else:
        add_p = 0 #요리가 맛이 없다면 추가점수를 초기화한다.
print(sum_p)

입력:
1 1 0 0 1 1 1 0 1
출력:
10
profile
데이터 굽는 타자기

0개의 댓글