
BOJ 1009 분산처리
2023-05-25
1 min
창영이는 메모장에 ., \, /을 이용해서 도형을 그렸다.
각 문자는 그림에서 1*1크기의 단위 정사각형을 나타낸다.
.은 빈 칸을 나타내며, /는 정사각형의 왼쪽 아래 꼭짓점과 오른쪽 위 꼭짓점이 연결된 선분을, \은 왼쪽 위 꼭짓점과 오른쪽 아래 꼭짓점이 연결된 선분을 나타낸다.
창영이가 그린 도형의 넓이를 출력하는 프로그램을 작성하시오.
첫째 줄에 h와 w가 주어진다.
h는 그림의 높이, w는 너비이다. (2 ≤ h,w ≤ 100)
다음 h개 줄에는 창영이가 메모장에 그린 다각형이 주어진다.
창영이가 그린 다각형은 1개이고, 변과 변이 서로 교차하는 경우는 없고, 자기 자신과 접하는 경우도 없다.
편의상 / \ 기호를 변이라 하겠다.
문제의 그림을 관찰해 보면
변은 하나 당 0.5의 넓이를 가지고
변 내부에 있는 .은 1의 넓이를 가진다는 사실을 알 수 있다.
따라서 변 또는 변 내부에 있는 .을 만날 때마다 넓이를 증가시켜주면 된다.
그러기 위해서는 .이 변 내부에 있는지 외부에 있는지를 판별해야 하는데
본인은 변을 만나면 flag를 토글링 해 주고 flag가 true일 때 cnt를 증가시켜 해결하였다.
자세한 사항은 코드를 보면 이해가 될 것이다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");
int H = Integer.parseInt(str[0]);
int W = Integer.parseInt(str[1]);
str = new String[H];
for(int i = 0; i < H; i++) str[i] = br.readLine();
float area = 0;
for(int i = 0; i < H; i++) {
for(int j = 0; j < W; j++) {
if (str[i].charAt(j) == '/' || str[i].charAt(j) == '\\')
area += 0.5;
}
}
boolean flag = false;
int cnt = 0;
for(int i = 0; i < H; i++) {
for(int j = 0; j < W; j++) {
char ch = str[i].charAt(j);
if(ch == '\\' || ch == '/') flag = !flag;
else if(flag) cnt++;
}
}
System.out.println((int)(area + cnt));
}
}
#include <iostream>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int H, W;
cin >> H >> W;
string str[H];
for(int i = 0; i < H; i++) cin >> str[i];
float area = 0;
for(int i = 0; i < H; i++) {
for(int j = 0; j < W; j++) {
if(str[i][j] == '/' || str[i][j] == '\\')
area += 0.5;
}
}
bool flag = false;
int cnt = 0;
for(int i = 0; i < H; i++) {
for(int j = 0; j < W; j++) {
char ch = str[i][j];
if(ch == '\\' || ch == '/') flag = !flag;
else if(flag) cnt++;
}
}
cout << (int)(area + cnt) << "\n";
return 0;
}
fun main(args: Array<String>) {
var str = readLine()!!.split(" ")
val H = str[0]!!.toInt()
val W = str[1]!!.toInt()
str = ArrayList<String>()
for (i in 0 until H) str.add(readLine()!!)
var area: Float = 0F
for(i in 0 until H) {
for(j in 0 until W) {
if(str[i][j] == '/' || str[i][j] == '\\')
area += 0.5F
}
}
var flag: Boolean = false
var cnt = 0
for (i in 0 until H) {
for (j in 0 until W) {
val ch = str[i][j]
if (ch == '\\' || ch == '/') flag = !flag
else if (flag) cnt++
}
}
print((area + cnt).toInt())
}
def main():
str = input().split(' ')
H = int(str[0])
W = int(str[1])
str = list()
for i in range(0, H):
str.append(input())
area = 0
for i in range(0, H):
for j in range(0, W):
if str[i][j] == '/' or str[i][j] == '\\':
area += 0.5
flag = False
cnt = 0
for i in range(0, H):
for j in range(0, W):
ch = str[i][j]
if str[i][j] == '/' or str[i][j] == '\\':
flag = not flag
elif flag:
cnt += 1
print(int(area + cnt))
if __name__ == "__main__":
main()
import Foundation
func main() {
var str = (readLine()?.split(separator: " "))!
let H = Int(str[0])!
let W = Int(str[1])!
var str2 = Array<String>()
for i in 0..<H {
str2.append(readLine()!)
}
var area: Float = 0
for i in 0..<H {
for j in 0..<W {
let ch = str2[i][str2[i].index(str2[i].startIndex, offsetBy: j)]
if ch == "/" || ch == "\\" {
area += 0.5
}
}
}
var flag: Bool = false
var cnt: Float = 0
for i in 0..<H {
for j in 0..<W {
let ch = str2[i][str2[i].index(str2[i].startIndex, offsetBy: j)]
if (ch == "\\" || ch == "/") {
flag = !flag
} else if (flag) {
cnt += 1
}
}
}
print(Int(area + cnt))
}
main()
