[백준 15079] Arggggggh! (C#, C++) - soo:bak
작성일 :
문제 링크
설명
시작 좌표에서 방향과 거리로 이루어진 이동 명령들을 순서대로 수행한 뒤 최종 좌표를 구하는 문제입니다.
접근법
방향은 8방향이 주어지고, 대각선 방향으로 이동할 때는 거리를 루트 2로 나눈 만큼 x와 y가 각각 변합니다. 방향 문자열에 N이 포함되면 y가 증가하고, S가 포함되면 감소합니다. 마찬가지로 E가 포함되면 x가 증가하고, W가 포함되면 감소합니다.
대각선인 경우 두 방향이 동시에 포함되므로, 이때 변화량을 루트 2로 나눠 실제 이동 거리를 조정합니다. 모든 명령을 처리한 뒤 최종 좌표를 출력합니다.
Code
C#
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
using System;
class Program {
static void Main() {
var n = int.Parse(Console.ReadLine()!);
var parts = Console.ReadLine()!.Split();
var x = double.Parse(parts[0]);
var y = double.Parse(parts[1]);
var rt2 = Math.Sqrt(2.0);
for (var i = 1; i < n; i++) {
var line = Console.ReadLine()!.Split();
var dir = line[0];
var d = double.Parse(line[1]);
var dx = 0.0;
var dy = 0.0;
if (dir.Contains('N')) dy += 1;
if (dir.Contains('S')) dy -= 1;
if (dir.Contains('E')) dx += 1;
if (dir.Contains('W')) dx -= 1;
if (dx != 0 && dy != 0) { dx /= rt2; dy /= rt2; }
x += dx * d;
y += dy * d;
}
Console.WriteLine($"{x:F8} {y:F8}");
}
}
C++
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
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n; cin >> n;
double x, y; cin >> x >> y;
double rt2 = sqrt(2.0);
for (int i = 1; i < n; i++) {
string dir; double d; cin >> dir >> d;
double dx = 0, dy = 0;
if (dir.find('N') != string::npos) dy += 1;
if (dir.find('S') != string::npos) dy -= 1;
if (dir.find('E') != string::npos) dx += 1;
if (dir.find('W') != string::npos) dx -= 1;
if (dx != 0 && dy != 0) { dx /= rt2; dy /= rt2; }
x += dx * d;
y += dy * d;
}
cout << fixed << setprecision(8) << x << " " << y << "\n";
return 0;
}