공대생의 비망록

[Google Code Jam][Qualification Round 2022] Punched Cards Swift 풀이 본문

Programming Language/Swift

[Google Code Jam][Qualification Round 2022] Punched Cards Swift 풀이

myungsup1250 2022. 4. 3. 11:41

취업 준비를 위해 Problem Solving 스킬을 연마하기 위해 관련 오픈 채팅방에 들어가 정보를 기웃거리던 차,

다양한 PS 스킬 챌린지가 있음을 알게 되었고, 100점 만점에 30점만 받아도 티셔츠 한 장은 준다길래 준비도 없이

Code Jam 이라는 챌린지에 참여하였다. Google에서 운영하는 프로그램이고 전세계의 많은 사람들이 참여하는 행사라고 한다.

구글에서 가장 길게 운영한 코딩 대회 Code Jam

실력과 준비 부족으로 많이 풀지는 못했지만 그래도 기록을 위해 남겨본다.

 

문제 링크 및 출처 : Google Code Jam

별로 중요하지 않은 풀이 시각은 지웠다. 출력 포맷을 맞추지 못해 2번 시도하여 풀이 성공.

1번 문제는 Punched Cards - 천공카드 이다.

테스트케이스셋은 1개이며 풀이 완료 시 11점을 준다.

Punched Cards 문제 설명 - 긴 영어 지문의 압박이 있지만 하나씩 읽어보면 그렇게 어려운 내용도 아니다.

문제 설명은 영어로 길게 나와있지만 특별한 내용은 없고, 천공 카드 모양을 출력해내면 된다.

입력 형식은 이렇게 주어진다.

T

R C

...

R C

T는 Testcase의 수이고, 그 뒤로 이어지는 R, C는 Row(열), Column()을 의미하며 T번 반복되어 입력된다.

테스트 셋은 1개만 주어지며 샘플 입력값과 이에 따른 출력값을 보여주고 있다.

문제를 해결하는 방법은 간단하다.

천공카드처럼 일종의 격자 무늬를 출력하고, 그 사이에는 점을 찍으면 된다.

그러나 처음 왼쪽 위 테두리에는 격자 무늬를 출력하지 말고 점을 찍으라고 한다.

왼쪽 위 귀퉁이를 잘라 천공 카드의 방향을 정했었나보다.

'+' 문자는 짝수 행(0, 2, 4, ...)과 짝수 열(0, 2, 4, ...)에 찍으면 되고, --> [ i % 2 == 0 && j % 2 == 0 ]

'-' 문자는 짝수 행(0, 2, 4, ...)과 홀수 열(1, 3, 5, ...)에 찍으면 되며, --> [ i % 2 == 0 && j % 2 == 1 ]

'|' 문자는 홀수 행(1, 3, 5, ...)과 짝수 열(0, 2, 4, ...)에 찍으면 된다, --> [ i % 2 == 1 && j % 2 == 0 ]

마지막 '.' 문자는 홀수 행, 홀수 열에 찍어주면 격자 무늬 사이사이에 잘 들어간다. --> [ i % 2 == 1 && j % 2 == 1 ]

 

그리고 추가 주문이었던 왼쪽 위 모서리는 인덱스 i, j가 2보다 작으면(0, 1)

'.' 문자를 출력하도록 하면 아주 손쉽게 해결.

아래는 위의 설명을 구현한 Swift 코드이다.

 

Problem Solved!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import Foundation
 
let cases: Int = Int(readLine()!)!
var input: [[Int]] = Array(repeating: Array(repeating: 0, count: 2), count: cases)
for i in 0..<cases {
    let tmp = readLine()!.split(separator: " ").map { Int($0)! }
    input[i][0= tmp[0]
    input[i][1= tmp[1]
}
for index in 0..<cases {
    var punchCard: [[String]] = Array(repeating: Array(repeating: "", count: input[index][1* 2 + 1), count: input[index][0* 2 + 1)
    print("Case #\(index + 1):")
    for i in 0..<input[index][0* 2 + 1 {
        for j in 0..<input[index][1* 2 + 1 {
            if i < 2 && j < 2 { // (0, 0), (0, 1), (1, 0), (1, 1)
                punchCard[i][j] = "."
            } else {
                if i % 2 == 0 {
                    if j % 2 == 0 {
                        punchCard[i][j] = "+"
                    } else {
                        punchCard[i][j] = "-"
                    }
                } else {
                    if j % 2 == 0 {
                        punchCard[i][j] = "|"
                    } else {
                        punchCard[i][j] = "."
                    }
                }
            }
            print("\(punchCard[i][j])", terminator: "")
        }
        print()
    }
}
 
cs
Comments