Menu
Coddy logo textTech

최우수 학생

Coddy R 여정의 논리와 흐름 섹션에 포함된 레슨. 64개 중 26번째.

challenge icon

챌린지

중급

TOP 명령을 추가하세요. 이전 단계의 모든 명령이 이전과 정확히 동일하게 작동하도록 유지하세요.

  • TOP: 평균이 가장 높은 학생과 해당 평균을 소수점 첫째 자리까지 대괄호 안에 표시하여 Top: 뒤에 이어서 응답합니다. 예: Top: ada (92.0). 성적이 없는 학생은 건너뜁니다. 평균이 같으면 이름이 알파벳순으로 먼저 오는 학생을 선택합니다. 성적이 있는 학생이 없으면 Top: none으로 응답합니다.

제공된 코드는 모든 입력 줄을 하나의 명령으로 gradebook()에 전달하고, 반환된 각 응답을 한 줄씩 출력합니다. 이름은 소문자로 된 한 단어이며, 입력에는 지금까지 설명한 명령만 포함됩니다.

직접 해보기

average_text <- function(scores) {
  if (length(scores) == 0) "no grades" else sprintf("%.1f", mean(scores))
}

gradebook <- function(commands) {
  grades <- list()
  replies <- c()
  for (cmd in commands) {
    parts <- strsplit(cmd, " ")[[1]]
    name <- parts[2]
    if (parts[1] == "ADD") {
      if (name %in% names(grades)) {
        replies <- c(replies, paste(name, "already exists"))
      } else {
        grades[[name]] <- numeric(0)
        replies <- c(replies, paste("added", name))
      }
    } else if (parts[1] == "GRADE") {
      if (!(name %in% names(grades))) {
        replies <- c(replies, paste("no student", name))
      } else {
        score <- as.numeric(parts[3])
        grades[[name]] <- c(grades[[name]], score)
        replies <- c(replies, paste("recorded", score, "for", name))
      }
    } else if (parts[1] == "AVG") {
      if (!(name %in% names(grades))) {
        replies <- c(replies, paste("no student", name))
      } else {
        replies <- c(replies, paste0(name, ": ", average_text(grades[[name]])))
      }
    } else if (parts[1] == "REPORT") {
      for (student in sort(names(grades))) {
        replies <- c(replies, paste0(student, ": ", average_text(grades[[student]])))
      }
      replies <- c(replies, paste("Class average:", average_text(unlist(grades))))
    }
  }
  replies
}

# 제공된 입력/출력 코드: 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
cat(gradebook(input), sep = "\n")

논리와 흐름의 모든 레슨

직접 연습해 보세요: 온라인 R 컴파일러